2016-02-04 27 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 –