我注意到当我有一个死锁的MPI程序时,例如 wait.c
#include <stdio.h>
#include <mpi.h>
int main(int argc, char * argv[])
{
int taskID = -1;
int NTasks = -1;
int a = 11;
int b = 22;
MPI_Status Stat;
/* MPI Initializations */
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &taskID);
MPI_Comm_size(MPI_COMM_WORLD, &NTasks);
if(taskID == 0)
MPI_Send(&a, 1, MPI_INT, 1, 66, MPI_COMM_WORLD);
else //if(taskID == 1)
MPI_Recv(&b, 1, MPI_INT, 0, 66, MPI_COMM_WORLD, &Stat);
printf("Task %i : a: %i b: %in", taskID, a, b);
MPI_Finalize();
return 0;
}
当我使用 mvapich2-2.1 库(它本身是使用 gcc-4.9.2 编译的)编译wait.c
并运行它(例如 mpirun -np 4 ./a.out
) 我注意到(通过 top
),所有 4 个处理器都以 100% 的速度运行。
当我使用 openmpi-1.6 库(它本身是使用 gcc-4.9.2 编译的)编译wait.c
并运行它(例如 mpirun -np 4 ./a.out
),我注意到(通过 top
),2 个处理器以 100% 的速度运行,2 个处理器以 0% 的速度运行。
据推测,0%的2是完成通信的。
问:为什么openmpi和mvapich2之间的CPU使用率有差异? 这是预期的行为吗?当 CPU 使用率为 100% 时,是否通过不断检查是否正在发送消息?
两种实现都忙于等待MPI_Recv()
以最大程度地减少延迟。这就解释了为什么在两个 MPI 实现中的任何一个中,等级 2 和 3 都处于 100%。
现在,显然排名 0 和 1 进入MPI_Finalize()
调用,这是两种实现的不同之处:mvapich2 忙等待,而 openmpi 没有。
回答您的问题:是的,他们在检查是否已收到消息并且这是预期行为时处于 100%。
如果你不在 InfiniBand,你可以通过将strace
附加到其中一个进程来观察这一点:你应该在那里看到许多 poll() 调用。