Назначение взаимозависимости IRQ драйвера

Программы MPI поверх PSM2 (либо программы или ПО промежуточного уровня с применением API глаголов) применяет механизм SDMA для своей отправки больших сообщений. Имеющиеся аппаратные средства предоставляют 16 SDMA механизмов для отправки больших сообщений. Эти аппаратные средства предоставляют 16 механизмов и имеющийся драйвер хоста распределяет все процессы MPI по этим механизмам SDMA для чередования всей работы. Имеющийся драйвер хоста hfi1 устанавливает манипулятора прерываниями для обработки исполнениями SDMA и сохранения имеющихся аппаратных очередей SDMA заполненными отложенными работами SDMA. Данный драйвер осуществляет выбор сродства для таких обработчиков во время инициализации драйвера. Данный раздел описывает как осуществляются эти выборы и как они могут оказывать воздействие. Отметим, что некоторые нюансы могут отличаться от одного выпуска программного обеспечения к другому. Приводимые далее подробности действуют для выпуском программного обеспечения от V10.0 вплоть до V10.4.

Общее чило механизмов SDMA (по умолчанию 16), которые могцт применяться для имеющегося драйвера хоста могут изменяться при помощи параметра модуля num_sdma:


parm:         num_sdma:Set max number SDMA engines to use (uint)
 	   

Общее число VL, которые применяются, является параметром диспетчера инфраструктуры (см. opafm.xml). Для определения общего числа включённых VL можно воспользоваться opaportinfo. Приводимый далее вывод отображает что используется один VL данных (VL0), в то время как все прочие VL данных (за исключением VL15) имеют значения MTU настроенными на 0 байт. Это достаточно распространённая конфигурация:


MTU  Supported: (0x7) 10240 bytes
MTU  Active By VL:
00:10240 01:    0 02:    0 03:    0 04:    0 05:    0 06:    0 07:    0
08:    0 09:    0 10:    0 11:    0 12:    0 13:    0 14:    0 15: 2048
16:    0 17:    0 18:    0 19:    0 20:    0 21:    0 22:    0 23:    0
24:    0 25:    0 26:    0 27:    0 28:    0 29:    0 30:    0 31:    0
		

Общее число механизмов SDMA поверх общего числа VL настраивает разделы данного драйвера. Например, распределённые по одному VL 16 механизмов SDMA означают, что все механизмы SDMA могут использоваться этим VL.

Для идентификации определённого механизма SDMA сродству номера ЦПУ могут применяться два метода:

  1. Использование сценария в четыре строки для вывода идентификатора механизма SDMA и самого номера ЦПУ, назначенного ему.

    Этот метод более надёжен, однако нуждается в более продолжительных командах и его вывод слегка лаконичен.

  2. Применить команду dmesg | grep hfi1_0 | grep IRQ.

    Это более простая, лёгкая для запоминания команда, которая к тому же предоставляет более просто читаемый вывод, однако не гарантируется его исполняемость во всех ОС, кроме того, ваш системный администратор может ограничить уровень детализации в /var/log/messages, следовательно данная команда не предоставит укзазующего вывода.

 

Метод 1


# for i in `grep "hfi1_.* sdma" /proc/interrupts | awk '{print $NF}'` ; \
do printf "%s " $i ; irq=`awk "(\\\$NF == \"$i\") \
{print substr(\\\$1,1,length(\\\$1)-1)}" < /proc/interrupts` ; \
cat /proc/irq/$irq/smp_affinity_list ; done
		

Результаты:


sdma0 3
sdma1 4
sdma2 5
sdma3 6
sdma4 7
sdma5 8
sdma6 9
sdma7 10
sdma8 11
sdma9 12
sdma10 13
sdma11 0
sdma12 3
sdma13 4
sdma14 5
sdma15 6
		

По существу этот сценарий находит все номера прерываний в /proc/interrupts, которые используются механизмами SDMA hfi1, а затем перехватывается их настройка сродства в /proc/irq/$irq/smp_affinity_list.

 

