Параллельное программирование: Учебное пособие, страница 109

int key, MPI_Comm* newcomm)

В следующем примере создаются три новых коммуникатора (если исходный коммуникатор comm содержит не менее трех процессов):

MPI_Comm comm, newcomm;

int rank, split;

MPI_Comm_rank(comm, &rank);

split = rank%3;

MPI_Comm_split(comm, split, rank, &newcomm);

Целочисленным делением рангов коммуникатора comm, содержащего 7 процессов, создаются 3 новых коммуникатора с процессами прежних рангов: (0, 2, 3), (1, 4, 6) и (5). Их новые ранги показаны на рис. 7.

Подпрограмма MPI_Comm_free помечает коммуникатор comm для удаления:

int MPI_Comm_free(MPI_Comm *comm)

Обмены, связанные с этим коммуникатором, завершаются обычным образом, а сам коммуникатор удаляется только после того, как на него не будет активных ссылок. Данная операция может применяться к коммуникаторам обоих видов (интра- и интер-).


Рисунок 5.7. Создание трех новых коммуникаторов

с помощью подпрограммы MPI_Comm_split

Сравнение двух коммуникаторов (comm1) и (comm2) выполняется подпрограммой MPI_Comm_compare:

int MPI_Comm_compare(MPI_Comm comm1,

MPI_Comm comm2, int *result)

Результатом ее выполнения result будет целое значение, которое равно MPI_IDENT, если контексты и группы коммуникаторов совпадают; MPI_CONGRUENT, если совпадают только группы; MPI_SIMILAR и MPI_UNEQUAL, если не совпадают ни группы, ни контексты. В качестве аргументов нельзя использовать пустой коммуникатор MPI_COMM_NULL.

К числу операций управления коммуникаторами можно отнести знакомые уже нам операции MPI_Comm_size и MPI_Comm_rank. Они позволяют, в частности, распределить роли между процессами в модели "главная задача — подчиненные задачи" (master-slave).

С помощью подпрограммы MPI_Comm_set_name можно присвоить коммуникатору comm строковое имя name:

int MPI_Comm_set_name(MPI_Comm com, char *name)

и наоборот, подпрограмма MPI_Comm_get_name возвращает name — строковое имя коммуникатора comm:

int MPI_Comm_get_name(MPI_Comm comm,

char *name, int *reslen)

Имя представляет собой массив символьных значений, длина которого должна быть не менее MPI_MAX_NAME_STRING. Длина имени — выходной параметр reslen.

Является ли коммуникатор comm (это входной параметр) интеркоммуникатором, проверяется вызовом подпрограммы MPI_Comm_test_inter:

int MPI_Comm_test_inter(MPI_Comm comm, int *flag)

Результатом является значение флага (flag) "истина", если аргументом является интеркоммуникатор.

Две области взаимодействия можно объединить в одну. Подпрограмма MPI_Intercomm_merge создает интракоммуникатор newcomm из интеркоммуникатора oldcomm:

int MPI_Intercomm_merge(MPI_Comm oldcomm,

int high, MPI_Comm *newcomm)

Параметр high здесь используется для упорядочения групп обоих интракоммуникаторов в comm при создании нового коммуникатора.

Доступ к удаленной группе, связанной с интеркоммуникатором comm, можно получить, вызвав подпрограмму MPI_Comm_remote_group:

int MPI_Comm_remote_group(MPI_Comm comm,

MPI_Group *group)

Ее выходным параметром является удаленная группа group.

Подпрограмма MPI_Comm_remote_size определяет размер удаленной группы, связанной с интеркоммуникатором comm:

int MPI_Comm_remote_size(MPI_Comm comm, int *size)

Ее выходной параметр size — количество процессов в области взаимодействия, связанной с коммуникатором comm.

Интеркоммуникаторы можно использовать в операциях, которые обычно применяются к интракоммуникаторам. При этом MPI_Comm_size возвращает размер локальной группы, MPI_Comm_group — локальную группу и MPI_Comm_rank возвращает ранг в локальной группе. В подпрограмме MPI_Comm_compare оба коммуникатора должны быть одного типа, иначе результатом будет значение  MPI_UNEQUAL.

5.3.8  Операции обмена между группами процессов

При выполнении интеробмена процессу-источнику сообщения указывается ранг адресата относительно удаленной группы, а процессу-получателю — ранг источника (также относительно удаленной по отношению к получателю группы). Обмен выполняется между лидерами обеих групп. Предполагается, что в обеих группах есть, по крайней мере, по одному процессу, который может обмениваться сообщениями со своим партнером.