Пример запуска HPLinpack
В этом примере мы запустим популярный тест Linpack для оценки производительности параллельных систем.
Установка HPLinpack
Для установки нам потребуется архив с исходным кодом пакета, доступный на сайте Linpack. Скачиваем и распаковываем архив:
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
:
# команда 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
:
module load intel impi
make arch=Linux_Intel64
Скомпилированная программа будет расположена в bin/Linux_Intel64/xhpl
.
Запуск HPLinpack
После сборки мы можем запустить простейший тест с использованием стандартного файла HPL.dat
. Для запуска нам потребуется как минимум 4 ядра.
Тестовый запуск проведём в интерактивном режиме:
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 ядер). Подготовим отдельную директорию для расчёта с файлом конфигурации HPL.dat и скриптом для очереди задач xhpl-4nodes.sh.
1HPLinpack benchmark input file
2Innovative Computing Laboratory, University of Tennessee
3HPL.out output file name (if any)
46 device out (6=stdout,7=stderr,file)
52 # of problems sizes (N)
679872 319488 Ns
71 # of NBs
8384 NBs
90 PMAP process mapping (0=Row-,1=Column-major)
101 # of process grids (P x Q)
1113 Ps
1216 Qs
1316.0 threshold
141 # of panel fact
152 PFACTs (0=left, 1=Crout, 2=Right)
161 # of recursive stopping criterium
174 NBMINs (>= 1)
181 # of panels in recursion
192 NDIVs
201 # of recursive panel fact.
212 RFACTs (0=left, 1=Crout, 2=Right)
221 # of broadcast
231 BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM)
241 # of lookahead depth
250 DEPTHs (>=0)
262 SWAP (0=bin-exch,1=long,2=mix)
27384 swapping threshold
280 L1 in (0=transposed,1=no-transposed) form
290 U in (0=transposed,1=no-transposed) form
301 Equilibration (0=no,1=yes)
318 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
.
1#!/bin/bash
2#SBATCH --job-name=xhpl-4 # название задачи
3#SBATCH --nodes=4 # 4 вычислительных узла
4#SBATCH --ntasks-per-node=52 # по 52 MPI-процесса на узел
5#SBATCH --time=1:20:00 # оценка времени - 1 час 20 минут
6
7# загружаем модули intel и impi
8module load intel impi
9# исправьте путь к xhpl, если он отличается
10mpirun ~/benchmark/hpl-2.3/bin/Linux_Intel64/xhpl
В скрипте указываются параметры задачи: в строке 2 – название задачи, в строках 3-4 – желаемое количество узлов и MPI-процессов на узле, в строке 5 – максимальное время выполнения задачи (оценочное время – до 60 минут, мы добавим ещё 20 на всякий случай). В строке 8 мы загружаем модули intel
и impi
на случай, если они не были загружен ранее. В строке 10 запускается MPI-программа xhpl
(не забудьте указать корректный путь).
Для запуска задачи в системе очередей используется команда sbatch
:
sbatch xhpl-4nodes.sh
Результаты расчёта будут сохранены в файле slurm-XXX.out
, где XXX
– номер задачи. Время расчёта с указанными параметрами обычно составляет от 50 до 60 минут.
Сводную таблицу с временем работы и оценкой скорости вычислений можно получить с помощью следующей команды:
# вместо 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%
.