【问题标题】:Local sender-receiver reduction operation MPI本地发送者-接收者缩减操作 MPI
【发布时间】:2016-02-12 14:10:17
【问题描述】:

我有一个 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-3 引入了邻居(稀疏)集合,但不包括归约。无论如何,这是一个使用MPI_Sendrecv 简单实现的操作。

标签: c++ mpi


【解决方案1】:

在这种情况下,您可以使用MPI_Sendrecv。基本上就是为这种情况做的。

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

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

【讨论】:

  • 是的,编码可能不正确。这是一个粗略的“插图”来展示这个想法。我会检查 SendRecv。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-04-03
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多