.. _hpl:
========================
Пример запуска HPLinpack
========================
В этом примере мы запустим популярный тест `Linpack `_ для оценки производительности параллельных систем.
Установка HPLinpack
-------------------
Для установки нам потребуется архив с исходным кодом пакета, доступный на сайте `Linpack `_.
Скачиваем и распаковываем архив:
.. code-block:: bash
wget https://www.netlib.org/benchmark/hpl/hpl-2.3.tar.gz
tar xf hpl-2.3.tar.gz
cd hpl-2.3
Для компиляции кода HPL нам потребуется шаблон Makefile с параметрами компиляции. За основу можно взять шаблон ``setup/Make.Linux_Intel64`` для компиляторов Intel. В этом шаблоне мы обновим значение переменной ``TOPdir`` и вместо устаревшего ключа ``-openmp`` укажем новый ключ ``-qopenmp``:
.. code-block:: bash
# команда sed изменяет значение TOPdir на $(pwd) - текущую директорию
# и также изменяет параметр -openmp на -qopenmp
sed "/TOPdir\s\+=/s:=.*:= $(pwd):; s:-openmp:-qopenmp:" setup/Make.Linux_Intel64 > Make.Linux_Intel64
Для сборки загрузим модули для компиляторов Intel и библиотеки Intel MPI и запустим ``make`` с указанием профиля ``Linux_Intel64``:
.. code-block:: bash
module load intel impi
make arch=Linux_Intel64
Скомпилированная программа будет расположена в ``bin/Linux_Intel64/xhpl``.
Запуск HPLinpack
-------------------
После сборки мы можем запустить простейший тест с использованием стандартного файла ``HPL.dat``. Для запуска нам потребуется как минимум 4 ядра.
Тестовый запуск проведём в интерактивном режиме:
.. code-block:: bash
cd bin/Linux_Intel64
# переходим в интерактивный режим с использованием 4 ядер
salloc --ntasks=4
# внутри интерактивного режима запускаем программу
mpirun ./xhpl
# вывод программы довольно большой, в конце содержит следующие строки:
# Finished 864 tests with the following results:
# 864 tests completed and passed residual checks,
# 0 tests completed and failed residual checks,
# 0 tests skipped because of illegal input values.
# для выхода из интерактивного режима используем команду exit
exit
Теперь попробуем запустить расчёт с использованием 4 CPU-узлов (208 ядер). Подготовим отдельную директорию для расчёта с файлом конфигурации :ref:`hpl_4_nodes_dat` и скриптом для очереди задач :ref:`hpl_4_nodes_sbatch`.
.. code-block:: text
:caption: ``HPL.dat``
:name: hpl_4_nodes_dat
:linenos:
HPLinpack benchmark input file
Innovative Computing Laboratory, University of Tennessee
HPL.out output file name (if any)
6 device out (6=stdout,7=stderr,file)
2 # of problems sizes (N)
79872 319488 Ns
1 # of NBs
384 NBs
0 PMAP process mapping (0=Row-,1=Column-major)
1 # of process grids (P x Q)
13 Ps
16 Qs
16.0 threshold
1 # of panel fact
2 PFACTs (0=left, 1=Crout, 2=Right)
1 # of recursive stopping criterium
4 NBMINs (>= 1)
1 # of panels in recursion
2 NDIVs
1 # of recursive panel fact.
2 RFACTs (0=left, 1=Crout, 2=Right)
1 # of broadcast
1 BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM)
1 # of lookahead depth
0 DEPTHs (>=0)
2 SWAP (0=bin-exch,1=long,2=mix)
384 swapping threshold
0 L1 in (0=transposed,1=no-transposed) form
0 U in (0=transposed,1=no-transposed) form
1 Equilibration (0=no,1=yes)
8 memory alignment in double (> 0)
В этом примере файла ``HPL.dat`` мы указываем размеры систем в строке 6. Размер ``N=79872`` является довольно маленьким, и обычно требует чуть больше 1 минуты для решения, размер ``N=319488`` в 4 раза больше, требует в 16 раз больше оперативной памяти и в 64 раза больше арифметических операций. Как правило, чем больше система, тем более эффективно будет работать Linpack, поэтому время для большой матрицы будет меньше чем время для маленькой, умноженное на 64. В строке 8 мы указываем большое значение ``NB=384``, так как процессоры, установленные в CPU-узлах содержат по два модуля AVX-512. Разбиение системы на блоки указывается в строках 11-12. Произведение ``P×Q`` должно совпадать с количеством доступных процессоров ``13×16 = 4×52``.
.. code-block:: slurm
:caption: ``xhpl-4nodes.sh``
:name: hpl_4_nodes_sbatch
:linenos:
#!/bin/bash
#SBATCH --job-name=xhpl-4 # название задачи
#SBATCH --nodes=4 # 4 вычислительных узла
#SBATCH --ntasks-per-node=52 # по 52 MPI-процесса на узел
#SBATCH --time=1:20:00 # оценка времени - 1 час 20 минут
# загружаем модули intel и impi
module load intel impi
# исправьте путь к xhpl, если он отличается
mpirun ~/benchmark/hpl-2.3/bin/Linux_Intel64/xhpl
В скрипте указываются параметры задачи: в строке 2 – название задачи, в строках 3-4 – желаемое количество узлов и MPI-процессов на узле, в строке 5 – максимальное время выполнения задачи (оценочное время – до 60 минут, мы добавим ещё 20 на всякий случай). В строке 8 мы загружаем модули ``intel`` и ``impi`` на случай, если они не были загружен ранее. В строке 10 запускается MPI-программа ``xhpl`` (не забудьте указать корректный путь).
Для запуска задачи в системе очередей используется команда ``sbatch``:
.. code-block:: bash
sbatch xhpl-4nodes.sh
Результаты расчёта будут сохранены в файле ``slurm-XXX.out``, где ``XXX`` – номер задачи. Время расчёта с указанными параметрами обычно составляет от 50 до 60 минут.
Сводную таблицу с временем работы и оценкой скорости вычислений можно получить с помощью следующей команды:
.. code-block:: bash
# вместо XXX нужно указать номер задачи, или использовать *
cat slurm-XXX.out | (grep -B2 -m1 WR; grep WR)
# пример вывода:
# T/V N NB P Q Time Gflops
# --------------------------------------------------------------------------------
# WR01R2R4 79872 384 13 16 59.26 5.7322e+03
# WR01R2R4 319488 384 13 16 2837.69 7.6614e+03
В результате получена производительность ``R_max = 7661 Gflops``. Оценим максимальную производительность вычислений на 4 вычислительных узлах. Всего используется ``4×52=208`` ядер. В каждом ядре установлены два AVX-512 модуля, что позволяет выполнять до 32 арифметических операций с плавающей точкой на одном ядре за один такт. При частоте AVX-512 модуля 2.1ГГц получается оценка ``R_peak = 208×32×2.1 = 13977 Gflops``. Эффективность ``R_max / R_peak = 55%``.