Как барьер реализован в системах передачи сообщений?

Я понимаю, что один главный процесс отправляет сообщение всем другим процессам. Все остальные процессы в ответ отправляют сообщение главному процессу. Будет ли этого достаточно, чтобы барьер работал? Если нет, то что еще нужно?

8

Решение

Давайте посмотрим на Внедрение OpenMPI барьера. Хотя другие реализации могут незначительно отличаться, общий шаблон связи должен быть идентичным.

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

Теперь давайте посмотрим на некоторый код:

/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
*                         University Research and Technology
*                         Corporation.  All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
*                         of Tennessee Research Foundation.  All rights
*                         reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
*                         University of Stuttgart.  All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
*                         All rights reserved.
* Copyright (c) 2012      Oak Ridge National Labs.  All rights reserved.
* [...]
*/

[...]

/*
*  barrier_intra_lin
*
*  Function:   - barrier using O(N) algorithm
*  Accepts:    - same as MPI_Barrier()
*  Returns:    - MPI_SUCCESS or error code
*/
int
mca_coll_basic_barrier_intra_lin(struct ompi_communicator_t *comm,
mca_coll_base_module_t *module)
{
int i;
int err;
int size = ompi_comm_size(comm);
int rank = ompi_comm_rank(comm);

Сначала все узлы (за исключением корневого узла с рангом 0) отправляют уведомление, что они достигли барьера для корневого узла:

    /* All non-root send & receive zero-length message. */

if (rank > 0) {
err =
MCA_PML_CALL(send
(NULL, 0, MPI_BYTE, 0, MCA_COLL_BASE_TAG_BARRIER,
MCA_PML_BASE_SEND_STANDARD, comm));
if (MPI_SUCCESS != err) {
return err;
}

После этого они блокируют ожидание уведомления от корня:

        err =
MCA_PML_CALL(recv
(NULL, 0, MPI_BYTE, 0, MCA_COLL_BASE_TAG_BARRIER,
comm, MPI_STATUS_IGNORE));
if (MPI_SUCCESS != err) {
return err;
}
}

Корневой узел реализует другую сторону связи. Сначала блокирует, пока не получит n-1 уведомления (по одному от каждого узла в группе, кроме него самого, поскольку он уже находится внутри барьерного вызова):

else {
for (i = 1; i < size; ++i) {
err = MCA_PML_CALL(recv(NULL, 0, MPI_BYTE, MPI_ANY_SOURCE,
MCA_COLL_BASE_TAG_BARRIER,
comm, MPI_STATUS_IGNORE));
if (MPI_SUCCESS != err) {
return err;
}
}

Как только все уведомления получены, он отправляет сообщения, которые ждут все узлы, сигнализируя, что все достигли барьера, после чего он покидает сам вызов барьера:

        for (i = 1; i < size; ++i) {
err =
MCA_PML_CALL(send
(NULL, 0, MPI_BYTE, i,
MCA_COLL_BASE_TAG_BARRIER,
MCA_PML_BASE_SEND_STANDARD, comm));
if (MPI_SUCCESS != err) {
return err;
}
}
}

/* All done */

return MPI_SUCCESS;
}

Таким образом, шаблон общения является первым n:1 от всех узлов до корня, а затем 1:n от корня обратно ко всем узлам. Чтобы избежать перегрузки корневого узла запросами, OpenMPI позволяет использовать древовидный шаблон связи, но основная идея одна и та же: все узлы уведомляют корень при входе в барьер, в то время как корень объединяет результаты и информирует всех, как только они готов продолжить.

8

Другие решения

Нет, этого недостаточно. Как только главный процесс отправил сообщение всем другим процессам, сообщив им, что он достиг барьера, и все другие процессы ответили, что они тоже достигли барьера, только главный процесс знает, что все процессы достигли барьера. В этом случае потребуется другое сообщение от мастера другим процессам.

Я не претендую на фактическую реализацию барьеров MPI в какой-либо библиотеке, в частности, я не предполагаю, что описанная последовательность сообщений используется на практике, просто в теории она несовершенна.

1