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).

Другие вопросы по тегам