与 printf() 相比,MPI 函数似乎乱序执行
MPI functions appear to execute out of order compared to printf()
我有一个使用 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
好像是 rank 0 做了 printf
,然后它从 rank 1 获取数据,然后它完成了……然后 rank 1 做了 printf
?但是因为rank 1在真正把数据发给rank 0之前还要做printf
,怎么可能rank 0已经拿到数据完成了呢?
屏幕输出由 OS 缓冲,然后必须通过 ssh 隧道到达启动 MPI 运行 的进程。结果,屏幕输出可以按各种顺序到达。基本上没有办法获得整齐有序的屏幕输出,除了将所有文本发送到进程零并以正确的顺序从那里打印。
我有一个使用 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
好像是 rank 0 做了 printf
,然后它从 rank 1 获取数据,然后它完成了……然后 rank 1 做了 printf
?但是因为rank 1在真正把数据发给rank 0之前还要做printf
,怎么可能rank 0已经拿到数据完成了呢?
屏幕输出由 OS 缓冲,然后必须通过 ssh 隧道到达启动 MPI 运行 的进程。结果,屏幕输出可以按各种顺序到达。基本上没有办法获得整齐有序的屏幕输出,除了将所有文本发送到进程零并以正确的顺序从那里打印。