Когда мне нужно использовать MPI_Barrier ()?

synchronization mpi openmpi

27368 просмотра

3 ответа

Интересно, когда мне нужно использовать барьер? Нужно ли это до / после разброса / сбора, например? Или OMPI должен убедиться, что все процессы достигли этой точки перед рассеянием / сбором? Аналогично, можно ли ожидать, что после трансляции все процессы уже получат сообщение?

Автор: Jiew Meng Источник Размещён: 13.11.2019 11:33

Ответы (3)


25 плюса

Решение

Все коллективные операции в MPI до MPI-3.0 блокируются, что означает, что можно безопасно использовать все буферы, переданные им после их возврата. В частности, это означает, что все данные были получены при возврате одной из этих функций. (Однако это не означает, что все данные были отправлены!) Таким образом, MPI_Barrier не является необходимым (или очень полезным) до / после коллективных операций, если все буферы уже действительны.

Также обратите внимание, что MPI_Barrier волшебным образом не ожидает неблокирующих вызовов. Если вы используете неблокирующую отправку / запись и оба процесса ждут на MPI_Barrier после пары отправка / запись, это не гарантирует, что процессы отправили / получили все данные после MPI_Barrier. Вместо этого используйте MPI_Wait (и друзей). Поэтому следующий фрагмент кода содержит ошибки:

/* ERRORNOUS CODE */

Code for Process 0:
Process 0 sends something using MPI_Isend
MPI_Barrier(MPI_COMM_WORLD);
Process 0 uses buffer passed to MPI_Isend // (!)

Code for Process 1:
Process 1 recvs something using MPI_Irecv
MPI_Barrier(MPI_COMM_WORLD);
Process 1 uses buffer passed to MPI_Irecv // (!)

Обе строки, помеченные (!)как, небезопасны!

MPI_Barrier полезен только в нескольких случаях. В большинстве случаев вам все равно, синхронизируются ли ваши процессы. Лучше читать о блокирующих и неблокирующих звонках!

Автор: Markus Mayr Размещён: 09.11.2012 10:25

16 плюса

Одним из применений MPI_Barrierявляется, например, управление доступом к внешнему ресурсу, такому как файловая система, к которой нет доступа с использованием MPI. Например, если вы хотите, чтобы каждый процесс записывал материал в файл последовательно, вы можете сделать это следующим образом:

int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
for ( int ii = 0; ii < size; ++ii ) {
    if ( rank == ii ) {
        // my turn to write to the file
        writeStuffToTheFile();
    }
    MPI_Barrier(MPI_COMM_WORLD);
}

Таким образом, вы можете быть уверены, что никакие два процесса не вызывают одновременно writeStuffToTheFile.

Автор: Edric Размещён: 09.11.2012 01:13

1 плюс

Может MPI_Barrier () не часто используется, но это полезно. На самом деле, даже если вы используете синхронную связь, MPI_Send / Recv () может обеспечить только синхронизацию двух процессов. В моем проекте, cuda + MPI, все, что я использовал, это асинхронная связь. Я обнаружил, что в некоторых случаях, если я не использую MPI_Barrier (), за которым следует функция Wait (), очень вероятно возникновение ситуации, когда два процесса (gpu) хотят передавать данные друг другу одновременно, что может плохо снизить эффективность программы. Вышеупомянутая ошибка всегда сводит меня с ума и занимает несколько дней, чтобы найти ее. Поэтому вы можете тщательно подумать, следует ли использовать MPI_Barrier (), когда вы использовали MPI_Isend / Irecv в своей программе. Иногда синхронизация процессов не только необходима, но и ОБЯЗАТЕЛЬНА, особенно если программа работает с устройством.

Автор: Freezenfire Размещён: 29.09.2015 11:17
Вопросы из категории :
32x32