gpt4 book ai didi

c - MPI-- 进程的逻辑循环

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:40 25 4
gpt4 key购买 nike

我正在构建一个简单的应用程序,它在三个迭代中构建一个逻辑循环,然后打印结果。首先,我正在使用阻塞发送和接收,从进程 0,我正在使用发送和接收,直到最后的 n-1 进程,它发送到进程 0。在进程 0 中,我在 main 中有这个代码:

int i;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD,&numtasks);
MPI_Comm_rank(MPI_COMM_WORLD;&myrank);



if(myrank==0){


for(i=0;i<3;i++){
MPI_Send(msg,MPI_CHAR,myrank+1,99,MPI_COMM_WORLD);
MPI_Recv(msg,100,MPI_CHAR, numtasks-1,99,MPI_COMM_WORLD,&status);
printf("hello");
}
}
else if(myrank==(numtasks-1)){
MPI_Recv(msg,100,MPI_CHAR,numtasks-2,99,MPI_COMM_WORLD,&status);
MPI_Send(msg,100,MPI_CHAR,0,99,MPI_COMM_WORLD);

}
else{
MPI_Recv(msg,100,MPI_CHAR,myrank-1,99,MPI_COMM_WORLD,&status);
MPI_Send(msg,100,MPI_CHAR,myrank+1,99,MPI_COMM_WORLD);
}

我现在正在尝试获得 3 个结果,对吗?但我仍然只得到一个。其余代码很简单,对于 0 以外的进程,它们从 myrank-1 接收(myrank 是实际进程的数量)并发送到 rank+1 ......我还是不明白......谢谢你的想法。

最佳答案

MPI_Send可以选择等待接收方调用MPI_Recv。因此,如果您的所有进程都是通过调用 MPI_Send 开始的,那么它们都将挂起。尝试改用 MPI_Isend,然后使用 MPI_Waitall 检查是否已收到每条消息。

编辑:我不知道我是如何设法忽略第一个 if block 中有一个循环的事实……*尴尬*。我想我太关注 MPI 部分了。尝试在没有循环的情况下运行代码(但循环体仍然存在);然后它应该按预期工作(例如,n = 3 个进程):

  1. 0 发送给 1 并等待从 2 接收
  2. 1 从 0 接收,发送给 2,然后退出
  3. 2 从 1 接收,发送给 0,然后退出
  4. 0 从 2 接收消息,打印消息,然后退出

现在,再次重新插入循环。将发生完全相同的事情,除了进程 0 将在步骤 4 之后继续并发送给进程 1,它已经退出。也尝试在 else ifelse block 中插入循环,或者从 if block 中删除循环并包装整个 if/else if/else 在循环中。

关于c - MPI-- 进程的逻辑循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5129040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com