Метод 2

Альтернативный метод определения назначений конкретного сродства для механизмов SDMA (который может не работать во всех системах):


# dmesg | grep hfi1 | grep IRQ
		

Результаты:


[ 165.513884] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 74, type GENERAL -> cpu: 0
[ 165.521955] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 75, type SDMA engine 0 -> cpu: 3
[ 165.530510] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 76, type SDMA engine 1 -> cpu: 4
[ 165.539066] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 77, type SDMA engine 2 -> cpu: 5
[ 165.547627] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 78, type SDMA engine 3 -> cpu: 6
[ 165.556183] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 79, type SDMA engine 4 -> cpu: 7
[ 165.564743] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 80, type SDMA engine 5 -> cpu: 8
[ 165.573316] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 81, type SDMA engine 6 -> cpu: 9
[ 165.581887] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 82, type SDMA engine 7 -> cpu: 10
[ 165.590541] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 83, type SDMA engine 8 -> cpu: 11
[ 165.599196] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 84, type SDMA engine 9 -> cpu: 12
[ 165.607849] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 85, type SDMA engine 10 -> cpu: 13
[ 165.616601] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 86, type SDMA engine 11 -> cpu: 3
[ 165.625256] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 87, type SDMA engine 12 -> cpu: 4
[ 165.633928] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 88, type SDMA engine 13 -> cpu: 5
[ 165.642582] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 89, type SDMA engine 14 -> cpu: 6
[ 165.651235] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 90, type SDMA engine 15 -> cpu: 7
[ 165.659981] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 91, type RCVCTXT ctxt 0 -> cpu: 0
[ 165.668726] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 92, type RCVCTXT ctxt 1 -> cpu: 1
[ 165.677476] hfi1 0000:05:00.0: hfi1_0: IRQ vector: 93, type RCVCTXT ctxt 2 -> cpu: 2
		

В этом случае соответствующие механизмы SDMA назначаются драйвером данного хоста ядрам ЦПУ начиная с 3 ядра и обёртываются вокруг начиная с ядра ЦПУ 13 до ядра ЦПУ 0. Заметим, что ядра ЦПУ 1 и 2 пропускаются приэтом назначении. основная причина состоит в том, что они были назначены для "очередей приёма ядра" (kernel receive queues, т.е для получения контекста), которые применяются для обработки входящих пакетов Глаголов, что очевидно из самых последних 2 строк в выводе этого Метода 2. Общее число очередей приёма ядра, устанавливаемое по умолчанию, равно 2, однако оно может быть изменено с помощью такого параметра модуля krcvqs:


parm:           krcvqs:Array of the number of non-control kernel receive queues by VL (array of uint)
		

Отметим, что если вывод сценария Метода 1 указывает некий диапазон ЦПУ, аналогичный приводимому ниже выводу, тогда скорее всего служба irqbalance не работает правильно и её необходимо перезапустить:


sdma0 0-13
sdma1 0-13
sdma2 0-13
sdma3 0-13
sdma4 0-13
sdma5 0-13
sdma6 0-13
sdma7 0-13
sdma8 0-13
sdma9 0-13
sdma10 0-13
sdma11 0-13
sdma12 0-13
sdma13 0-13
sdma14 0-13
sdma15 0-13
		

Установка соответствия процессов MPI механизмам SDMA

Обычно заданиям MPI назначаются определённые уровни обслуживания; и они ставятся в соответствие каналам служб и виртуальных лейнов установкой соответствия через диспетчер инфраструктуры (настраиваемое файлом конфигурации opafm.xml). Каждый процесс MPI связывается с неким VL, номером контекста и потенциально номером суб- контекста (если применяется совместное использование контекста). Данный VL выбирает набор механизмов SDMA, которые могут применяться. Во многих случаях только один VL настраивается (как это отображено в выводе выше) для разрешения заданию MPI применять все 16 механизмов SDMA. Соответствующий номер контекста и суб- контекста, которые назначены заданиям MPI обычно не начинаются с 0, следовательно, как правило, используется некое смещение для самого первого механизма SDMA.

