gpt4 book ai didi

c - MPI 发送和接收的顺序不正确

转载 作者:行者123 更新时间:2023-11-30 16:25:33 25 4
gpt4 key购买 nike

我在此代码中使用 MPI,这是进程之间的消息传递环,进程 n 从 n-1 接收消息并将其发送到 n+1。

#include "mpi.h"
#include <stdio.h>

int main(argc,argv)
int argc;
char **argv;
{

int MyProc, size,tag=1;
char msg='A', msg_recpt;
MPI_Status status;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &MyProc);
MPI_Comm_size(MPI_COMM_WORLD, &size);

printf("Process # %d started \n", MyProc);
MPI_Barrier(MPI_COMM_WORLD);


if(MyProc == 0){
printf("Sending: Proc #%d to Proc #%d\n",MyProc,(MyProc +1 )%size);
MPI_Send(&msg, 1, MPI_CHAR, (MyProc +1 )%size,tag, MPI_COMM_WORLD);
MPI_Recv(&msg_recpt, 1, MPI_CHAR, (MyProc + size - 1)%size, tag, MPI_COMM_WORLD, &status);
printf("Receving: Proc #%d from Proc #%d\n",MyProc,(MyProc + size - 1)%size);
}else{
printf("Receving: Proc #%d de Proc #%d\n",MyProc,(MyProc + size - 1)%size);
MPI_Recv(&msg_recpt, 1, MPI_CHAR, (MyProc + size - 1)%size, tag, MPI_COMM_WORLD, &status);
MPI_Send(&msg, 1, MPI_CHAR, (MyProc +1 )%size,tag, MPI_COMM_WORLD);
printf("Sending: Proc #%d from Proc #%d\n",MyProc,(MyProc +1 )%size);
}

printf("Finishing proc %d\n", MyProc);

MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize();
}

我得到这个输出:

Process # 0 started 
Process # 1 started
Process # 2 started
Sending: Proc #0 to Proc #1
Receving: Proc #0 from Proc #2
Finishing proc 0
Receving: Proc #1 de Proc #0
Sending: Proc #1 from Proc #2
Finishing proc 1
Receving: Proc #2 de Proc #1
Sending: Proc #2 from Proc #0
Finishing proc 2

有些事情不正确,因为进程 0 接收消息出现在进程 2 发送消息之前,我认为进程 0 应该等到进程 2 发送,但我不知道发生了什么。

最佳答案

你不能假设因为 stdout 给了你一个命令,那就是操作的顺序。

你唯一能说的是,在每个等级上,顺序都是受到尊重的,但其余的则不然。 MPI 如何聚合每个等级的标准输出取决于实现(我认为英特尔 MPI 有一个我找不到的标志,它会减慢执行速度)。

如果你想确保操作的顺序,你必须使用标准输出以外的东西,看看 MPE、vampir...

关于c - MPI 发送和接收的顺序不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53350946/

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