我注意到当我有一个陷入僵局的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;
}当我用mspevich2-2.1库编译wait.c (它本身是使用gcc-4.9.2编译的)并运行它(例如,mpirun -np 4 ./a.out)时,我注意到(通过top),所有4个处理器都在以100%的速度运行。
当我用openmpi-1.6库编译wait.c (它本身是使用gcc-4.9.2编译的)并运行它(例如,mpirun -np 4 ./a.out)时,我注意到(通过top),两个处理器正在以100%的速度运行,2个处理器在0%的情况下运行。
据推测,0%的2人是完成沟通的人。
问:为什么openmpi和mvapich2在CPU使用上有差异?这是预期的行为吗?当CPU使用率为100%时,是否不断检查是否正在发送消息?
发布于 2016-02-04 19:19:33
这两种方法都在MPI_Recv()上实现了MPI_Recv(),以尽量减少延迟。这就解释了为什么排名2和3的MPI实现都是100%的。
现在,显然将0和1的进度排列为MPI_Finalize()调用,这是两个实现的不同之处: mvapich2繁忙--等待,而openmpi没有。
要回答你的问题:是的,他们是100%,同时检查是否收到了信息,这是预期的行为。
如果您不在InfiniBand上,您可以通过将一个strace附加到其中一个进程来观察这一点:您应该会在那里看到一些轮询()调用。
https://stackoverflow.com/questions/35208163
复制相似问题