-1

我想在 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而不是4.

谁能帮我?
问候

4

3 回答 3

7

您只是a在进程 0 中分配。MPI 不共享内存,因此如果您希望a进程 1 中的值 4,则需要MPI_Send从进程 0 和MPI_Recv进程 1 调用。

于 2010-01-13T19:16:40.503 回答
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);

在这里,您将一个由 & 一个表单进程 0 指向的整数发送给所有其他整数。// MPI_Bcast 是根进程的发送者和非根进程的接收者

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

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)
于 2010-05-04T00:49:22.090 回答
1

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

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

或者,或者,MPI_send在根 (id 0) 中执行一个操作MPI_recv,在从属 (id 1) 中执行一个操作,这样根中的值也会在从属中设置。

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

于 2010-01-13T19:15:53.427 回答