如果不同的進程向某個通信器組的其他進程廣播不同的值,會發生什麼?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。我描述的事實際上發生了嗎?
嚴格地說,這個代碼是不符合的,因爲通信器並不是所有進程都調用具有相同根參數(MPI標準明確要求的)MPI_Bcast()。因此,行爲是不確定的:任何事情都可能發生。 – Gilles