2016-04-27 157 views
0

如果不同的进程向某个通信器组的其他进程广播不同的值,会发生什么?MPI_Bcast是否会导致数据不确定性的问题?

以通过两个过程作为示例运行下面的程序,

int rank, size; 
int x; 
MPI_Init(&argc, &argv); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
MPI_Comm_size(MPI_COMM_WORLD, &size); 
if (rank == 0) 
{ 
    x = 0; 
    MPI_Bcast(&x, 1, MPI_INT, 0, MPI_COMM_WORLD); 
} 
else if (rank==1) 
{ 
    x = 1; 
    MPI_Bcast(&x, 1, MPI_INT, 1, MPI_COMM_WORLD); 
} 
cout << "Process " << rank << "'s value is:" << x << endl; 
MPI_Finalize(); 

我认为有可能在程序结束时的打印结果的不同的可能性。如果进程0比进程1运行得更快,它将比进程1更早地广播它的值,因此进程1在进程0开始广播它的值时与进程0具有相同的值,因此使得打印值x都为0。过程0比过程1运行得慢,过程0将具有与过程1相同的值,在过程1结束时为1。我描述的事实际上发生了吗?

+1

严格地说,这个代码是不符合的,因为通信器并不是所有进程都调用具有相同根参数(MPI标准明确要求的)MPI_Bcast()。因此,行为是不确定的:任何事情都可能发生。 – Gilles

回答

1

我觉得你不太了解MPI_Bcast功能。其实MPI_Bcast是一种MPI集体沟通方法,其中属于某个沟通者的每个进程都需要涉及。因此,对于MPI_Bcast的功能,不仅要发送要发送的数据的过程,还要接收广播数据的过程需要同步调用该功能,以实现所有参与过程中数据广播的目标。

在你给定的程序,特别是这部分:

if (rank == 0) 
{ 
    x = 0; 
    MPI_Bcast(&x, 1, MPI_INT, 0, MPI_COMM_WORLD); 
} 
else if (rank==1) 
{ 
    x = 1; 
    MPI_Bcast(&x, 1, MPI_INT, 1, MPI_COMM_WORLD); 
} 

我想你的意思是让进程,其等级为0(进程0)只广播其x到其他进程的价值,但在你的代码,当你使用if-else段时,进程0调用MPI_Bcast函数。那么其他流程做了什么?对于等级为1的进程(进程1),它不调用进程0调用的同一MPI_Bcast函数,但它调用另一个MPI_Bcast函数来广播它的x值(根参数在这两个MPI_Bcast函数之间不同)。因此,如果只有进程0调用MPI_Bcast函数,它实际上只是将x的值广播给它自己,并且存储在其他进程中的x的值根本不会受到影响。此外,它与过程1的条件相同。因此,在程序中,每个过程的x的打印值应与最初分配的相同,并且不会出现您所关心的数据不确定性问题。

1

MPI_Bcast主要用于使rank 0 [root]可以计算值并广播它们,因此每个人都以相同的值开始。

这里是一个有效的用法:

int x; 

// not all ranks may get the same time value ... 
srand(time(NULL)); 

// so we must get the value once ... 
if (rank == 0) 
    x = rand(); 

// and broadcast it here ... 
MPI_Bcast(&x,1,MPI_INT,0,MPI_COMM_WORLD); 

通知从您的使用情况的差异。 相同MPI_Bcast呼叫全部行列。根将做一个发送,其他人将做recv。

相关问题