2016-04-11 18 views
2

私のコードはどのように動作するのですか?スレーブノードはいくつかの計算を実行し、各ノードは対応する線形配列Φを有する値minEを送る。ルートノードは2つの値を受信します。私はどのように格納するのか把握しようとしていますN-1(スレーブの数)ph0ルートノードです。私はのphiを2D配列に受け入れようとしましたが、うまくいきません。あるいは、私はそれを間違ってやっているかもしれない。したがって、このコードは最後のノードからphiの値を受け取って送信します。非ブロッキングの側面は、あなたのために重要である場合MPI Cで送受信する配列

if (world_rank == root) { 
    for(i=1; i<world_size; i++) { 
     MPI_Irecv(&local_minE[i], 1, MPI_FLOAT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &rcv_request[i]); 
     MPI_Irecv(phi, len, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &rcv_request[i]); 
     MPI_Waitall(world_size-1, &rcv_request[1], &status[1]); 
    } 
    MPI_Waitall(world_size-1, &rcv_request[1], &status[1]); 
} 
else { 
    //after computations, node will send a value, minE with a corresponding array phi 
    MPI_Isend(&minE, 1, MPI_FLOAT, 0, 1, MPI_COMM_WORLD,&send_request[0]); 
    MPI_Isend(phi, len, MPI_INT, root, 1, MPI_COMM_WORLD, &send_request[0]); 
    MPI_Wait(&send_request[0], &status[0]); 
} 
+0

実際に実行されるサンプルを作成できますか? – Chiel

+0

私の問題を明確にした:) – Rowel

答えて

3

まず第一に、あなたはMPI_Gather()あるいはMPI_Igather()を使用して検討すべきです。

あなたのコードスニペットに関して、基本的な問題があります。受信側でphiをまだ受信していない間に使用しようとします。コードを変更して、まず待機部分を作成し、コピー/トランスポーズ部分を実行した後でなければなりません。

int *trphi = malloc(len*world_size*sizeof(int)); 
for(i=0; i<world_size; i++) { 
    MPI_Irecv(trphi[i], len, MPI_INT, i, 1, MPI_COMM_WORLD, &rcv_request[i]); 
} 
MPI_Waitall(world_size-1, &rcv_request[1], &status[1]); 
for(i=1; i<world_size; i++) { 
    for(j=0; j<len; j++) { 
     rphi[j][i] = trphi[i][j]; 
    } 
} 
for(j=0; j<len; j++) { 
    rphi[j][O] = phi[j]; 
} 
free(trphi); 

をしかし、再び、はるかにうまくそれを行うには(おそらくも良いMPI_DatatypeMPI_Gather()を見て:

これは、このようになります。

関連する問題