MPI: ядра или процессоры? - PullRequest
21 голосов
/ 27 апреля 2011

Привет, я вроде MPI noob, поэтому, пожалуйста, потерпите меня на этом. :)

Допустим, у меня есть программа MPI с именем foo.c, и я запускаю исполняемый файл с

mpirun -np 3 ./foo

Теперь это означает, что программа будет работать параллельно с использованием 3 процессоров (1 процесс на процессор). Но поскольку большинство современных процессоров имеют более одного ядра (скажем, по 2 ядра на процессор), означает ли это, что программа будет работать на 3 ядрах или 3 процессорах?

Возможно, это связано с моим плохим пониманием того, в чем на самом деле разница между ядром и процессором, так что, если бы вы также могли объяснить немного больше, что было бы полезно.

Спасибо.

Ответы [ 6 ]

32 голосов
/ 27 апреля 2011

mpirun выполнит несколько «процессов» на машине. Процессор или ядро, на котором выполняются эти процессы, зависит от операционной системы. На машинах с N процессорами с M ядрами на каждом процессоре у вас есть место для процессов N * M, работающих на полной скорости.

Но, как правило:

  • Если у вас несколько ядер, каждый процесс будет работать на отдельном ядре
  • Если вы запрашиваете больше процессов, чем доступное ядро ​​* cpus, все будет работать, но с меньшей эффективностью (да, вы можете запускать многопроцессорные задания на одноядерном компьютере с одним процессором ...)
  • Если вы используете систему очередей или предварительно сконфигурированную систему MPI, для которой существует список удаленных машин, распределение будет распределено на удаленных машинах.

(В зависимости от реализации mpi могут быть некоторые параметры для принудительного запуска определенного процессора или ядра, но вам не нужно об этом беспокоиться).

5 голосов
/ 13 мая 2013

Распределение процессов по ядрам и процессорам осуществляется операционной системой и реализацией MPI. Работая на настольном компьютере, операционная система обычно помещает каждый процесс в другое ядро, потенциально перераспределяя процессы во время выполнения. В более крупных системах, таких как суперкомпьютер или кластер, распределение осуществляется менеджерами ресурсов, такими как SLURM. Однако это происходит, один или несколько процессов будут назначены каждому ядру.

Что касается оборудования, ядро ​​может одновременно запускать только один процесс. Такие технологии, как гиперпоточность, позволяют нескольким процессам совместно использовать ресурсы одного ядра. Есть случаи, когда два или более процессов на ядро ​​являются оптимальными. Например, если процесс выполняет большой объем файлового ввода-вывода, другой может занять его место и выполнить вычисления, пока первый зависает при чтении или записи.

Короче, укажите MPI количество процессов, которые вы хотите выполнить. Распределение этих процессов затем обрабатывается прозрачно для пользователя. Количество процессов, которые вы используете, должно определяться требованиями приложения (степени 2, количество файлов для чтения), количеством доступных ядер и оптимальным числом процессов на ядро ​​для приложения.

4 голосов
/ 16 октября 2011

Планировщик ОС попытается оптимально распределить отдельные ядра для процессов вашего параллельного приложения в многоядерной системе ИЛИ для разделения процессоров в многопроцессорной системе.

Интересным примером является многоядерная многоядерная система. Опять же, вы можете позволить планировщику ОС сделать это за вас, ИЛИ вы можете принудительно привязать (логическое / физическое) ядро ​​к вашим процессам, чтобы связать их с конкретным ядром.

2 голосов
/ 02 мая 2017

с точки зрения производительности задания MPI, есть несколько явных правил: 1) если вы используете чистый MPI-код (BLAS не настроен с openMP), отключите гиперпоточность и установите количество заданий на узел в ядрах узла 2) если вы кодируете MPI + openMP, вы можете установить PPN (процессы на узел) для ядер узла, а OMP_NUM_THEADS - в 2 (если на ядро ​​имеется два аппаратных потока) 3) если вы кодируете MPI + openMP и ваш кластер огромен, вы можете установить PPN (число процессов на узел) равным 1, а OMP_NUM_THEADS - логическим номерам ЦП, чтобы сохранить накладные расходы на связь

2 голосов
/ 24 августа 2016

Команда mpirun использует список хостов. Если он не указан, он, вероятно, будет использовать «localhost» и запускать там все ваши процессы. Если вы запускаете 3 процесса и у вас есть 4-ядерный компьютер, вы, вероятно, получите хорошее ускорение, потому что ОС обычно размещает их на разных ядрах. Если у вас только два ядра, то одно ядро ​​получит два процесса.

