c++ - 本地发送者-接收者缩减操作 MPI

标签 c++ mpi

我有一个周期性的 MPI proc 笛卡尔网格,对于 4 个 proc,布局看起来像这样

 __________________________
|       |        |        |
|  0    |   1    |   2    |
|_______|________|_______ |
|       |        |        |
|  3    |   4    |   5    |
|_______|________|________|

其中数字是通讯器中 proc 的等级。 在计算过程中,所有的proc'必须向它的左邻居发送一个数字,这个数字应该与左邻居已经有的数字相加:

int a[2];
a[0] = calculateSomething1();
a[1] = calculateSomething2(); 
int tempA;
MPI_Request recv_request, send_request;

//Revceive from the right neighbour
MPI_Irecv(&tempA, 1, MPI_INT, myMPI.getRightNeigh(), 0, Cart_comm, &recv_request);

//Send to the left neighbour
MPI_Isend(&a[0], 1, MPI_INT, myMPI.getLeftNeigh(), 0, Cart_comm, &send_request);
MPI_Status status;

MPI_Wait(&recv_request, &status);
MPI_Wait(&send_request, &status);

//now I have to do something like this
a[1] += tempA;

我想知道是否存在一种仅针对一对发送方-接收方的“本地”缩减操作,或者唯一的解决方案是拥有“本地”通信器并在那里使用集体操作?

最佳答案

在这种情况下,您可以使用 MPI_Sendrecv。它基本上是为这种情况而制作的。

我认为您不会从使用集合体中获得任何好处。

顺便说一句:您的代码可能不正确。您正在从本地堆栈变量 &a[0] 发送。您必须在退出作用域并重新使用a 的内存之前完成通信send_request。这是通过某种形式的 MPI_Wait(all) 或成功的 MPI_Test 完成的。

关于c++ - 本地发送者-接收者缩减操作 MPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35364680/

相关文章:

c++ - 平均值、RMS 和过零数数组 c++

mpi - 什么时候使用 MPI_BUFFER_ATTACH?

c++ - 混合 openMP/MPI 代码中多线程发送/接收错误

c++ - MPI_send 和 MPI_Resc - 更新单个数组值

MPI_(I)NEIGHBOR_ALLTOALLW() 中的 MPI_Aint 与 MPI_(I)ALLTOALLW() 中的 int

使用 MPI_Comm_spawn 创建子进程

c++ - Schwarz 计数器和可变参数模板

C++编码标准#define头文件

c++ - 如何生成 vector 组合

c++ - 指针困惑