Пример запуска 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.

HPL.dat
 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.

xhpl-4nodes.sh
 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%.