Предыдущее не совсем верно, поскольку ОС разрешено перемещать процессы, поэтому вы можете использовать numactl для привязки их к ядру.

Если вы находитесь в многоузловом кластере, то хорошо настроенный mpi сгенерирует файл хоста, где каждый узел появляется столько раз, сколько у него ядер. Таким образом, в кластере из 4 узлов с 8 ядрами на узел можно запросить до 32 процессов и ожидать почти идеального ускорения. (Если, конечно, ваш код и ваш алгоритм это позволяют.) При запросе 9 процессов в этом кластере можно разместить 8 на одном узле, а 9 - на другом, что, конечно, не очень хорошо для производительности. Вы бы надеялись, что ваше кластерное программное обеспечение поставляется с mpirun, который лучше распределяет процессы.

0 голосов
/ 21 декабря 2018

Чтобы обеспечить полезную структуру, я хотел бы рассмотреть эту иерархию:

  • материнская плата может содержать одну или несколько фишек / кубиков;
    • чип / кристалл может содержать одно или несколько ядер (независимых процессоров);
      • ЦП может обрабатывать один или несколько потоков одновременно (известная мне многопоточность состоит из двух потоков)

В первые дни у вас чаще всего была одна материнская плата с одним чипом и одним процессором с одним потоком. Только один процесс может быть обработан за один раз, и набор аппаратного обеспечения был обозначен как процессор . Было однозначное сопоставление между частями программного обеспечения (задача для запуска) и частями оборудования (устройство для запуска задачи).

Процесс - это определенно программное обеспечение . «Поток» - это, проще говоря, спецификация «процесса» в контексте параллельных параллельных вычислений. В настоящее время процессор может относиться как к физическому устройству, так и к его расширенным возможностям обработки (опять же, многопоточность, что, безусловно, является технологической реализацией). Например, вы можете иметь машины с двумя чипами на материнской плате, с четырьмя ядрами / процессорами на чип и с каждым ядром / процессорами, работающими по два потока одновременно. Тогда вы сможете запускать процессы 2x4x2 = 16 (конечно, без переподписки ресурсов).

Синтаксис MPI, который вы цитируете, адресов процессов (опция np) или потоков, если хотите. Часть описания man mpirun даже ссылается на процессы как на «слоты» (например, см. Спецификации для файла хоста).

Слоты показывают, сколько процессов потенциально могут выполняться на узле.

Такое использование звучит как наследие той тесной взаимосвязи между единицами аппаратного обеспечения и единицами программного обеспечения, которая была тогда стандартной. «Слот» изначально представляет собой материальную / аппаратную функцию, мало чем отличающуюся от термина «сокет», который иногда подвергался аналогичной смене семантики.

Так что, действительно, я чувствую некоторое сочувствие к вашему замешательству. Если вы пользователь Linux, вы можете визуализировать отчет cat /proc/cpuinfo. Эти строки относятся к одному процессору с именем '2' из четырех:

processor   : 2
...
physical id : 0
siblings    : 4
core id     : 2
cpu cores   : 4

Говорят, что на этой машине я получил только одну микросхему (поскольку «phyical id» принимает только одно значение во всем списке, опущено), что эта одна микросхема как 4 «ядра процессора» и что этот чип работает четыре родных брата (4 потока, поэтому нет многопоточности). В этом случае есть 4 обрабатывающих элемента и 4 ядра процессора.

В приведенном выше примере с многопоточностью вы увидите список для 16 процессоров , 2 значения для «физического идентификатора» (чипы), «ядер процессора», равного 4 (на чип), и «братьев и сестер» 'равно 8 (на чип), поскольку на этом чипе включена многопоточность. В этом случае у вас в четыре раза больше процессоров, чем у ядер.

Следовательно, в этом расширенном контексте «процессор» указывает на способность машины работать над «процессом», и это то, что MPI и вы хотите использовать, независимо от количества и возможностей ядер, которые могут это включить. Вам нужно только получить представление о том, откуда берутся эти возможности обработки.

Еще одна полезная команда Linux - это lscpu:

...
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
...

На самом деле «сокет» - это физическое соединение в материнской плате, к которой подключен чип, так что это действительно название чипа. На самом деле здесь нет многопоточности.

Я обязан обсуждению в этом другом сообщении https://unix.stackexchange.com/q/146051/132913

...