MPI_Isend上是否存在FIFO每进程FIFO保证?

时间:2014-01-03 17:46:31

标签: mpi fifo

我正在对许多进程进行一堆MPI_Isend调用来分发一些数据。在每次调用时,我将生成的MPI_Request存储在一个数组中。在完成所有MPI_Isend调用之后,我对请求执行了MPI_Waitall。

消息的顺序很重要,即我希望每个进程都接收消息 与我发送的订单相同。这是因为对于我正在发送的每条数据,我还使用单独的MPI_Isend调用来分发一些元数据。我认为这是一个坏主意,但我不知道另一种选择。显然,元数据必须在数据之前到达,因此我需要FIFO保证。这是我正在做的事情吗?

我不关心以不同顺序接收数据的不同进程,我只对以正确顺序获取数据的各个进程感兴趣。这记录在哪里?我正在使用MPICH2实现。

我想分发一系列带有与之关联的数据的双打数组,但“标签”太有限了。

2 个答案:

答案 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。