OpenMPI MPI_Send与Intel MPI MPI_Send

kur*_*ian 1 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();
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

英特尔MPI结果

# mpiexec.hydra -n 2 /root/helloworld_intel

Calling MPI_Send() from rank 0 to 0
Run Code Online (Sandbox Code Playgroud)

卡在MPI_Send。

Gil*_*det 5

MPI_Send()在发布匹配的收据之前假定会返回是不正确的,因此您的代码相对于MPI标准而言是不正确的,并且您很幸运它没有与Open MPI一起挂起。

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

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

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

最后但并非最不重要的一点是,buffer参数是cmdand not &cmd