Intel® Omni-Path Fabric Suite предлагает некий способ управления соответствия ядра ЦПУ A механизму SDMA X. Таким образом, любой процесс MPI, исполняемый в этом ядре A будет назначен механизму SDMA X. Для осуществления этого имеющийся драйвер создаёт некий новый каталог sysfs с названием sdma>N>, где N является определённым идентификатором механизма SDMA.


/sys/devices/pci…/infiniband/hfi1_<N>/sdma<N>/
 	   

pci… ссылается на определённые уровни каталога (некий метод для перечисления этих названий каталогов приводится ниже). Каждый каталог будет выставлять два новых файла (атрибута):

  • cpu_list: Доcтупный на чтение/ запись атрибут, который позволяет вам устанавливать значение процесса назанчению механизма SDMA на основе того, в каком ЦПУ процесс исполняется.

  • vl: Доступный только для чтения атрибут, который делает возможным для вас находить имеющийся механизм SDMA для соответствия Virtual Lane.

Для вывода полных названий путей этих фалов воспользуйтесь следующими командами:

  • find /sys/devices/ -name vl | grep hfi1

  • find /sys/devices/ -name cpu_list | grep hfi1

Либо, если вы желаете только вывести только все файлы для самого первого HFI, воспользуйтесь hfi1_0:


$ find /sys/devices/ -name cpu_list | grep hfi1_0
/sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma0/cpu_list
/sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma1/cpu_list
/sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma2/cpu_list
/sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma3/cpu_list
/sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma4/cpu_list
/sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma5/cpu_list
/sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma6/cpu_list
/sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma7/cpu_list
/sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma8/cpu_list
/sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma9/cpu_list
/sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma10/cpu_list
/sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma11/cpu_list
/sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma12/cpu_list
/sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma13/cpu_list
/sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma14/cpu_list
/sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma15/cpu_list
		
[Замечание]Замечание

Тк как обычная установка применяет только один VL, с номером 0, а имеется 16 механизмов SDMAдля этого VL, с этого момента мы не будем рассматривать конкретный номер VL.

