发送数组以按顺序排名

时间:2015-03-08 00:38:48

标签: c parallel-processing mpi

我有一些流程。每个进程都有一个数组“A”,期望从秩0开始,其中数组A的期望也有一个数组B.

我需要每个进程将A数组发送到秩0的B数组。我需要按顺序完成发送和接收,即第一个等级0将数组A的内容发送到B,然后等级1,等级2等。

我的问题是,每个阵列A的大小不一样!以下是我的代码中尝试执行此操作的部分:

   if(my_rank!=0)
   {
      MPI_Send(&A, Asize, MPI_INT, 0, rank, MPI_COMM_WORLD);
   }

   if(my_rank==0)
   {
      for(i=1; i<number_of_process; i++)
      {
         MPI_Recv(&B, n, MPI_INT, i, i, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
      }
   }

然后我需要将内容从rank0 A传输到B,因为这是唯一未传输的内容。不幸的是,这会产生运行时错误:

=====================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   EXIT CODE: 139
=   CLEANING UP REMAINING PROCESSES
=   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
=====================================================================================
APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)

阵列声明:

int *A = (int*) malloc( sizeof(int)*n );
int *B = (int*) malloc( sizeof(int)*n );

但阵列A有时会小于n。

1 个答案:

答案 0 :(得分:1)

函数MPI_Send() and MPI_Recv()都期望作为参数指向包含数据的区域的指针:

你给它们指针本身的地址(即&A)而不是区域的地址(即由A的值指示)。结果,指针将被覆盖,堆栈将被破坏,因此您的分段错误。

纠正如下:

  MPI_Send(A, Asize, MPI_INT, 0, rank, MPI_COMM_WORLD);  // no &
  ...
  MPI_Recv(B, n, MPI_INT, i, i, MPI_COMM_WORLD, MPI_STATUS_IGNORE);  // no &