使用mvapich2与openmpi

时间:2016-02-04 17:54:49

标签: c mpi deadlock openmpi mvapich2

我注意到当我有一个死锁的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%时,是否经常检查是否正在发送消息?

1 个答案:

答案 0 :(得分:4)

MPI_Recv()上的两个实施busy-wait,以尽量减少延迟。这解释了为什么第2和第3列在两个MPI实现中都是100%。

现在,明确地将{0}和1进展到MPI_Finalize()调用,这是两个实现不同的地方:mvapich2 busy-wait而openmpi没有。

回答你的问题:是的,他们在检查是否收到邮件时是100%,这是预期的行为。

如果您不在InfiniBand上,可以通过将strace附加到其中一个进程来观察:您应该在那里看到许多poll()调用。