我正在对许多进程进行一堆MPI_Isend调用来分发一些数据。在每次调用时,我将生成的MPI_Request存储在一个数组中。在完成所有MPI_Isend调用之后,我对请求执行了MPI_Waitall。
消息的顺序很重要,即我希望每个进程都接收消息 与我发送的订单相同。这是因为对于我正在发送的每条数据,我还使用单独的MPI_Isend调用来分发一些元数据。我认为这是一个坏主意,但我不知道另一种选择。显然,元数据必须在数据之前到达,因此我需要FIFO保证。这是我正在做的事情吗?
我不关心以不同顺序接收数据的不同进程,我只对以正确顺序获取数据的各个进程感兴趣。这记录在哪里?我正在使用MPICH2实现。
我想分发一系列带有与之关联的数据的双打数组,但“标签”太有限了。
答案 0 :(得分:1)
在MPI中,您可以保证同一个通讯器/标签/排名组合中的所有消息都会按照发送的顺序接收。
例如,在此示例中:
if (rank == 0)
MPI_Send(buf, 10, MPI_INT, 1, 0, MPI_COMM_WORLD);
else if (rank == 1)
MPI_Recv(buf, 10, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
第1级收到的所有邮件的顺序与从第0级发送的顺序相同。非阻塞版本(MPI_ISEND
/ MPI_IRECV
)也是如此。< / p>
如果您使用不同的标签,则情况并非如此。例如:
if (rank == 0) {
MPI_Send(buf, 10, MPI_INT, 1, 0, MPI_COMM_WORLD);
MPI_Send(buf, 10, MPI_INT, 1, 1, MPI_COMM_WORLD);
} else if (rank == 1) {
MPI_Recv(buf, 10, MPI_INT, 1, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Recv(buf, 10, MPI_INT, 1, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
不一定会按照发送邮件的顺序接收邮件,因为它们使用不同的标签。
有关详细信息,请参阅MPI-3.0 Standard(第40页)的第3.5节。
答案 1 :(得分:0)
AFAIK,如果recv
呼叫可以匹配多条消息,MPI会保证每个发送方的消息顺序(但不同发送方之间的顺序不是),无论标记是什么,无论发送方式是什么(发送模式仅影响发件人的代码)
常见的情况是一个进程(发送方)继续向另一个进程(接收方)发送数据,因此这里的顺序是FIFO。
显然,这是每个传播者的保证(因为它包含了recv
的匹配)。在不同的传播者中似乎没有任何保证人。
因此,韦斯利布兰德的答案是不正确的。在他的例子中,订单始终是保证FIFO。