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.
При выполнении интеробмена процессу-источнику сообщения указывается ранг адресата относительно удаленной группы, а процессу-получателю — ранг источника (также относительно удаленной по отношению к получателю группы). Обмен выполняется между лидерами обеих групп. Предполагается, что в обеих группах есть, по крайней мере, по одному процессу, который может обмениваться сообщениями со своим партнером.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.