首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenMPI MPI_Send诉Intel MPI MPI_Send

OpenMPI MPI_Send诉Intel MPI MPI_Send
EN

Stack Overflow用户
提问于 2019-02-14 02:43:56
回答 1查看 507关注 0票数 2

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

我从不同的论坛得到了使用MPI_Isend而不是来自不同论坛的MPi_Send的建议。但这需要大量的工作来修改代码。在英特尔的MPI中有什么解决办法让它像在OpenMPI中一样工作吗?可能是一些旗帜或增加缓冲区或其他东西。提前谢谢你的回答。

代码语言:javascript
复制
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结果

代码语言:javascript
复制
# 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结果

代码语言:javascript
复制
# mpiexec.hydra -n 2 /root/helloworld_intel

Calling MPI_Send() from rank 0 to 0

卡在MPI_Send了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-14 04:06:05

假设MPI_Send()在发布匹配的接收之前返回是不正确的,所以您的代码在MPI标准方面是不正确的,您很幸运它没有挂在Open中。

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

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

FWIW,MPI_Bcast(cmd, ...)是一个更适合这里,假设所有级别已经知道字符串长度加上NUL终结者。

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54682472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档