使用带有3个进程的MPI_Scatter

时间:2017-09-03 19:27:23

标签: mpi

我是MPI的新手,我的问题是在其他进程从根接收到第i个值之前,根(例如rank-0)如何初始化其所有值(在数组中)? 例如: 在root中我初始化:arr [0] = 20,arr [1] = 90,arr [2] = 80。

我的问题是,如果我有例如在根进程之前稍微开始的进程(数字-2)。 MPI_Scatter可以发送错误的值而不是80吗?

我怎样才能保证root在其他人使用Scatter之前初始化所有内存?

谢谢!

2 个答案:

答案 0 :(得分:1)

MPI standard指定

  

如果comm是一个interracommunicator,结果就像根执行 n   发送操作MPI_Send(sendbuf+i, sendcount, extent(sendtype), sendcount, sendtype, i,...),每个进程执行一次接收MPI_Recv(recvbuf, recvcount, recvtype, i,...)

这意味着所有非根进程都将等待,直到它们发送了recvcount个相应的元素。这也称为同步例程(该过程一直等到通信完成)。

您作为程序员负责确保在您调用任何通信例程时直到发送缓冲区再次可用(在此情况下,直到MPI_Scatter返回),所发送的数据是正确的。在仅MPI程序中,这就像在调用MPI_Scatter之前放置初始化代码一样简单,因为每个进程都按顺序执行程序。

以下是基于文档 Example 5.11

的示例
MPI_Comm comm = MPI_COMM_WORLD;
int grank, gsize,*sendbuf;
int root, rbuf[100];

MPI_Comm_rank( comm, &grank );    
MPI_Comm_size(comm, &gsize);

root = 0;
if( grank == root ) {
   sendbuf = (int *)malloc(gsize*100*sizeof(int));
   // Initialize sendbuf. None of its values are valid at this point.
   for( int i = 0; i < gsize * 100; i++ )
      sendbuf[i] = i;
}
rbuf = (int *)malloc(100*sizeof(int));
// Distribute sendbuf data
// At the root process, all sendbuf values are valid
// In non-root processes, sendbuf argument is ignored.
MPI_Scatter(sendbuf, 100, MPI_INT, rbuf, 100, MPI_INT, root, comm);

答案 1 :(得分:0)

MPI_Scatter()是一个集体操作,因此MPI库确实处理了所有事情,集体操作的结果并不取决于之前调用的等级。

在这种特定情况下,非根等级将阻止(至少)直到根等级调用MPI_Scatter()

这与MPI_Send() / MPI_Recv()没有什么不同。 MPI_Recv()阻止在远程对等方MPI_Send()之前调用匹配的消息。

相关问题