Какое время управления MPI_Barrier выполнять

Этот код:

#include <mpi.h>

int main(int argc, char* argv[])
{
    MPI_Init(&argc, &argv);

    for (unsigned int iter = 0 ; iter < 1000 ; iter++)
        MPI_Barrier(MPI_COMM_WORLD);

    MPI_Finalize();

    return 0;
}

очень долго работать с MPICH 3.1.4. Вот настенные часы (в секундах) для разных реализаций MPI.

На ноутбуке с 4 процессорами по 2 ядра:

| MPI size | MPICH 1.4.1p1 | openmpi 1.8.4 | MPICH 3.1.4 |
|----------|---------------|---------------|-------------|
|  2       | 0.01          | 0.39          | 0.01        |
|  4       | 0.02          | 0.39          | 0.01        |
|  8       | 0.14          | 0.45          | 27.28       |
| 16       | 0.34          | 0.53          | 71.56       |

На настольном компьютере с 8 процессорами по 4 ядра:

| MPI size | MPICH 1.4.1p1 | openmpi 1.8.4 | MPICH 3.1.4 |
|----------|---------------|---------------|-------------|
|  2       | 0.00          | 0.41          | 0.00        |
|  4       | 0.01          | 0.41          | 0.01        |
|  8       | 0.07          | 0.45          | 2.57        |
| 16       | 0.36          | 0.54          | 61.76       |

Чем объяснить такую ​​разницу и как ее контролировать?


person user744629    schedule 04.05.2015    source источник
comment
На какой аппаратной установке вы это используете? 4 ядра, скорее всего, будут находиться на одном узле, поэтому реализация MPI может синхронизировать процессы без сетевого взаимодействия.   -  person suszterpatt    schedule 05.05.2015
comment
Я отредактировал вопрос, чтобы указать количество ядер и время на другой машине.   -  person user744629    schedule 05.05.2015
comment
Что вы подразумеваете под 8 процессорами по 4 процессора? Hyper Threading? Если да, то это не настоящие процессоры и от них нельзя ожидать полного ускорения.   -  person Vladimir F    schedule 05.05.2015
comment
MPICH переключился с ch3:sock через TCP на ch3:nemesis в какой-то момент между этими версиями. Последний имеет оптимизацию общей памяти, которая влечет за собой ожидание занятости, которое не масштабируется в случае превышения подписки. Если вы соберете с ch3:sock, вы восстановите предыдущее поведение.   -  person Jeff Hammond    schedule 05.05.2015
comment
Вы должны время только барьер. Я подозреваю, что время для Init является большей частью разницы между MPICH и OpenMPI, за исключением случая переподписки.   -  person Jeff Hammond    schedule 05.05.2015


Ответы (1)


Вы используете MPI size > число доступных процессоров. Поскольку программы MPI создаются таким образом, что каждый процесс обрабатывается одним процессором, это означает, что, например, когда вы запускаете MPI size == 16 на своей 8-ядерной машине, каждый процессор будет отвечать за два процесса; это не ускорит программу, а наоборот, как вы видели, сделает ее медленнее. Способ обойти это — либо получить машину с большим количеством доступных процессоров, либо убедиться, что вы запускаете свой код с MPI size ‹= количеством доступных процессоров.

person wolfPack88    schedule 04.05.2015