连续 MPI 非阻塞调用

Posted

技术标签:

【中文标题】连续 MPI 非阻塞调用【英文标题】:Consecutive MPI non-blocking calls 【发布时间】:2021-12-13 06:44:32 【问题描述】:

我一直想知道 MPI 运行时如何区分多个非阻塞调用(在同一个通信世界中)之间的消息?

例如:假设我们有多个 Iallgather 操作。

...
auto res1 = MPI_Iallgather(... , MPI_COMM_WORLD, req[0]);
auto res2 = MPI_Iallgather(... , MPI_COMM_WORLD, req[1]);
MPI_Waitall(2, req, MPI_STATUSES_IGNORE);
...

Isend/Irecv 例程中,有一个int tag 参数。但是对于其他非阻塞调用,没有标签参数。 当我们创建一个MPI_Request 对象时,它会创建一个唯一的标签吗?

【问题讨论】:

【参考方案1】:

正如您所观察到的,由于没有标签,因此如果两个进程以不同的顺序发出Iallgathers,则可能会出现问题。因此,所有进程都需要以相同的顺序发布非阻塞集合。 request 对象在这里没有任何帮助,因为第一个请求对应于您首先在什么进程上执行的任何操作,因此您可能会出现不匹配的情况。

【讨论】:

以上是关于连续 MPI 非阻塞调用的主要内容,如果未能解决你的问题,请参考以下文章

MPI 将阻塞转换为非阻塞问题

MPI 非阻塞发送/接收

非阻塞 MPI 和会合协议

发送多个 mpi 非阻塞发送 - 它会保留发送的顺序吗

MPI 非阻塞发送和接收排序

MPI 非阻塞发送/接收中的请求数组