c - 发送数组以按顺序排名

标签 c parallel-processing mpi

我有一些流程。每个进程都有一个数组“A”expect from rank 0,其中数组 A 的 expect 也有一个数组 B。

我需要每个进程将A数组发送到rank 0的B数组,我需要发送和接收按顺序进行,即先将rank 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。

最佳答案

函数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 &

关于c - 发送数组以按顺序排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28921795/

相关文章:

c - 如何刷新 Linux 中地址空间区域的 CPU 缓存?

matlab - 如何并行运行 MATLAB 脚本(即在多个内核上且不使用 parfor)?

python - 如何用现有字典填充架子

c++ - 如何在 C++ 中用鼠标移动对象?

python - 无法在 python 中使用带有 gobject-introspection 的库构建

c - while 循环中的段错误 (C)

c++ - 是否可以关闭 gcc 的自动并行化?

python - 运行并行 KMeans 时为 "index N is out of bounds for axis 0 with size N",而顺序 KMeans 工作正常

types - 带 MPI 的派生数据类型

c++ - 是否可以决定哪个函数在 MPI 或任何其他 C++ 库中的哪个处理器上运行?