Производительность MPI
Содержание
- Производительность MPI
- Установки библиотеки Intel® MPI
- Intel® MPI 2017: новая поддержка OFI как инфраструктуры
- Эталонное тестирование Intel® или OSU Micro
- Тюнинг производительности High-Performance Linpack
- Тюнинг производительности приложений MPI
- Тюнинг производительности MPI в узлах с продуктами семейства Intel® Xeon Phi™ x200
- Тюнинг улучшения полосы пропускания сообщений от 1 до 8 кБ в дорогостоящих процессах узла
- Тюнинг улучшения производительности в приложениях QCD
- Тюнинг GPUDirect* RDMA для эталонного тестирования и приложений MPI
Библиотеки MPI являются ключевым типом программного обеспечения промежуточного уровня при построении приложений HPC. Программный пакет
Intel® Omni-Path содержит несколько сборок Open MPI и MVAPICH2. Вы можете увидеть все варианты просмотрев свои два подкаталога расположенные
в /usr/mpi
с помощью команды ls -r
, как это показано ниже:
/usr/mpi] $ ls -r *
intel:
openmpi-x.y.z-hfi mvapich2-x.y-hfi
gcc:
openmpi-x.y.z-hfi openmpi-x.y.z mvapich2-x.y-hfi mvapich2-x.y
Замечание | |
---|---|
x.y.z указывает самую последнюю версию openmpi; x.y относится к самой последней версии mvapich2. |
Каталоги intel и gcc отображают какой комплект компилятора применялся для сборки данной библиотеки MPI: соответственно Intel® Parallel Studio (включающей сам компилятор Intel C++ Compiler) или компилятор Gnu Compiler Collection (GCC).
Для достижения наилучшей производительности исполняйте MPI поверх библиотеки Performance Scaled Messaging 2 (PSM2), входящей в состав программного обеспечения инфраструктуры Intel® Omni-Path хоста.
Чтобы исполнять MPI поверх имеющейся библиотеки PSM2:
-
Примените MPI, сдержащую в своём названии
hfi
. -
Исходный файл
mpivars.sh
из вашего каталогаbin
одного из имеющихся MPI из вашей оболочки Linux* запустит сценарии.Например, включите следующее выражение в сценарий запуска, такой как
.bashrc
:source /usr/mpi/gcc/openmpi-x.y.z-hfi/bin/mpivars.sh
Это установит значения переменных PATH и LD_LIBRARY_PATH, а также MANPATH для данной версии MPI.
-
Применяйте необходимые опции в своей команде
mpirun
для определения использования PSM2.Например, чтобы воспользоваться версией Open MPI, указанной на 2 шаге примените:
mpirun -mca pml cm -mca mtl psm2 …
Замечание Если вы применяете библиотеку MVAPICH2 library с
hfi
в её названии в её корневом каталоге (скажем,/usr/mpi/intel/mvapich2-x.y-hfi
), тогда никакие особые параметрыmpirun
не нужны для применения соответствующей библиотеки PSM2.
Чтобы обеспечить применение вами соответствующей библиотеки PSM2 воспользуйтесь одной из следующих опций
mprun/mpiexec
:
-
–PSM2
Или эквивалент "
-genv I_MPI_FABRICS_LIST tmi –genv I_MPI_TMI_PROVIDER psm2 -genv I_MPI_FALLBACK 0
". Применяет PSM2/tmi даже в случае взаимодействия с совместно используемой памятью. -
–genv I_MPI_FABRICS shm:tmi
Применяет взаимодействия совместно используемой памяти библиотеки Intel® MPI.
-
–genv I_MPI_FABRICS tmi
Применяет PSM2 для совместно используемой памяти внутри некоторого узла.
Как правило, shm:tmi
выполняется наилучшим образом из всех возможных вариантов; однако это зависит от
приложения. Кроме того в качестве второго или третьего параметра полезно воспользоваться
"–genv I_MPI_TMI_PROVIDER psm2
" в приведённых выше примерах чтобы гарантировать что вы
применяете PSM2.
В кластерах с ЦПУ из семейства продуктов Intel® Xeon Phi™ x200 установка
"–genv I_MPI_TMI_PROVIDER psm2
" или её эквивалента
tmi:tmi
значительно снизит латентность MPI (например, при измерении эталонным тестом IMB-MPI1 PingPong) и
улучшит производительность обмена сообщениями малого размера совместных MPI, таких как Barrier и Allreduce.
Для снижения времени запуска MPI на большом числе узлов следует добавить в вашу командную строку исполнение следующего варианта
mpirun
:
export I_MPI_HYDRA_PMI_CONNECT=alltoall
export I_MPI_PLATFORM_CHECK=0
export I_MPI_HYDRA_BRANCH_COUNT=4
Замечание | |
---|---|
|
Начиная с 3 обновления Intel® MPI 2017 и выше, устанавливаемое по умолчанию значение I_MPI_FABRICS
изменено с shm:tmi
на shm:ofi
.
I_MPI_FABRICS=shm:ofi
подразумевает, что библиотека OpenFabrics Interface (OFI) будет
применяться для взаимодействий между узлами. При наличии установленной на этих узлах инфраструктуры OPA, PSM2 будет назначаемым по умолчанию
поставщиком применительно к OFI. При использовании выпуска программного обеспечения Intel® Omni-Path 10.5, такая библиотека OFI будет включена в основной
(Basic) пакет и пакет IFS. Такое изменение назначения по умолчанию может привести к неожиданному изменению производительности в сравнении с
предыдущими выпусками Программного обеспечения Intel® OP Software и Intel® MPI. Данное изменение на OFI поверх PSM2 может приводить к лучшей или
худшей производительности при сопоставлении с устанавливаемой ранее по умолчанию библиотекой TMI поверх PSM2, которая предоставляется с
поставкой пакета Intel® MPI.
Если вы следовали рекомендациям предыдущего раздела данного руководства, тогда определён Tag Matching Interface (TMI) и OFI не будет применяться.
Если вы пожелаете проверить OFI, воспользуйтесь указанными ниже установками:
-
-genv I_MPI_FABRICS shm:ofi
, -
-genv I_MPI_FABRICS ofi
, -
-OFI
,
Если вы пользуетесь какой- то версией, которая старше чем Программное обеспечение Intel® Omni-Path 10.5, тогда на ваших узлах OFI может быть не установлен. Если вы хотите поэкспериментировать с OFI, вы можете выгрузить эту библиотеку и связанное с ней программное обеспечение с сайта "Downloads for Intel® OmniPath Host Fabric Interface Products" или получить самую последнюю версию с https://ofiwg.github.io/libfabric/.
Чтобы закрепить определённый процесс эталонного тестирования в каком- то ядре сокета:
При исполнении определённых эталонных микротестов MPI с одним процессов в каждом узле, а также с любым MPI, важно закрепить этот процесс эталонного тестирования в некотором ядре имеющегося сокета, который является локальным для данного слота PCIe, занятого вашим Host Fabric Interface (HFI).
Например, если тот слот PCIe, в котором находится HFI подключён к сокету 1 (из имеющихся 0 и 1), тогда вы можете применить
"taskset -c N ./IMB-MPI1
" чтобы закрепить это исполнение на ядро N в сокете 1.
Например, типичным вариантом является случай, когда HFI подключён PCI в сокете 0 установки таковы (для ЦПУ с 12 ядрами):
-genv I_MPI_PROCESSOR_LIST 0-11
Получаемым результатом будет наилучшая возможная задержка для запуска самого первого диапазона MPI в каждом из узлов на CPU0 (либо он может быть установлен на прочие номера ядер в этом первом сокете). Это необходимо по той причине, что при запуске одного диапазона на узел библиотека Intel® MPI не привязывает этот диапазон к определённому ядру. Именно поведение с одним процессом на узел (PPN, processes per node) предоставляет наилучшую гибридную производительность OpenMP/MPI при использовании множества потоков (thread), причём только один диапазон MPI на узел. Эта установка также хорошо работает при варианте применения множества PPN для ваших эталонных тестов OMB или IMB.
High-Performance Linpack (HPL) является программным пакетом, который решает некие универсальные произвольные крупномасштабные системы линейных уравнений с двойной точностью (64 бита) в компьютерах с распределённой памятью, выдавая отчёт о времени и скорости вычислений с плавающей точкой. Применяемая реализация HPL такого эталонного тестирования HPC Linpack является переносимой и широко распространённой (см. http://www.netlib.org/benchmark/hpl/).
Intel® Parallel Studio XE содержит предварительно скомпилированные версии HPL (именуемые как Intel® Distribution for LINPACK Benchmark), которые оптимизированы с применением инструментов Intel® Math Kernel Library. Эти предварительно скомпилированные исполняемые файлы также зависят от процессора и платформы, например, они автоматически выбирают наиболее оптимальное закрепление ядер и прочие переменные среды времени исполнения.
Пиковое значение flops определяется следующей простой формулой:
Rpeak = Ncores * GHz(базовая) * (операций/цикл)
Процессоры Intel® Xeon Phi™ предоставляют 32 операции/цикл, а процессор Intel® семейств Xeon® v3 и v4 предоставляет 16, плавающих операций двойной точности/цикл для каждого ядра ЦПУ. Процессоры Intel® Xeon® Scalable предоставляют 32 плавающие операции двойной точности/цикл для каждого ядра ЦПУ.
Базовой частотой в ГГц для процессора Intel® Xeon Phi™ 7210 является 1.3 ГГц. Таким образом, пиковое значение GFlops для этого процессора
составляет (68 ядер) * (1.3ГГц) * (32 flops двойной точности/ цикл)
или приблизительно 2662.4 GFlops.
Ожидаемый уровень реальной производительности составляет 1993 GFlops (согласно Intel®
Xeon Phi™ Processor Applications Showcase). Это соответствует эффективности отдельного узла (Rmax/Rpeak =
1933/2662.4
) 72.6%.
Важно | |
---|---|
Прежде чем приступать к исполнению на множестве узлов, удостоверьтесь что выполнена оценка производительности каждого индивидуального узла и она располагается в ожидаемом диапазоне для этого процессора. Вычисление HPL множества узлов сдерживается узлом с наихудшей производительностью {Прим. пер.: Первый закон Амдала.} |
Intel рекомендует вам применять предварительно скомпилированную версию HPL, которая содержится внутри Intel® Parallel Studio XE и менуется как
Intel® Distribution for LINPACK Benchmark. На текущий момент эти версии расположены в
compilers_and_libraries_2017.4.196 (2017.4.196)/linux/mkl/benchmarks/mp_linpack/
каталога дерева.
Убедитесь что вы применяете надлежащую библиотеку Intel® MPI. Для рекомендуемой выше версии воспользуйтесь Intel® MPI Library for Linux* OS, Version 2017 Update 3 Build 20170405 (id: 17193).
Для загрузки этой библиотеки в вашей среде:
source /opt/intel/parallel_studio_xe_2017.4.056/bin/psxevars.sh
Для достижения наилучшей производительности HPL с Intel® OPA не требуются никакие особые параметры MPI. Однако для обеспечения того, что вы применяете свой программный уровень PSM2, который даёт лучшую производительность чем программное обеспечение уровня глаголов (verbs), рекомендуются следующие флаги.
Отсылаем вас к Установки библиотеки Intel® MPI для рекомендуемых установок TMI обеспечения применимости PSM2.
Подробный тюнинг файла HPL.dat
обычно не требуется для достижения значения оптовой ожидаемой
производительности и выходит за рамки данного документа.
Совет | |
---|---|
Для генерации образца файла |
Основные параметры HPL.dat
такие:
-
"Размер задачи" N определяется решением некоторой матрицы NxN, которая определяет общий объём используемой памяти.
-
Для оценки общего объёма памяти для заданного N воспользуйтесь этой формулой:
GB = (N*N*8)/230
Где
GB
это общий объём требуемой памяти в GibiByte8
обусловлено размером слова операнда в 8 байт230
это общее число байт в GibiByte -
Наоборот, для определения N под желаемый объём используемой памяти примените такую формулу:
N= SQRT((GB* 230)/8)
-
Как правило, мы используем 60-90% имеющейся системной памяти (
%M = 0.6-0.9
) для получения наиболее оптимального результата HPL. Затем, для множества узлов (C узлов), в которых NODEMEM является значением общего объёма памяти на узел в Gibibyte, вычисления уровня кластера таковы:N = ROUND(SQRT((C * %M * NODEMEM * 230)/8))
Где
ROUND
является функцией округления к ближайшему целому.
-
-
"Размер блока" (NB): Некий оптимальный размер блока, который обычно возвратит наилучшую производительность и не потребует никакого выравнивания. Оптимальные размеры блоков определены для всех процессоров так:
-
Процессор Intel® Xeon Phi™:
336
-
Процессор Intel® Xeon® E5 семейств v3 и v4:
192
-
Процессор Intel® Xeon® Scalable:
384
-
-
"Ps and Qs": P и Q руководят размерностью матрицы задачи. Выбор P и Q является чем- то из области тонкой настройки, однако всегда проверяйте что
P ~ Q
иP * Q = число диапазонов MPI
.Наилучшие P и Q определяются наличием баланса вычислений и сетевой производительности. Если требуется наивысшая производительность, понадобится большее значение P. Если сетевая среда становится узким местом, тогда понадобится большее значение Q для снижения числа вертикальных взаимодействий в вашей матрице. Например, если некий узел имеет дополнительные платы сопроцессоров, наилучшей производительности можно достичь когда
P > Q
.Вычисления очень большого масштаба в процессорах Intel® Xeon Phi™ показали, что наилучшее масштабирование происходит, когда
Q ~ 4*P
. Например, для вычислений на 1024 узлах с применением одного диапазона MPI на узел установитеP=16
иQ=64
.
Как правило, поставляемые Intel исполняемые файлы предоставляют хорошую производительность посредством автоматического выбора оптимального сродства ядрам MPI/Open MP. Однако, вы всё ещё должны исполнять эти двоичные файлы и примеры сценариев, запрашивая соответствующие числа диапазонов MPI и диапазонов MPI на узел. имеющийся исполняемый файл автоматически выберет необходимое число потоков Open MP и размещений основываясь на точном определении процессора, а также переменных среды, которые установлены этим исполняемым сценарием.
-
Для процессоров Intel® Xeon Phi™ рекомендуется применять один диапазон MPI на узел.
-
Для систем с двумя сокетами процессоров Intel® Xeon® рекомендуется применять один диапазон MPI на узел NUMA.
В процессе исполнения HPL, если вы выполните в определённом узле команду Linux* top
, вы должны увидеть
единственный процесс HPL, который применяет все имеющиеся ресурсы ядер. Например, в системе с 64 ядрами процессора Intel® Xeon Phi™, вы бы
обнаружили, что один процесс HPL использует 6400% ЦПУ при пиковых нагрузках. В системе с 16-ядерными процессорами Intel® Xeon®
в двух сокетах вы бы обнаружили два процесса HPL, причём каждый потребляет 1600% ресурсов ЦПУ. Это подразумевает, что имеющиеся потоки Open MP
действуют в пределах каждой из задач MPI.
Для достижения наилучшего результата HPL выполните следующее:
-
Загрузите необходимые инструменты Intel в свой путь, как это обсуждалось в Выбор исполняемых модулей HPL и MPI.
-
Осуществите исполнение HPL единственного узла на каждом из узлов, которые вы планируете использовать в своём тестировании множества узлов.
Если у вас имеется возможность сделать выбор из группы узлов большей чем имеющееся целевое число со множеством узлов и исключить имеющиеся узлы с наинизшей производительностью, вы сможете достичь наивысшего результата на множестве узлов. Например, если вы желаете выполнить тестирование HPL на 128 узлах, а у вас имеются доступными для тестирования 144 узла, удалите те 16, которые имеют наинизшую производительность для вашего окончательного тестирования на множестве узлов.
Выполните вычисление HPL единственного узла с применением небольшого размера задачи (например, 10000) как некий первичный тест на функционирование. Отметим, что вы можете передавать аргументы в исполняемый файл позже, поэтому вы можете регулировать параметры на лету, однако
HPL.dat
всё ещё должен присутствовать в соответствующем каталоге. Проверьте что вы сохраняете файлы журналов для всех исполнений для последующего изучения, если оно потребуется.Получаемый результат в GFlops выводится в самой правой колонке соответствующего вывода программы. Вам следует проверить его чтобы убедиться, что полученная производительность находится в ожидаемом диапазоне для тех конкретных ЦПУ, которые вы используете. Обычным правилом является соответствие диапазона производительности в пределе ±5%.
Отметим, что общее время исполнения заметно возрастает по мере роста N, в особенности для исследований со множеством узлов, поэтому важно взвешивать преимущества роста N как для результата, так и нахождения согласия со временем исполнения.
В идеале такое исследование нужно выполнить для всех узлов индивидуально; и узлы с низкими уровнями производительности должны быть выявлены и исправлены.
-
Выполните тестирование на множестве узлов со всеми выбранными хостами, воспользовавшись сценариями исполнения, содержащимися в Intel® Distribution for LINPACK Benchmark. Полезные подробности можно обнаружить в https://software.intel.com/en-us/mkl-linux-developer-guide-overview-of-the-intel-distribution-for-linpack-benchmark.
Для тестирований с очень большим масштабом узлов (до тысяч), получаемая эффективность может быть на 5- 10% ниже чем эффективность, достигаемая при тестировании на узле с самой низкой производительностью. Для тестирований с меньшим числом узлов воздействие инфраструктуры взаимосвязи на эффективность должно быть меньшим.
Некоторые не установленные по умолчанию параметры драйвера HFI1, либо переменные среды PSM2 или Intel® MPI могут улучшать производительность приложений HPC. Для комплекта программного обеспечения Intel® OmniPath Fabric Suite выпуска 10.5 или более нового были проверены следующие регулировки на обозначенных типах процессоров с положительными результатами.
Приложение | Процессор | Регулируемый параметр1 |
---|---|---|
Ansys Mechanical 18.0, Case=bga |
Процессор семейства Intel® Xeon® E5 v4 |
|
LSTC's LS-DYNA*, тестируемые модели: Neon, Car2Car и 3Cars |
Процессор семейства Intel® Xeon® E5 v4 |
|
OpenFOAM |
Процессоры Intel® Xeon® Scalable |
|
115.fds43, Fire Dynamics Simulator 4 |
Процессоры Intel® Xeon® Scalable |
|
Замечания: 1 Как устанавливать параметр 2 Начинающиеся с 3 Это приложение является частью комплекта SPEC MPI2007 Medium. Данная регулировка не имеет отрицательного воздействия на остальные 12 кодов из данного комплекта, поэтому может применяться в качестве базового исполнения. |
Для предыдущих выпусков Intel® Omni-Path, будьте любезны обратиться за подсказками к Intel® Omni-Path Fabric Performance Tuning User Guide для выпуска программного обеспечения 10.4.2 или более ранним.
Предостережение | |
---|---|
Данный раздел не применим к семейству продуктов сопроцессоров Intel® Xeon Phi™ x100. |
Последние результаты регулировки производительности кластера семейства продуктов Intel® Xeon Phi™ x200 крупного масштаба имеют ключевые результаты для улучшения производительности. Если ваш кластер имеет размер более 1000 узлов и если приложения исполняются на масштабах превышающих 1000 узлов, вы можете значительно улучшить производительность определённых коллективов MPI, к примеру, Allreduce и Barrier, путём добавления настроек некоторых командных строк загрузки Linux и установок BIOS.
Для снижения уровня зашумлённости ОС и оборудования с целью улучшения коллективного масштабирования MPI выполните следующие шаги от имени root:
-
Отключите в своём BIOS Hyper-Threading.
-
Добавьте в командную строку загрузки следующие две настройки:
a. Измените
/etc/default/grub
добавив "idle=halt nohz_full=1-XX
" dGRUB_CMDLINE_LINUX
, где XX -значение, которое меньше чем общее число ядер данного узла. Например, в узле с 68 ядерным ЦПУ:GRUB_CMDLINE_LINUX=vconsole.keymap=us console=tty0 vconsole.font=latarcyrheb-sun16 crashkernel=256M console=ttyS0,115200 idle=halt nohz_full=1-67
-
Примените сделанные изменения, воспользовавшись:
if [ -e /boot/efi/EFI/redhat/grub.cfg ]; then GRUB_CFG=/boot/efi/EFI/redhat/grub.cfg elif [ -e /boot/grub2/grub.cfg ]; then GRUB_CFG=/boot/grub2/grub.cfg fi grub2-mkconfig -o $GRUB_CFG
-
Выполните перезагрузку.
Установленное по умолчанию значение простоя (idle=mwait
) означает, что ваша ОС периодически
пробуждается в каждом простаивающем ЦПУ (во всех гиперпотоках) для выпуска проверок расписания. Основной получаемый эффект от
idle=halt
при отключённом HT состоит в удержании от возникновения переходов к режиму турбирования,
что является источником зашумления оборудования. nohz_full
имеет результатом ядро без тактов в этом
списке ядер/ потоков ЦПУ.
Если вы обнаружите улучшение масштабируемости приложений, вам может понадобиться оценить компенсирует ли такое улучшение любые потенциальные потери вызываемые отключением HT.
Для улучшения производительности MPI продуктов семейства Intel® Xeon Phi™ x200 необходимы определённые установки параметров драйвера и переменных среды PSM2.
-
Для существенного улучшения латентности сообщений малого размера и масштабируемости при общей работе Intel® MPI установите "
-genv I_MPI_FABRICS tmi
" как часть своей команды mpirun/mpiexec. -
Для настройки числа контекстов пользователя в узле:
-
Измените
/etc/modprobe.d/hfi1.conf
(обратитесь к Установке параметров драйвера HFI1 за подробностями). -
В соответствующей строке "опций hfi1" добавьте следующие настройки параметра драйвера hfi1.
num_user_contexts=X
Где X может принимать следующие значения:
-
X = 16
-Это значение предоставляет наилучшую производительность при работе с несколькими диапазонами MPI на узел (16 или меньше), например когда применяется модель гибридного программирования с намного большим числом потоков, нежели имеется диапазонов MPI. -
X = "число физических ядер в узле"
(настройка по умолчанию) - Это значение полезно когда вы не планируете исполнять болшее число диапазонов MPI, нежели имеется ядер. -
X = 2x "число физических ядер в узле"
- Это значение полезно когда вы планируете исполнять некое число диапазонов MPI вплоть до двукратного число общего количества ядер узла (в предположении, что включен режим Hyper-Threading).
-
-
Получаемое значение полосы пропускания MPI при исполнении эталонного тестирования, такого как osu_bw
,
может меняться от ядра к ядру. Если этот тест исполнялся отдельно при закреплении на каждом из ядер процессора Intel® Xeon Phi™,
тогда скорее всего будет одно ядро с наилучшей производительностью, одно самое медленное ядро, а все остальные ядра будут иметь среднюю
производительность. Подробности того, почему это происходит, приводятся в разделеУстановка
соответствия процессов MPI механизмам SDMA.
Для установки максимального числа контекстов пользователя в значение 288 диапазонов MPI:
Узлы семейства продуктов Intel® Xeon Phi™ x200 имеют до 72 ядер, а при включённом Hyper- Threading имеющаяся ОС перечисляет до 288 ЦПУ. Маловероятно, что исполнение с 288 диапазонами MPI на узел будет иметь хорошую производительность (из- за потребления памяти MPI), однако может иметься смысл попробовать это.
-
Измените
/etc/modprobe.d/hfi1.conf
(см. Установка параметров драйвера HFI1). -
Замените
num_user_contexts=144
(максимальное значение равняется 160). при установке этого значения исполнение 288 диапазонов возможно с совместным применением контекстов 288 диапазонов MPI в соотношении 2 : 1.
Альтернативой необходимости совместного использования контекста является установка двух адаптеров Intel® Omni-Pаath на узел. Это предостаит достаточное число аппаратных контекстов для поддержки 288 диапазонов MPI.
Установив значения переменной окружения PSM2_BOUNCE_SZ
равным 8192
,
вы можете получить значительное улучшение производительности при эталонном тестировании сообщений с размером от 1 кБ до 8 кБ, таком как
OSU Micro Benchmark’s osu_gatherv, Intel MPI Benchmark’s biband (bidirectional streaming bandwidth), а также HPC Challenge’s MPI Random Access
(GUPS). Данное улучшение обычно происходит в случае, когда исполняется число MPI PPN равное или близкое к значению общего числа ядер в
тестируемом узле, что является обычным вариантом. Данная установка может также помогать в приложениях, которым важны объединённый сбор или
MPI SendRecv таких размеров сообщений.
Чтоьы установить регулировку улучшения пропускной способности выполните следующее:
Установите PSM2_BOUNCE_SZ=8192
таким образом, чтобы она распространилась вашей командой
mpirun
.
Скажем, при исполнении Intel® MPI mpirun, вы добавляете -genv PSM2_BOUNCE_SZ 8192
в соответствующую
командную строку.
приложения QCD важны во многих центрах HPC. QCD описывают взаимодействие протонов и нейтронов, а также что происходит при высокоэнергеитческих ускорениях. Ниже приводятся советы по регулировке ускорения производительности некоторых из этих приложений:
-
Настройте значение переменной среды PSM2
PSM2_RTS_CTS_INTERLEAVE=1
. Эта настройка может существенно помочь в некоторых тестах QCD, которые применяют сообщения большого размера (16 МБ и более). -
Отсылаем вас к разделу Обработка фрагментации памяти за дополнительными советами, которые могут помочь производительности QCD.
Замечание | |
---|---|
GPUDirect Remote Direct Memory Access (RDMA) первоначально именовался как GPUDirect v3. |
Выдержка из документации NVIDIA* CUDA* Toolkit:
"GPUDirect RDMA является технологией, котоая делает возможным прямой путь обмена данными между GPU и одноранговыми с ним устройствами сторонних производителей с применением стандартных функций PCI Express. Примерами устройств сторонних производителей являются сетевые интерфейсы, ..."
Адаптер Intel® OP HFI является примером устройства сетевого интерфейса, которое поддерживает GPUDirect RDMA. Данный раздел обсуждает каким образом лучше использовать возможности вычислительных узлов с включённым Intel® Omni-Path.
GPUDirect RDMA доступен в двух семействах NVIDIA GPUs: Tesla* и Quadro*.
Предварительные требования
Для достижения максимальной полосы пропускания и наилучшей латентности между устройствами GPU с включённым CUDA необходимо выполнение следующих предварительных условий:
-
Подключите карты адаптеров GPU и Intel® Omni-Path к одному и тому же ЦПУ (сокету) через шины PCIe. Как постулируется в дикументации CUDA, эти два устройства должны совместно использовать один и тот же комплекс корня восходящего потока PCI Express.
-
Примените MPI, заточенный под CUDA, например, Open MPI , поставляемый как часть Intel® OPA Software 10.4 (или более нового) выпуска, устанавливаемый по умолчанию в
/usr/mpi/gcc/openmpi-X.Y.Z-cuda-hfi
. -
Воспользуйтесь приложением или эталонным тестом с включённым CUDA, таким как OMB 5.3.2, настроенный и построенный с
--enable-cuda
, а также прочими установками, содержащимися в его файле документации OMB README. И исполните, применив-d cuda D D
во время выполнения. -
Настройте переменные среды PSM2
PSM2_CUDA=1
иPSM2_GPUDIRECT=1
. Например, опции-x PSM2_CUDA=1 -x PSM2_GPUDIRECT=1
командной строуи Open MPI mpirun распространят эти установки переменных в ваши вычислительные узлы, исполняющие данное задание.Варианты применения
Советы по применению и примеры зависят от общего числа применяемых в узле адаптеров Intel® Omni-Path. Четыре варианта рассматривают: 1) системы с единственным HFI; 2) системы со множеством HFI, в которых каждый диапазон MPI использует один HFI; 3) системы со множеством HFI, в которых каждый диапазон MPI применяет множество HFI (для увеличения полосы пропускания отдельного диапазона); 4) системы с единственным HFI, в котором имеющиеся HFI и GPU подключены к различным сокетам (т.е. 1 предварительное условие, указанное выше, не возможно).
-
Единственный HFI на узел
Это наиболее распространённый вариант. Имеющиеся адаптеры HFI и CUDA подключены к одному и тому же сокету. Вначале предположим, что все вычислительные узлы имеют подключённым к сокету 0 адаптер HFI. Вот некий пример командной строки mpirun, который следует этим рекомендациям:
/usr/mpi/gcc/openmpi-1.10.4-cuda-hfi/bin/mpirun -mca pml cm \ -mca mtl psm2 -H node01,node02 -x PSM2_CUDA=1 \ -x PSM2_GPUDIRECT=1 ./osu_bw –d cuda D D
Замечание Как правило, полный путь к mpirun не требуется если каталог исполняемых файлов находится в вашем path. Однако, в приведённой выше команде мы хотим выделить, что для рабочих нагрузок GPU следует применять это именно тот MPI с включённым CUDA, который находится в
openmpi-1.10.4-cuda-hfi
. -
Дуальный HFI на узел, в котором каждый исполняемый в этом узле диапазон MPI применяет один HFI.
Если устройство GPU подключено ко второму сокету (сокет 1), а второй HFI в этой системе также подключён к сокету 1 (
HFI_UNIT=1
), тогда командная строка с хорошей производительностью выглядела бы так:mpirun -mca pml cm -mca mtl psm2 -H node01,node02 -x HFI_UNIT=1 \ -x PSM2_CUDA=1 -x PSM2_GPUDIRECT=1 ./osu_bw –d cuda D D
Приведённая выше командная строка оставляет размещение процесса osu_bw в имеющемся расписании ОС. Если все вычислительные узлы имеют по два 14- ядерных ЦПУ, а вы хотите получить больший контроль над каждым из ядер и сокетов, в которых выполняется процесс эталонного тестирования, может быть исполнена следующая команда с
taskset
:mpirun -mca pml cm -mca mtl psm2 -H node01,node02 -x PSM2_CUDA=1 \ -x PSM2_GPUDIRECT=1 taskset –c 20 ./osu_bw –d cuda D D
Альтернативы для
taskset -c 20
включают в себя:taskset -c 14-27
илиnumactl -N 1
для помещения определённой задачи на любое из ядер сокета 1 (также именуемого как узел 1 NUMA) и потенциально разрешая перемещение между ядрами в узле 1 NUMA. Отметим, что мы не определили какой- то HFI в приведённой выше команде.Если имеется более одного HFI в одном и том же сокете, PSM2 единообразно чередует имеющиеся диапазоны по всем HFI внутри этого сокета (установленное по умолчанию поведение).
Вы можете применить карусельный (Round-Robin) алгоритм принимая во внимание все HFI в вашей системе (и не ограничиваясь только этим сокетом), установив переменную
HFI_SELECTION_ALG="Round Robin All"
(отметим, что это не рекомендуется для рабочих нагрузок GPU). -
Дуальный HFI на узел, в котором каждый диапазон MPI применяет оба HFI, когда это возможно.
-
Для всех диапазонов MPI, которые НЕ исполняют рабочие нагрузки GPU вы можете настроить значение переменной среды
PSM2_MULTIRAIL=1
для чередования больших сообщений по обоим HFI. -
Для всех диапазонов MPI, которые исполняют рабочие нагрузки GPU у вас имеются следующие два варианта:
-
Оба HFI подключены к тому же самому сокету, что и GPU.
В этом случае вы можете установить
PSM2_MULTIRAIL=2
для чередования больших сообщений между обоими HFI. Если оба HFI располагались в сокете 1 (из 0, 1), тогда хороша будет приводимая ниже команда mpirun:mpirun -mca pml cm -mca mtl psm2 -H node01,node02 -x PSM2_MULTIRAIL=2 \ -x PSM2_CUDA=1 -x PSM2_GPUDIRECT=1 numactl –N 1 ./osu_bw –d cuda D D
-
Если два HFI подключены к разным сокетам, вам не следует применять
PSM2_MULTIRAIL
. Для своих рабочих нагрузок GPU вам следует определить использование только одного HFI, расположенного в том же самом сокете, что и сам GPU. Например, если бы и GPU, и hfi1_1 были бы в узле 1 NUMA (из 0, 1), для выполнения своего эталонного теста вы можете применить следующую команду mpirun:mpirun -mca pml cm -mca mtl psm2 -H node01,node02 -x HFI_UNIT=1 \ -x PSM2_CUDA=1 -x PSM2_GPUDIRECT=1 numactl –N 1 ./osu_bw –d cuda D D
-
-
-
Адаптеры HFI и GPU подключены в различные сокеты.
Адаптеры HFI и CUDA подключены через PCIe к различным ЦПУ/ сокетам. В этом случае происходит потеря производительности (в сравнении со случаем когда оба они подключены к одному и тому же сокету), однако основная её часть может быть возвращена обратно путём установки значения переменной среды
PSM2_GPU_DIRECT_RECV_THRESH
в4096
, как в приводимом ниже примере:/usr/mpi/gcc/openmpi-1.10.4-cuda-hfi/bin/mpirun -mca pml cm \ -mca mtl psm2 -H node01,node02 -x PSM2_CUDA=1 -x PSM2_GPUDIRECT=1 \ -x PSM2_GPU_DIRECT_RECV_THRESH=4096 ./osu_bw –d cuda D D
-