【发布时间】:2019-04-20 09:57:12
【问题描述】:
我在这段代码中使用 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 发送,但我不知道发生了什么。
【问题讨论】:
-
您是如何运行您的应用程序的?你对你的输出排序了吗?因为输出可以在没有附加标志的情况下交错到 mpirun。
-
我以这种方式运行应用程序
mpirun -np 3 ./app -
请edit将这些重要信息放入问题中。另外,哇,人们还在新代码中使用甚至是 pre-ISO C?这有什么正当理由吗?我认为很多人无法从 C89/C90 继续前进已经够糟糕了,但是......