我注意到当我有一个死锁的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: %i\n", 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%时,是否经常检查是否正在发送消息?
答案 0 :(得分:4)
MPI_Recv()
上的两个实施busy-wait,以尽量减少延迟。这解释了为什么第2和第3列在两个MPI实现中都是100%。
现在,明确地将{0}和1进展到MPI_Finalize()
调用,这是两个实现不同的地方:mvapich2 busy-wait而openmpi没有。
回答你的问题:是的,他们在检查是否收到邮件时是100%,这是预期的行为。
如果您不在InfiniBand上,可以通过将strace
附加到其中一个进程来观察:您应该在那里看到许多poll()调用。