C语言 比较使用 mvapich2 与 openmpi 的 MPI 线程死锁期间的 CPU 利用率



我注意到当我有一个死锁的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() 调用。

最新更新