Группировка задач MPI по хосту - PullRequest
2 голосов
/ 28 октября 2010

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

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

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

  • является ли MPI_Get_processor_name достаточно уникальным для такого поведения?
  • В более общем смысле, есть ли у вас фрагмент кода, делающий это?

Ответы [ 3 ]

6 голосов
/ 28 октября 2010

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

Вы также можете воспользоваться подходом, который предлагает janneb, и использовать специфичные для реализации опции для mpirun, чтобы гарантировать, что реализация MPI назначает задачи таким образом; OpenMPI использует --byslot для генерации этого порядка; с mpich2 вы можете использовать -print-rank-map, чтобы увидеть отображение.

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

2 голосов
/ 28 октября 2010

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

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

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

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

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

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

1 голос
/ 28 октября 2010

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

  • машина 1: MPI занимает 0-7
  • машина 2: MPI занимает 8-15
  • машина 3: MPI занимает 16-23
  • машина 4: MPI занимает 24-31

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

...