mpi4py - получает собственный коммуникатор процесса

В настоящее время мы работаем над проектом mpi4py, в котором мы хотим сгруппировать процессы в разные группы. Затем мы назначаем эти группы своим коммуникаторам. Эти шаги выполняются процессом 0.

Теперь вопрос в том, как другие процессы могут определить, к какому коммуникатору они принадлежат?

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

2 ответа

Решение

Мы решили эту проблему, просто позволив каждому процессу выполнить одну и ту же инициализацию, т.е. каждый процесс создает каждую группу и коммуникатор и назначает процессы этим группам в соответствии с одной и той же схемой. Таким образом, процессы знают своих соответствующих коммуникаторов.

Интересно, что мы обнаружили, что, хотя каждый процесс создает все группы и коммуникаторы, они знают только те коммуникаторы (и группы), к которым они принадлежат. Если, например, процесс 4, который принадлежит коммуникатору 1, но не 2, хочет использовать коммуникатор 2, он потерпит крах. Согласно сообщению об ошибке, это связано с тем, что он не знает коммуникатор, хотя он инициализировал его в начале.

MPI делает это для вас. Взгляните на MPI_COMM_SPLIT, или в mpi4py это будет COMM.Split(). Важными параметрами являются "цвет" (в котором групповые процессы будут заканчиваться) и "ключ" (в каком порядке процесс будет в этой группе).

Похоже, вы уже знаете, как вы хотите "покрасить" свои процессы. COMM.Split() является коллективным по родительскому коммуникатору, поэтому вы вычисляете для каждого узла, какой должен быть цвет, а затем разделяете коммуникатор. Скорее всего, вы можете оставить ключ в покое, и в этом случае процессы будут отсортированы в соответствии с их рангом в родительском коммуникаторе.

Другие вопросы по тегам