我正在尝试使每个进程都以这种方式广播到所有其他进程
#include "mpi.h"
#include <stdio.h>
int main(argc,argv)
int argc;
char **argv;
{
int MyProc, size,tag=1;
int 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);
MPI_Bcast( &MyProc, 1, MPI_INT, MyProc, MPI_COMM_WORLD);
MPI_Recv(&msg_recpt, 1, MPI_CHAR, MyProc, tag, MPI_COMM_WORLD, &status);
printf("Proc #%d recv'd message from Proc #%d \n", MyProc, msg_recpt) ;
printf("Finishing proc %d\n", MyProc);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize();
}
我需要在MPI_Recv
之后显示消息的发件人进程,但我认为它被阻止了执行未到printf("Finishing proc %d\n", MyProc);
答案 0 :(得分:0)
MPI_Bcast()
是一项集体行动。通信器中的所有MPI任务都必须使用匹配的签名(例如count和datatype)来调用它,并且它们都必须使用相同的root
任务。
您的代码可能会阻塞在MPI_Bcast()
中(由于消息非常小,所以这不太可能,尽管您不应认为这是理所当然的)。否则,由于没有匹配的发送操作,它肯定会在MPI_Recv()
中阻塞。
集体和点对点操作在MPI中是独立的。
您可能需要循环MPI_Bcast()
,或者如果您有足够的内存来接收所有等级的消息,则可以一次使用MPI_Alltoallv()
。