在3个进程中使用MPI_散射

在3个进程中使用MPI_散射,mpi,Mpi,我是MPI新手,我的问题是,在其他进程从根接收其第I个值之前,根(例如rank-0)如何初始化其所有值(在数组中)? 例如: 在根目录中,我初始化:arr[0]=20,arr[1]=90,arr[2]=80 我的问题是,如果我有一个进程(数字-2),它在根进程之前启动一点。MPI_散射是否可以发送不正确的值而不是80 我如何确保root在其他人使用Scatter之前初始化所有内存 谢谢大家! MPI\u Scatter()是一个集合操作,因此MPI库会处理所有事情,并且集合操作的结果不取决于调用

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

我的问题是,如果我有一个进程(数字-2),它在根进程之前启动一点。MPI_散射是否可以发送不正确的值而不是80

我如何确保root在其他人使用Scatter之前初始化所有内存

谢谢大家!

MPI\u Scatter()
是一个集合操作,因此MPI库会处理所有事情,并且集合操作的结果不取决于调用的列组早于调用的列组

在这种特定情况下,非根列组将阻塞(至少),直到根列组调用
MPI\u Scatter()

这与MPI\u Send()/
MPI\u Recv()
没有什么不同。
MPI\u Recv()
在远程对等方
MPI\u Send()
匹配消息之前阻止调用。

指定

如果comm是一个内部通信程序,那么结果就好像根执行了n 发送操作,
MPI\u发送(sendbuf+i,sendcount,区段(sendtype),sendcount,sendtype,i,…)
,每个进程执行一个接收,
MPI\u Recv(recvbuf,recvcount,recvtype,i,…)

这意味着所有非根进程将等待其
recvcount
各自的元素传输完毕。这也称为同步例程(进程等待通信完成)

作为程序员,您有责任确保在调用任何通信例程时发送的数据是正确的,直到发送缓冲区再次可用(在这种情况下,直到
MPI\u Scatter
返回)。在仅MPI的程序中,这非常简单,只要在调用
MPI\u Scatter
之前放置初始化代码,因为每个进程都会按顺序执行程序

以下是基于文档示例5.11的示例:

MPI\u Comm Comm=MPI\u Comm\u WORLD;
国际格兰克,gsize,*sendbuf;
int root,rbuf[100];
MPI_Comm_秩(Comm和grank);
MPI_Comm_大小(Comm和gsize);
根=0;
if(grank==根){
sendbuf=(int*)malloc(gsize*100*sizeof(int));
//初始化sendbuf。此时其值均无效。
对于(int i=0;i
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);