c++ - OpenMPI MPI_Send 与 Intel MPI MPI_Send

标签 c++ mpi openmpi intel-mpi

我有一个使用 openmpi 编译和运行的代码。最近,我想使用 Intel MPI 运行同样的代码。但是我的代码没有按预期工作。 我深入研究了代码,发现 MPI_Send 在两个实现中的行为不同。

我从不同的论坛得到了使用 MPI_Isend 而不是来自不同论坛的 MPi_Send 的建议。但这需要大量工作来修改代码。英特尔 MPI 中是否有任何变通方法可以使其像在 OpenMPI 中一样工作。可能是一些标志或增加缓冲区或其他东西。预先感谢您的回答。

int main(int argc, char **argv) {
    int numRanks;
    int rank;
    char cmd[] = "Hello world";
    MPI_Status status;

    MPI_Init (&argc, &argv);
    MPI_Comm_size (MPI_COMM_WORLD, &numRanks);
    MPI_Comm_rank (MPI_COMM_WORLD, &rank);
    if(rank == 0) {
            for (int i=0; i< numRanks; i++) {
                    printf("Calling MPI_Send() from rank %d to %d\n", rank, i);
                  MPI_Send(&cmd,sizeof(cmd),MPI_CHAR,i,MPI_TAG,MPI_COMM_WORLD);
                    printf("Returned from MPI_Send()\n");
            }
    }
    MPI_Recv(&cmd,sizeof(cmd),MPI_CHAR,0,MPI_TAG,MPI_COMM_WORLD,&status);
    printf("%d receieved from 0 %s\n", rank, cmd);

    MPI_Finalize();
}

OpenMPI 结果

# mpirun --allow-run-as-root  -n 2  helloworld_openmpi
Calling MPI_Send() from rank 0 to 0
Returned from MPI_Send()
Calling MPI_Send() from rank 0 to 1
Returned from MPI_Send()
0 receieved from 0 Hello world
1 receieved from 0 Hello world

英特尔 MPI 结果

# mpiexec.hydra -n 2 /root/helloworld_intel

Calling MPI_Send() from rank 0 to 0

卡在 MPI_Send。

最佳答案

假定 MPI_Send() 会在匹配的接收被发布之前返回是不正确的,所以你的代码对于 MPI 标准是不正确的,你很幸运它没有挂起 Open MPI .

MPI 实现通常急于发送 small 消息,因此 MPI_Send() 可以立即返回,但这是标准和“小”消息未强制要求的实现选择取决于库版本、您使用的互连和其他因素。

这里唯一安全且可移植的选择是编写正确的代码。

FWIW,MPI_Bcast(cmd, ...) 更适合这里,假设所有等级都已经知道字符串长度加上 NUL 终止符。

最后但同样重要的是,缓冲区参数是 cmd 而不是 &cmd

关于c++ - OpenMPI MPI_Send 与 Intel MPI MPI_Send,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54682472/

相关文章:

c++ - dopen() : "failed to map segment from shared object" when not running as root

python - 关于带有掩码的 OpenCV GrabCut 分割上的标签?

CUDA MPI 性能瓶颈

c - 具有 MPI_Type_create_struct 段错误的 MPI Bcast

c - MPI_Scatter - 未按预期工作

c++ - 如何从从节点向主节点发送动态数组

c# - 如何使用 Winforms C# 或 C++ .Net 修改 jpg 文件中的方向 exif 标记而不更改文件中的任何其他内容

C++ 使用 shared_ptr 连续分配内存

具有复杂命令的 Python 子进程

c++ - MPI_ERR_TRUNCATE : On Broadcast