我有一个使用MPI的非常奇怪的代码,其中的语句似乎以错误的顺序执行。具体来说,MPI语句似乎在
printf
即使它在代码中位于它之后。
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv)
{
int numProcs, rank, data;
MPI_Status status;
// Initialize the MPI library
MPI_Init(&argc, &argv);
// Get entity identification
MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
// Do something different in each a rank
if (rank == 0) {
// Get the data from rank 1
// with tag 0
printf("rank = %d\tGet the data from rank 1 with tag 0\n", rank);
MPI_Recv(&data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &status);
} else if (rank == 1) {
// Send the data to rank 0
// with tag 0
printf("rank = %d\tSend the data to rank 0 with tag 0\n", rank);
MPI_Send(&data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
}
printf("rank %d finishing\n", rank);
// Clean up the MPI library
MPI_Finalize();
return 0;
}
这是正在生成的输出:
$ mpirun -n 2 ./a.out
rank = 0 Get the data from rank 1 with tag 0
rank 0 finishing
rank = 1 Send the data to rank 0 with tag 0
rank 1 finishing
排名0似乎起作用
输出函数
,然后它从秩1中获取数据,然后它完成,然后秩1执行
输出函数
? 但由于排名1必须做到
输出函数
在它真正将数据发送到秩0之前,秩0怎么可能已经获得了数据并完成了?