我想在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}}。
任何人都可以帮助我吗? 问候
答案 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)