问题描述
据我所知you can freely mix blocking and non-blocking MPI operations on both ends of the communication,这意味着MPI_Ircv(...)可以接收MPI_Send(...)。
也就是说,我不能将MPI_Bcast(...)与MPI_Ibcast(...)一起使用,如下例所示:
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
MPI_Init(NULL,NULL); int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD,&world_rank);
MPI_Request req;
int i;
if (world_rank == 0) {
i = 126;
MPI_Ibcast(&i,1,MPI_INT,MPI_COMM_WORLD,&req);
// do other stuff
MPI_Wait(&req,MPI_STATUS_IGnorE);
} else {
MPI_Bcast(&i,MPI_COMM_WORLD);
}
MPI_Barrier(MPI_COMM_WORLD);
return 0;
}
这应该起作用吗?我在MPI文档中找不到与此信息有关的任何信息。
我在GCC 10.2.1中使用MPICH 3.3.2。
解决方法
您问题的简单答案:否,该代码不起作用。
长答案:我们无法匹配阻止和不阻止集体呼叫,因为
-
集体操作没有
tag
参数。将标签用于集体操作可能会阻止某些硬件优化。因此无法像点对点操作中那样进行消息匹配。 -
在阻塞/非阻塞情况下,实现可能会使用不同的通信算法进行优化。例如,可以对阻塞的集体操作进行优化,以最大程度地缩短完成时间。
这在MPI标准3.1中已明确定义:
与点对点操作不同,无阻塞集体操作可以 与阻止集体行动不符,集体 操作没有标签参数。所有进程都必须调用 集合操作(阻塞和非阻塞)的顺序相同 传播者。特别是,一旦流程召集了集体 操作,通信器中的所有其他过程最终必须 称为同一集体行动,没有其他集体行动 两者之间使用相同的沟通工具。这与 阻止线程中的集体操作的排序规则 环境。
理性。匹配阻塞和非阻塞集体操作是 不允许,因为实现可能使用不同的方法 两种情况下的通信算法。集体封锁 可以优化操作以最大程度地减少完成时间,而 畅通无阻的集体行动可能会平衡完成时间 CPU开销和异步进度。标签的使用 集体操作可能会阻止某些硬件优化。 (结束 的理由。)
希望这会有所帮助!