2010-01-13 92 views
0

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

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

任何人都可以帮助我吗?
Regards

回答

6

你只有在过程中0分配a MPI不共享内存,所以如果你想在进程1的a拿到4的值,你需要调用从进程0 MPI_SendMPI_Recv从过程1

+0

谢谢。这是真的,但我有另一个问题。据我所知,在所有组成员调用它之前,屏障阻止调用者,但是我测试并看到进程1传递此函数(通过编写句子cout)和根进程(0)在屏障之前。有什么问题?谢谢 – aryan 2010-01-13 21:35:15

+0

你不能相信来自不同进程的输出语句的顺序。如果您不确定,请确保您的时钟同步并在屏障之前和之后输出'time()'。 – eduffy 2010-01-14 01:57:54

+0

不要指望不同处理器上的时钟处于如此接近的同步状态,以至于它们报告的时间允许您正确地对输出语句进行排序。 MPI_Barrier同步进程,而不是时钟。 – 2010-01-14 02:31:20

1

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

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

,或者,做根(ID 0)的MPI_send,并在从(ID 1),所以在根值的MPI_recv也被设置在从。

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

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为根过程发送器和非根进程接收机

您还可以通过一些数据发送到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)