MPI Barrier C ++

时间:2010-01-13 19:11:04

标签: mpi barrier

我想在Windows上使用MPI(MPICH2)。我写这个命令:

MPI_Barrier(MPI_COMM_WORLD);  

我希望它会阻止所有处理器,直到所有组成员都调用它。但事实并非如此。我添加了我的代码示意图:

int a;  
if(myrank == RootProc)  
   a = 4;  
MPI_Barrier(MPI_COMM_WORLD);  
cout << "My Rank = " << myrank << "\ta = " << a << endl;  

(使用2个处理器:)根处理器(0)正常运行,但排名为1的处理器不知道a变量,因此它显示-858993460而不是{{} 1}}。

任何人都可以帮助我吗? 问候

3 个答案:

答案 0 :(得分:7)

您只在进程0中分配a .MPI不共享内存,因此如果您希望进程1中的a获取值4,则需要调用{{来自流程0的1}}和来自流程1的MPI_Send

答案 1 :(得分:1)

变量a未初始化 - 这可能就是它显示该数字的原因。在MPI中,变量a在进程之间重复 - 因此a有两个值,其中一个未初始化。你想写:

int a = 4;
if (myrank == RootProc)
...

或者,或者,在Root(id 0)中执行MPI_send,在slave(id 1)中执行MPI_recv,因此root中的值也会在slave中设置。 / p>

注意:该代码触发了一个小警报,所以我需要检查一下,我会用更多信息编辑它。在那之前,未初始化的值对您来说肯定是个问题。 好的,我已经检查了事实 - 你的代码没有正确缩进,我错过了丢失的{}。屏障现在看起来很好,虽然您发布的片段不会做太多,并且不是障碍的一个很好的例子,因为奴隶直接输入它,而根将设置变量的值为4然后输入它。为了测试它实际上是否有效,你可能想要在其中一个进程中使用某种睡眠机制 - 这将产生(希望它是正确的术语)另一个进程,阻止它打印cout直到睡眠结束了。

答案 2 :(得分:1)

阻止不够,您必须将数据发送到其他进程(进程之间内存不共享)。

要在所有流程之间共享数据使用

int MPI_Bcast(void* buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm )

所以在你的情况下:

MPI_Bcast(&a, 1, MPI_INT, 0, MPI_COMM_WORLD);

这里你将一个由&amp;表格进程0指向的整数发送给所有其他整数。 // MPI_Bcast是发件人用于根进程,接收器用于非根进程

您还可以通过以下方式将一些数据发送到specyfic进程:

int MPI_Send( void *buf, int count, MPI_Datatype datatype, int dest, 
              int tag, MPI_Comm comm )

然后收到:

int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)