MPI_Bcast所有进程都发送给其余所有进程

时间:2018-11-18 11:33:28

标签: c mpi

我正在尝试使每个进程都以这种方式广播到所有其他进程

#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);

1 个答案:

答案 0 :(得分:0)

MPI_Bcast()是一项集体行动。通信器中的所有MPI任务都必须使用匹配的签名(例如count和datatype)来调用它,并且它们都必须使用相同的root任务。

您的代码可能会阻塞在MPI_Bcast()中(由于消息非常小,所以这不太可能,尽管您不应认为这是理所当然的)。否则,由于没有匹配的发送操作,它肯定会在MPI_Recv()中阻塞。

集体和点对点操作在MPI中是独立的。

您可能需要循环MPI_Bcast(),或者如果您有足够的内存来接收所有等级的消息,则可以一次使用MPI_Alltoallv()