首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MPI中用非阻塞通信确认消息接收

在MPI中用非阻塞通信确认消息接收
EN

Stack Overflow用户
提问于 2016-10-25 15:35:14
回答 1查看 264关注 0票数 1

前提:许多职级需要向其他职级发送数据。其他军衔是

( 1)通常是整个通信器大小的一小部分

2)接收方不知道

因此,接收者不知道他们将接收多少条消息,也不知道从哪里接收到消息。

可能的解决方案如下

代码语言:javascript
复制
Isend all messages

Busy wait
    Probe & Recv messages
    When all Isends complete
         start IBarrier
    exit when IBarrier completes

通过让每个等级在其自己的发送完成后到达屏障,当所有级别的出站消息“在空中”时,障碍就结束了。

问题:MPI3.1标准第3.7.3节指出,使用MPI_Test或MPI_Wait完成发送并不意味着相应的操作已经完成,而只是表示缓冲区可以自由重用。

这显然导致了比赛条件,有一个悬岛,没有相应的Irecv。接收级别不再侦听,因为在消息可以与Irecv匹配之前到达IBarrier。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-26 03:56:22

从您暴露问题的方式来看,在我看来,在一开始就没有同步问题。因此,我提出的解决办法如下:

代码语言:javascript
复制
int sendSizes[size]; // size of the messages I'll send to each process
// Populate sendSizes here
/* ........ */

int recvSizes[size]; // size of the messages I'll receive from each process
MPI_Alltoall( sendSizes, 1, MPI_INT, recvSizes, 1, MPI_INT, MPI_COMM_WORLD );

// Now I know exactly what to expect from each process
// I could use a Irecv - Isend - Waitall approach
// but a MPI_Alltoallv might be more appropriated
int sendDispls[size], recvDispls[size];
sendDispls[0] = recvDispls[0] = 0;
for ( int i = 0; i < size - 1; i++ ) {
    sendDispls[i+1] = sendDispls[i] + sendSizes[i];
    recvDispls[i+1] = recvDispls[i] + recvSizes[i];
}
int fullSendSize = sendDispls[size-1] + sendSizes[size-1];
double sendBuff[fullSendSize];
// Populate the sending buffer here
/* ........ */

int fullRecvSize = recvDispls[size-1] + recvSizes[size-1];
double recvBuff[fullRecvSize];
MPI_Alltoallv( sendBuff, sendSizes, sendDispls, MPI_DOUBLE,
               recvBuff, recvSizes, recvDispls, MPI_DOUBLE,
               MPI_COMM_WORLD );

正如您所看到的,解决方案的基础是首先使用对MPI_Alltoall()的调用,让每个进程都知道对其他每个进程的期望。在进程同步方面,这种全局通信不应该成为一个问题,因为所有进程都应该在一开始就同步。

一旦完成这一任务,最初的问题就变得微不足道。可以通过使用MPI_Irecv()循环、MPI_Isend()循环和最终MPI_Waitall()来解决这个问题。但是,我在这里使用了一个对MPI_Alltoallv()的调用来做同样的事情,只是为了表明这也是可能的。简单地说,在现实生活中,发送和接收缓冲区可能已经存在,只有位移需要计算才能指向正确的位置,从而避免了不必要的数据副本。

但是,这个部分现在是微不足道的,所以应该由您来决定在代码的上下文中什么是最好的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40244097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档