2017-02-25 9 views
1

私はMPIを学び始めました。私が得た問題の理由は私には分かりません。出力の0が処理されないのはなぜですか?

#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <mpi.h> 


int main(int argc, char *argv[]) 
{ 
    int myRank, size; 
    double myLeftBound, myRightBound; 
    MPI_Status status1; 
    MPI_Status status2; 
    MPI_Request request1; 
    MPI_Request request2; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &myRank); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 


    if (myRank == 0) 
    { 
     int counter; 

     for (counter = size - 1; counter >= 0; counter--) 
     { 
      myLeftBound = 0; 
      myRightBound = 1; 
      MPI_Isend(&myLeftBound, 1, MPI_DOUBLE, counter, 2 * counter, MPI_COMM_WORLD, &request1); 
      MPI_Isend(&myRightBound, 1, MPI_DOUBLE, counter, 2 * counter + 1, MPI_COMM_WORLD, &request2); 
     } 
    } 

    MPI_Recv(&myLeftBound, 1, MPI_DOUBLE, 0, myRank * 2, MPI_COMM_WORLD, &status1); 
    MPI_Recv(&myRightBound, 1, MPI_DOUBLE, 0, myRank * 2 + 1, MPI_COMM_WORLD, &status2); 
    printf ("I received my left boundary %f\n, I'm %d\n", myLeftBound, myRank); 
    MPI_Finalize(); 
    return 0; 
} 

一つは

(プロセスの数が4である)私は私の左境界0.000000

を受け、次のされて、私は私が私の左の境界0.000000を受けた1

、私は2

は、私は、私は3

アサーションがファイルに失敗してる私の左境界0.000000

を受けたのsrc/MPID/CH3/SRC/ch3u_buffer.c行77時:FALSE memcpyの引数メモリは範囲の重複、dst_ = 0x7ffcc26963d0 SRC_ = 0x7ffcc26963d0 len_ = 8

内部ABORT - プロセス0

プロセス0が悪いのか?

答えて

0

送信元のバッファに受信することはできません。技術的には、非ブロッキング送信操作を完了する前に送信バッファの一部を変更しないでください。送信操作も完了する必要があります。つまり、複数の要求オブジェクトに格納する必要があります。

とにかく、MPI_Bcastを使用し、後でMPIを経験したときに非ブロック操作を残してください。何らかの理由で、彼らはしばしば過度に使用され、初心者によって間違って使用されます。

関連する問題