Для вывода тех ЦПУ, которые являются механизмами SDMA и контекстами Receive (# определяется параметром krcvqs), воспользуйтесь следующей командой:


$ dmesg | grep hfi1_0 | grep IRQ
[71396.873706] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 43, type GENERAL -> cpu: 0
[71396.873736] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 44, type SDMA engine 0 -> cpu: 3
[71396.873763] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 45, type SDMA engine 1 -> cpu: 4
[71396.873789] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 46, type SDMA engine 2 -> cpu: 5
[71396.873816] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 47, type SDMA engine 3 -> cpu: 6
[71396.873843] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 49, type SDMA engine 4 -> cpu: 7
[71396.873878] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 50, type SDMA engine 5 -> cpu: 8
[71396.873905] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 51, type SDMA engine 6 -> cpu: 9
[71396.873937] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 52, type SDMA engine 7 -> cpu: 10
[71396.873963] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 53, type SDMA engine 8 -> cpu: 11
[71396.873989] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 54, type SDMA engine 9 -> cpu: 12
[71396.874015] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 55, type SDMA engine 10 -> cpu: 13
[71396.874040] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 56, type SDMA engine 11 -> cpu: 14
[71396.874066] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 57, type SDMA engine 12 -> cpu: 15
[71396.874098] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 58, type SDMA engine 13 -> cpu: 16
[71396.874125] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 59, type SDMA engine 14 -> cpu: 17
[71396.874151] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 60, type SDMA engine 15 -> cpu: 18
[71396.874403] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 61, type RCVCTXT ctxt 0 -> cpu: 0
[71396.874743] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 62, type RCVCTXT ctxt 1 -> cpu: 1
[71396.875100] hfi1 0000:01:00.0: hfi1_0: IRQ vector: 63, type RCVCTXT ctxt 2 -> cpu: 2
		
[Замечание]Замечание

Если данная команда dmesg не работает, вы можете воспользоваться приведённым ранее сценарием "Метода 1" для получения назначня механизма SDMA ядру ЦПУ..

В качетсве примера вы можете назанчить отдельное ядро или диапазон ядер своему файлу cpu_list следующим образом:


# echo “0-3” > /sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma0/cpu_list
		
[Замечание]Замечание

Для определения правильного названия пути для применения с этой командой echo для механизма sdma0 в hfi_1 вам необходимо применить "find /sys/devices/ -name cpu_list | grep hfi1_0". Приведённый выше каталог pci0000:00/0000:00:02.0/0000:01:00.0, скорее всего, отсутствует в вашей системе.

Для иллюстрации применения описанных ранее свойств и принципов мы исполним эт, алонный тест OSU Micro, osu_bw, с размером сообщения 4 MB (исполняемом в узле с продуктом семейства Intel® Xeon Phi™ x200 с частотой 1.5 ГГц и 72 ядрами, с установкой max_mtu=10240 и отключённым режимом Турбо), и увидим следующие результаты:

Таблица 9-1.
Число закреплённых ядер osu_bw в МБ/с

0

10205

1

10185

2

10431

3

10391

4

10300

5

10260

6

8038

7

12381

8

10318

9

10315

10

10468

11

10426

12

10282

 

Предположим, вашей целью является увеличение общего число "наилучших ядер" с 1 до 4 последовательных ядер, и прекратить самую медленную производительность на ядре 6.

Во- первых, нам необходимо понять, что самое эффективное ядро 7 из приведённых выше имеет такую наивысшую производительность потому, что так получилось, что оно было назначено тому механизму SDMA, который был назначен ядру 6. Из сказанного ранее мы видим, что этому ядру назначен sdma3: SDMA engine 3 → cpu: 6. В семействе продуктов ЦПУ Intel® Xeon Phi™ x200 последовательные пары чёт-нечет, подобные 0-1 или 6-7 все находятся в одном и том же "слое", который совместно использует один и тот же кэш L2. Таким образом, обеспечивается очень быстрое взаимодействие совместного использования кэша между ядрами 6 и 7..

[Замечание]Замечание

Ядро 7 не всегда является ядром с наилучшей производительностью в процессоре Intel® Xeon Phi™.

Применение двух приведённых ранее списков показывает взаимосвязь данного файла с имеющимися механизмами SDMA и теми ЦПУ, которые связаны с каждым из механизмов SDMA, с применением прав root можно исполнить такие команды:


echo 6 > /sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma4/cpu_list
echo 7 > /sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma3/cpu_list
echo 8 > /sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma6/cpu_list
echo 9 > /sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0/infiniband/hfi1_0/sdma5/cpu_list
		

В качестве примера того, как были определены эти команды, для первой описанной выше команды, мы пытаемся назначить процесс MPI, который привязан к ядру 6 с механизмом SDMA, назначенным для ядра 7 (другой участник уровня - пары чёт-нечет, которая включает ядро 6); а приведённый выше список dmesg отображает: type SDMA engine 4 → cpu: 7. Тем самым мы выбираем в своём пути файл с 'sdma4'. Аналогичные рассуждения мы использовали для построения трех прочих команд. Полученная производительность приводится ниже.

Таблица 9-1.
Число закреплённых ядер osu_bw в МБ/с

0

10222

1

10185

2

10436

3

10438

4

10326

5

10279

6

12381

7

12379

8

12380

9

12378

10

10435

11

10446

12

10294

 

Для обеих предыдущих таблиц … указывает на то, сто для ядер 13- 71 (в данной системе с 72 ядрами) все значения производительности находятся на уровне из диапазона 10300–10500 МБ/с.

Отметим, что теперь у нас нет ядер с производительностью ниже уровня 8000 МБ/с, и что имеются четыре ядра с производительностью близкой к реальному времени в ~12.4 ГБ/c.