mpirun --cpu-set vs. --rankfile (Open MPI) 1.4.5
Я хочу точно привязать процессы MPI к списку (физических) ядер. Я ссылаюсь на следующие пункты вывода mpirun --help:
-cpu-set|--cpu-set <arg0>
Comma-separated list of ranges specifying logical
cpus allocated to this job [default: none]
...
-rf|--rankfile <arg0>
Provide a rankfile file
Топология моего процессора выглядит следующим образом:
-------------------------------------------------------------
CPU type: Intel Core Bloomfield processor
*************************************************************
Hardware Thread Topology
*************************************************************
Sockets: 1
Cores per socket: 4
Threads per core: 2
-------------------------------------------------------------
HWThread Thread Core Socket
0 0 0 0
1 0 1 0
2 0 2 0
3 0 3 0
4 1 0 0
5 1 1 0
6 1 2 0
7 1 3 0
-------------------------------------------------------------
Socket 0: ( 0 4 1 5 2 6 3 7 )
-------------------------------------------------------------
Теперь, если я запускаю свою программу, используя mpirun -np 2 --cpu-set 0,1 --report-bindings ./solver, программа запускается нормально, но без учета предоставленного мною аргумента --cpu-set. С другой стороны, запуск моей программы с помощью mpirun -np 2 --rankfile rankfile --report-bindings ./solver дает мне следующий вывод:
[neptun:14781] [[16333,0],0] odls:default:fork binding child [[16333,1],0] to slot_list 0
[neptun:14781] [[16333,0],0] odls:default:fork binding child [[16333,1],1] to slot_list 1
Действительно, проверка top показывает мне, что mpirun фактически использует указанные ядра. Но как мне интерпретировать этот вывод? За исключением хоста (нептун) и указанных слотов (0,1), я понятия не имею. То же самое с другими командами, которые я опробовал:
$mpirun --np 2 --bind-to-core --report-bindings ./solver
[neptun:15166] [[15694,0],0] odls:default:fork binding child [[15694,1],0] to cpus 0001
[neptun:15166] [[15694,0],0] odls:default:fork binding child [[15694,1],1] to cpus 0002
а также
$mpirun --np 2 --bind-to-socket --report-bindings ./solver
[neptun:15188] [[15652,0],0] odls:default:fork binding child [[15652,1],0] to socket 0 cpus 000f
[neptun:15188] [[15652,0],0] odls:default:fork binding child [[15652,1],1] to socket 0 cpus 000f
С помощью команды --bind-to-core команда top снова показывает мне, что используются ядра 0 и 1, но почему выходные процессоры 0001 и 0002? --bind-to-socket вызывает еще большую путаницу: 2x 000f?
Я использую последний абзац, чтобы суммировать вопросы, которые возникают из моих экспериментов:
- Почему не работает моя команда --cpu-set?
- Как я должен интерпретировать вывод, полученный в результате вывода --report-bindings?
С уважением
1 ответ
В обоих случаях выходные данные точно соответствуют тому, что вы сказали Open MPI. Шестнадцатеричное число в cpus ...
показывает разрешенные процессоры (маску сродства) для процесса. Это битовое поле, каждый бит которого представляет один логический процессор.
С --bind-to-core
каждый процесс MPI связан с собственным ядром процессора. Ранг 0 ([...,0]
) имеет маску сходства, установленную на 0001
что означает логический процессор 0. Ранг 1 ([...,1]
) имеет маску сходства, установленную на 0002
что означает логический ЦП 1. Логическая нумерация ЦП, вероятно, соответствует HWThread
идентификатор в выходных данных с информацией о топологии.
С --bind-to-socket
каждый процесс MPI связан со всеми ядрами сокета. В вашем конкретном случае маска сходства установлена на 000f
, или же 0000000000001111
в двоичном коде, который соответствует всем четырем ядрам в сокете. Назначается только одна гиперпотока на ядро.
Кроме того, вы можете указать Open MPI, как выбирать сокеты на многосетевых узлах. С --bysocket
сокеты выбираются циклически, т.е. первый ранг помещается в первый сокет, следующий ранг помещается в следующий сокет и т. д., пока не будет один процесс на сокет, затем снова будет добавлен следующий ранг. первая розетка и тд. С --bycore
каждый сокет получает столько же последовательных рангов, сколько число ядер в этом сокете.
Я хотел бы предложить вам прочитать руководство для mpirun
для Open MPI 1.4.x, особенно в разделе " Привязка к процессу ". Там есть несколько примеров того, как различные варианты привязки взаимодействуют друг с другом. --cpu-set
опция не упоминается в руководстве, хотя Джефф Сквайрс написал хорошую страницу об особенностях сродства процессора в Open MPI (речь идет о версии 1.5, но большинство, если не все, относится и к версии 1.4).