2016-02-04 2 views
2

Я заметил, что когда у меня есть тупиковая программа MPI, например, wait.cСравнение использования ЦП во время запирания потоков MPI с использованием mvapich2 vs. openmpi

#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%.

Когда я компилирую wait.c с OpenMPI-1.6 библиотекой (который сам по себе была скомпилирована с использованием GCC-4.9.2) и запустить его (например, mpirun -np 4 ./a.out), я заметил (через top), что 2 процессоров урчание на 100% и 2 при 0%.

Предположительно, 2 на 0% являются теми, которые завершили связь.

ВОПРОС: Почему существует разница в использовании ЦП между openmpi и mvapich2? Это ожидаемое поведение? Когда использование ЦП составляет 100%, нужно ли постоянно проверять, отправлено ли сообщение?

ответ

4

Обе реализации busy-wait на MPI_Recv(), чтобы свести к минимуму задержки. Это объясняет, почему ряды 2 и 3 находятся на 100% с любой из двух реализаций MPI.

Теперь ясно обозначается 0 и 1 прогресс в вызове MPI_Finalize(), и это то, где две реализации различаются: mvapich2 busy-wait, пока openmpi этого не делает.

Чтобы ответить на ваш вопрос: да, они на 100% проверяют, получено ли сообщение, и это ожидаемое поведение.

Если вы не находитесь на InfiniBand, вы можете наблюдать это, присоединив strace к одному из процессов: вы должны увидеть там несколько вызовов poll().

+0

Это обсуждается далее: http://stackoverflow.com/questions/14560714/probe-seems-to-consume-the-cpu –