Насколько дорог MPI_Comm_split? - PullRequest
0 голосов
/ 06 июня 2018

Сколько стоит вызов MPI_Comm_split?Работает ли он в O (n), O (log (n)) или как-то еще (где n - это число рангов в разделяемом коммюнике)?

Я пишу код для систем суперкомпьютеров, которыеоснованы на бесконечности.

1 Ответ

0 голосов
/ 07 июня 2018

Если вы используете Open MPI, MPI_Comm_split() (и вообще говоря, создание коммуникатора) может быть не дешевым.

Выбор дизайна заключался в том, чтобы иметь супер быстрое преобразование из идентификатора коммуникатора (например, CID, который являетсяномер) к коммуникатору.Это так же быстро и просто, как и доступ к массиву.

Чтобы сохранить минимальный объем памяти, вновь созданным коммуникаторам всегда назначается самый низкий из доступных CID.

Реализовано назначение CIDчерез итеративный алгоритм, который использует два MPI_Iallreduce() за итерацию, и количество итераций зависит от того, насколько фрагментировано пространство CID для всех задач.В зависимости от того, сколько задач MPI вы используете, и насколько фрагментировано пространство CID, это может занять довольно много времени.

Вы можете увидеть MPI_Comm_split() как танго в два шага - создать группы нового коммуникатора(s) - назначьте CID новому коммуникатору (ам)

Второй шаг самый дорогой, и он зависит не только от количества рангов в исходном коммуникаторе.

Если я правильно понимаю, MPICH сделал другой выбор дизайна.Перевод идентификатора коммуникатора на коммуникатор немного дороже (но это происходит практически каждый раз, когда вызывается подпрограмма MPI), но всегда использовать наименьший доступный CID не требуется, поэтому второй шаг намного дешевле (и это происходит только тогда, когдасоздан новый коммуникатор).

Таким образом, даже если Open MPI и MPICH имеют сопоставимые характеристики для двухточечной, коллективной и односторонней связи, это может быть совершенно другая картина в масштабе, если вы создаете многокоммуникаторы (или если вы используете стороннюю библиотеку, которая делает это под капотом).

...