0

私の目標は、プロセス 0 からプロセス 1 にベクトルを送信することでした。次に、プロセス 1 からプロセス 0 にベクトルを送信します。

私の実装から2つの質問があります。

1- プロセス 1 からプロセス 0 への返送に時間がかかるのはなぜですか? 最初の send-recv には合計で ~1e-4 秒かかり、2 番目の send-recv には ~1 秒かかります。

2- ベクトルのサイズを大きくすると、次のエラーが発生します。その問題の理由は何ですか?


mpirun は、ノード server1 上の PID 11248 のプロセス ランク 0 がシグナル 11 (セグメンテーション違反) で終了したことを検出しました。

私の更新されたC++コードは次のとおりです

#include <mpi.h>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <boost/timer/timer.hpp>
#include <math.h>
using namespace std;
int main(int argc, char** argv) {
    // Initialize the MPI environment
    MPI_Init(NULL, NULL);
    MPI_Request request, request2,request3,request4;

    MPI_Status status;

    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    srand( world_rank );

    int n = 1e3;


    double *myvector = new double[n];
    if (world_rank==0){
        myvector[n-1] = 1;
    }
    MPI_Barrier (MPI_COMM_WORLD);

    if (world_rank==0){

        boost::timer::cpu_timer timer;

        MPI_Isend(myvector, n, MPI_DOUBLE , 1, 0, MPI_COMM_WORLD, &request);

        boost::timer::cpu_times elapsedTime1 = timer.elapsed();
        cout << "  Wallclock time on Process 1:"
                << elapsedTime1.wall / 1e9 << " (sec)" << endl;

        MPI_Irecv(myvector, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD, &request4);
        MPI_Wait(&request4, &status);

        printf("Test if data is recieved from node 1: %1.0f\n",myvector[n-1]);

        boost::timer::cpu_times elapsedTime2 = timer.elapsed();
        cout <<"  Wallclock time on Process 1:"
                << elapsedTime2.wall / 1e9 << " (sec)" << endl;

    }else{
        boost::timer::cpu_timer timer;

        MPI_Irecv(myvector, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &request2);
        MPI_Wait(&request2, &status);

        boost::timer::cpu_times elapsedTime1 = timer.elapsed();
                cout << "  Wallclock time on Process 2:"
                        << elapsedTime1.wall / 1e9 << " (sec)" << endl;

        printf("Test if data is recieved from node 0: %1.0f\n",myvector[n-1]);
        myvector[n-1] = 2;
        MPI_Isend(myvector, n, MPI_DOUBLE , 0, 0, MPI_COMM_WORLD, &request3);
        boost::timer::cpu_times elapsedTime2 = timer.elapsed();
                cout<< "  Wallclock time on Process 2:"
                        << elapsedTime1.wall / 1e9 << " (sec)" << endl;

    }

    MPI_Finalize();

}

出力は次のとおりです。プロセス 1:2.484e-05 のウォールクロック時間 (秒)

プロセス 2 のウォールクロック時間: 0.000125325 (秒)

ノード 0 からデータが受信されるかどうかをテストします: 1

プロセス 2 のウォールクロック時間: 0.000125325 (秒)

ノード 1 からデータが受信されるかどうかをテストします: 2

プロセス 1 のウォールクロック時間: 1.00133 (秒)

4

1 に答える 1