我注意到当我遇到死锁的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;
}
当我wait.c
使用mvapich2-2.1库(其本身是使用gcc-4.9.2进行编译)进行编译并运行(例如mpirun -np 4 ./a.out
)时,我注意到(通过top
),所有4个处理器的运行速度均为100%。
当我wait.c
使用openmpi-1.6库(它本身是使用gcc-4.9.2编译)编译并运行它(例如mpirun -np 4 ./a.out
)时,我注意到(通过top
),有2个处理器的运行速度为100%,有2个处理器的运行速度为0%。
大概是0%的2是完成通信的。
问题:为什么openmpi和mvapich2的CPU使用率有差异?这是预期的行为吗?当CPU使用率是100%时,是不断检查消息是否正在发送吗?
两种实现都忙于等待,MPI_Recv()
以最小化延迟。这解释了为什么在两种MPI实施方案中,排名2和3均为100%。
现在,显然将MPI_Finalize()
调用的进度排名为0和1 ,这是两种实现方式不同的地方:mvapich2 busy-wait,而openmpi没有。
要回答您的问题:是的,他们在检查是否已收到邮件以及预期的行为时为100%。
如果您不在InfiniBand上,则可以通过将a附加strace
到以下进程之一来观察此情况:您应该在其中看到许多poll()调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句