首页 > 解决方案 > 发送 MPI_COMM_NULL 作为参数时 MPI_Comm_dup() 不起作用

问题描述

我用过的地方

MPI_Comm_dup(row_comm, &bigger_row_comm);

我注意到它在row_comm等于时会导致“致命”错误MPI_COMM_NULL。我改变了它

if (row_comm != MPI_COMM_NULL)
    MPI_Comm_dup(row_comm, &bigger_row_comm);
else
    bigger_row_comm = MPI_COMM_NULL;

现在它起作用了。我使用 MPICH 并在其文档中的条目中找到了这一点MPI_Comm_dup

一个常见的错误是在调用中使用空通信器(甚至不允许在调用中MPI_Comm_rank)。

我想知道这种行为是否是标准的,我应该期望其他实现也这样做。为什么他们不像我那样处理它?人们期望 MPI_COMM_NULL 的副本是 MPI_COMM_NULL。

标签: mpimpich

解决方案


MPI 标准没有规定当MPI_Comm_dup使用空通信器调用时应该做什么(参见第 6.4.2 节)。因此,不能假设允许这样的调用,尤其是因为MPI_COMM_NULL它被定义为“用于无效通信器句柄的值”。

对于它的价值,OpenMPI 4.0.1 还将调用视为错误。


推荐阅读