如果不同的进程向某个通信器组的其他进程广播不同的值,会发生什么?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