Синтаксис опции --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.