Синтаксис опции --map-by в openmpi mpirun v1.8
глядя на следующий отрывок из руководство openmpi с
--map-by <foo>
Map to the specified object, defaults to socket. Supported options
include slot, hwthread, core, L1cache, L2cache, L3cache, socket,
numa, board, node, sequential, distance, and ppr. Any object can
include modifiers by adding a : and any combination of PE=n (bind n
processing elements to each proc), SPAN (load balance the processes
across the allocation), OVERSUBSCRIBE (allow more processes on a node
than processing elements), and NOOVERSUBSCRIBE. This includes PPR,
where the pattern would be terminated by another colon to separate
it from the modifiers.
у меня есть разные вопросы относительно синтаксиса и некоторые комментарии к ним:
- что делать варианты
sequential
,distance
иppr
ссылаться?
особенно ppr
ставит меня в тупик. Что это за аббревиатура?
- как я должен понимать такие варианты, как
--map-by ppr:4:socket
относительно выдержки руководства?
конечно, я могу увидеть результат прежнего варианта, посмотрев на сообщенные привязки с --report-bindings
(только 4 процесса отображаются на один сокет и по умолчанию привязаны к 4 ядрам одного сокета), но я не могу понять синтаксис. В другой строке руководства говорится, что этот новый параметр заменяет устаревшее использование --npersocket
:
-npersocket, --npersocket <#persocket>
On each node, launch this many processes times the number of processor
sockets on the node. The -npersocket option also turns on the -bind-
to-socket option. (deprecated in favor of --map-by ppr:n:socket)
1 ответов
ppr
означает процессы на ресурс. Его синтаксис ppr:N:resource
и это означает " назначить N обрабатывает каждый ресурс типа ресурс на узле". Например, на 4-сокетной системе с 6-ядерными процессорами, имеющими --map-by ppr:4:socket
результаты в следующей карте процесса:
socket ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ----
core 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5
process A B C D E F G H I J K L M N O P
(нумерация процессов выполняется от A
to Z
в этом примере)
руководство означает, что все ppr:N:resource
будет рассматривается как один спецификатор и что параметры могут быть добавлены после него, разделенные :
, например,ppr:2:socket:pe=2
. Это должно читаться как "запуск двух процессов на каждый сокет и привязка каждого из них к двум обрабатывающим элементам" и должно привести к следующей карте, заданной той же системой quad-socket:
socket ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ----
core 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5
process A A B B C C D D E E F F G G H H
на sequential
mapper читает файл хоста строка за строкой и запускает один процесс на хост, найденный там. Он игнорирует количество слотов, если задано.
на dist
маппер отображает процессы на узлах NUMA на расстоянии последнего от заданного ресурса PCI. Это имеет смысл только в системах NUMA. Опять же, давайте использовать игрушечную систему quad-socket, но на этот раз расширим представление так, чтобы показать топологию NUMA:
Socket 0 ------------- Socket 1
| |
| |
| |
| |
| |
Socket 2 ------------- Socket 3
|
ib0
линии между сокетами представляют собой ссылки ЦП. Это, например, ссылки QPI для процессоров Intel и HT-ссылки для процессоров AMD. ib0
является InfiniBand HCA используется для связи с другими вычислительными узлами. Теперь, в этой системе, сокет 2 говорит непосредственно к InfiniBand HCA. Сокет 0 и сокет 3 должны пересечь одну ссылку CPU, чтобы поговорить с ib0
и сокет 1 должен пересечь 2 ссылки процессора. Это означает, что процессы, запущенные в сокете 2, будут иметь наименьшую возможную задержку при отправке и получении сообщений, а процессы в сокете 1 будут иметь максимально возможную задержку.
как это работает? Если ваш файл хоста указывает, например, 16 слотов на этом хосте, а опция сопоставления ---map-by dist:ib0
, это может привести к следующим карта:
socket ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ----
core 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5
process G H I J K L A B C D E F M N O P
6 процессов сопоставляются с сокетом 2, который ближе всего к InfiniBand HCA, затем еще 6 сопоставляются с сокетом 0, который является вторым ближайшим, и еще 4 сопоставляются с сокетом 3. Также возможно распространить процессы вместо линейно заполнять обрабатывая элементы. --map-by dist:ib0:span
результаты:
socket ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ----
core 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5
process E F G H M N O P A B C D I J K L
фактическая топология NUMA получается с помощью hwloc
библиотека, которая считывает информацию о расстоянии, предоставленную BIOS. hwloc
включает в себя инструмент командной строки hwloc-ls
(также известный как lstopo
), который может использоваться для отображения топологии системы. Обычно он включает в себя только топологию обрабатывающих элементов и доменов NUMA в своем выходе, но если вы дадите ему -v
опция он также включает в себя устройства PCI.