1. ホーム
  2. c

[解決済み] MPI_Send による int 配列の送信

2022-02-05 01:57:34

質問

MPI初心者です。 int 配列は MPI_Send を別プロセスに転送します。

// Code example

      int main(int argc, char ** argv)
      {
       int * array;
       int tag=1;
       int size;
       int rank;
       MPI_Status status;
       MPI_Init (&argc,&argv);
       MPI_Comm_size (MPI_COMM_WORLD,&size);
       MPI_Comm_rank (MPI_COMM_WORLD,&rank);
       if (rank == 0)
       {
         array = malloc (10 * sizeof(int)); // Array of 10 elements
         if (!array) // error checking
         {
          MPI_Abort (MPI_COMM_WORLD,1);
         }
       MPI_Send(&array,10,MPI_INT,1,tag,MPI_COMM_WORLD);
       }
       if (rank == 1)
       {
        MPI_Recv (&array,10,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
        // more code here
       }
      MPI_Finalize();
// More code here

3つほどお伺いしたいことがあります。

  1. 別のプロセスランクにアレイを送信するのは安全な方法ですか?
  2. の構文的に正しい使い方ですか? MPI_Send()MPI_Recv() ?
  3. あまり手間をかけずに配列を送受信する良い方法はないでしょうか?

どんなことでもご相談ください。

解決方法は?

配列を動的に確保するのであれば、送受信はそうなります。

MPI_Send(array,10,MPI_INT,1,tag,MPI_COMM_WORLD);

そして

MPI_Recv (array,10,MPI_INT,0,tag,MPI_COMM_WORLD,&status);

(ただし、配列は array であって &array )

コメントにもあるように、MPIの理解は問題ないようですが、C言語のポインタの使い方を見直すとよいでしょう。

編集:Gillesが言及したように、配列にデータを受信するすべてのプロセスは、それらのためにメモリも割り当てる必要があります。(多分、最初にデータのサイズを送信して、受信者が配列を割り当てるサイズを知ることができます? これを行うには他の方法がありますが、これは簡単な説明です)