.. _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%``.