2016-02-04 128 views
2

我注意到,当我有一个死锁的MPI程序时, wait.c使用mvapich2与openmpi比较MPI线程死锁期间的CPU利用率

#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%。我注意到(通过top),2个处理器在100%徘徊,并且在运行它(例如,mpirun -np 4 ./a.out)时, 2在0%。

大概2%是完成沟通的人。

问题:为什么openmpi和mvapich2之间CPU使用率有差异?这是预期的行为?当CPU使用率为100%时,是否从不断检查是否正在发送消息?

回答

4

这两种实施方式busy-waitMPI_Recv()为了最小化潜伏期。这就解释了为什么2级和3级对于两种MPI实现中的任何一种都达到100%。

现在,清楚地将0和1的进度分配给MPI_Finalize()调用,这是两种实现不同的地方:mvapich2 busy-wait while openmpi does not。

要回答你的问题:是的,他们在100%的同时检查是否收到消息并且是预期的行为。

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

+0

这是进一步讨论:http://stackoverflow.com/questions/14560714/probe-seems-to-consume-the-cpu –