【发布时间】:2016-04-27 14:37:14
【问题描述】:
如果不同的进程向某个通信器组中的其他进程广播不同的值,会发生什么?
以下面两个进程运行的程序为例,
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 具有相同的值,因此使 x 的打印值都为 0。但是如果进程 0 的运行速度比进程 1 慢,进程 0 的值与进程 1 的值相同,最后为 1。我描述的事情真的发生了吗?
【问题讨论】:
-
严格来说,此代码不符合标准,因为并非所有通信器进程都使用相同的根参数调用
MPI_Bcast()(这是 MPI 标准明确要求的)。因此,行为是未定义的:任何事情都可能发生。
标签: mpi