Вопрос

Я хочу легко выполнить коллективные коммуникации самостоятельно на каждой машине моего кластера. Позвольте сказать, что у меня есть 4 машины с 8 ядрами на каждом, моя программа MPI будет работать 32 задания MPI. Что мне бы хотелось, для данной функции:

  • На каждом хосте только одна задача выполняет вычисление, другие задачи ничего не делают во время этого вычисления. В моем примере, 4 задания MPI будут делать вычисления, 28 других ждет.
  • Как только вычисление будет сделано, каждое задача MPI на каждом выполнит коллективную связь только к локальным задачам (задачи, работающие на одном хосте).

Концептуально я понимаю, что должен создать один коммуникатор для каждого хоста. Я искал вокруг, и ничего не нашел явно этого. Я не очень комфортно с группами MPI и коммуникаторами. Здесь мои два вопроса:

  • MPI_GET_PROCESSOR_NAME достаточно уникальным для такого поведения?
  • В целом, у вас есть кусок кода?
Это было полезно?

Решение

Спецификация говорит, что MPI_Get_processor_name Возвращает «Уникальный спецификатор для фактического (в отличие от виртуального) узла», поэтому я думаю, что вы будете в порядке с этим. Думаю, вы сделаете собирать, чтобы собрать все имена хоста, а затем назначать группы процессоров, чтобы выйти и сделать их коммуникаторы; Или DUP MPI_COMM_WORLD, поверните имена в целочисленные хэши и используйте MPI_COMM_SPLIT для раздела набора.

Вы также можете предложить подход Janneb, предлагающую и использовать варианты, специфичные для реализации для MPIRUN, чтобы обеспечить, чтобы реализация MPI назначила задачи; OpenMPI использует --byslot для создания этого упорядочения; С MPICH2 вы можете использовать -Print-Rank-карту, чтобы увидеть отображение.

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

Другие советы

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

Ответ системы на звонок на MPI_Get_processor_name зависит от системы; в вашей системе это может вернуться node00, node01, node02, node03 в зависимости от необходимости или может вернуться my_big_computer Для любого процессора вы на самом деле работаете. Первый скорее всего, но он не гарантируется.

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

Другая стратегия будет начать 4 процесса и прикреплять их к разным узлам. Как вы приглашаете процессы к узлам (или процессорам), будут зависеть от вашего времени выполнения MPI, и любые системы управления заданием, такими как механизм сетки. Это, вероятно, будет включать в себя настройки переменных среды - но вы ничего не говорите о вашей системе выполнения, поэтому мы не можем угадать, что они могут быть. Затем вы можете иметь динамически выполнять каждый из 4 процессов еще в 7 (или 8) процессах и закреплению в одном и том же узле в качестве исходного процесса. Для этого прочитайте тему межкоммуникаторов и документации вашей системы выполнения.

Третья стратегия, теперь она становится немного сумасшедшей, будет начать 4 отдельных программах MPI (8 процессов каждый), по одному на каждом узле вашего кластера, и присоединиться к ним, как они выполняют. Читать о MPI_Comm_connect а также MPI_Open_port для деталей.

Наконец, для дополнительного удовольствия вы можете рассмотреть возможность гибридизации вашей программы, запустив один процесс MPI на каждом узле, и у каждого из этих процессов выполняются программа OpenMP Shared-Memory (Sub-).

Обычно ваша среда выполнения MPI может контролироваться, например, по переменным среды, как задачи распространяются по узлам. По умолчанию имеет тенденцию быть последовательным распределением, то есть для вашего примера с 32 задачами, распределенными более 4 8-ядерных машин, которые вы имеете

  • Машина 1: MPI Rings 0-7
  • Машина 2: MPI Rings 8-15
  • Машина 3: MPI Rings 16-23
  • Машина 4: MPI Rings 24-31

И да, mpi_get_processor_name должен получить имя хоста, чтобы вы могли выяснить, где есть границы между хостами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top