2016-04-27 159 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。

相關問題