9.2 KiB
Задание 1: CUDA-реализация LINPACK-подобного теста
В папке лежит готовый каркас под первое задание:
src/main.cu— собственная CUDA-реализация решения плотной СЛАУ методом Якоби.scripts/build.sh— сборка программы черезnvcc.scripts/run_cuda.slurm— пакетный запуск собственной CUDA-версии.scripts/run_intel_linpack.slurm— пакетный запуск стандартного Intel LINPACK на CPU.
Программа генерирует строго диагонально доминирующую матрицу A, заранее известный вектор решения x_true, правую часть b = A * x_true, после чего решает систему методом Якоби на GPU. В выводе печатаются:
- размер матрицы
N; - лучшее время решения в миллисекундах;
- число итераций;
- норма невязки
||Ax - b||_inf; - ошибка
||x - x_true||_inf; - LINPACK-like производительность в GFLOPS.
Что сделать на СКЦ
1. Передать папку на кластер
Если алиас polytech уже прописан в ~/.ssh/config, достаточно:
scp -r task1 polytech:~/supercomputers/
2. Подключиться
ssh polytech
cd ~/supercomputers/task1
3. Запустить собственную CUDA-реализацию
sbatch scripts/run_cuda.slurm
Сразу после отправки Slurm вернёт job id. Дальше:
squeue -u tm3u21
sacct -j <JOBID_CUDA> --format=JobID,JobName,Partition,State,Start,End,Elapsed,NNodes,AllocTRES%40,NodeList,ExitCode
В текущей конфигурации СКЦ в tornado-k40 GPU выбирается самим разделом, поэтому в slurm-скрипте не используется --gres=gpu:1. Сам скрипт запускается из SLURM_SUBMIT_DIR, как в рабочем примере из методички, чтобы сборка и логи всегда шли именно в ~/supercomputers/task1, а не во временную директорию Slurm.
Модули compiler/gcc/11 и nvidia/cuda/11.6u2 загружаются прямо внутри run_cuda.slurm до запуска программы. Это важно: если загрузить их только в отдельном build.sh, бинарник может собраться с новой libstdc++, а запускаться уже с системной, что даёт ошибки вида GLIBCXX_* not found.
После завершения посмотри:
less results/task1-cuda-<JOBID_CUDA>.out
cat results/task1-cuda-<JOBID_CUDA>.csv
Если на кластере нужна другая GPU-архитектура, можно пересобрать так:
CUDA_ARCH=sm_70 ./scripts/build.sh
По умолчанию в build.sh стоит sm_35, потому что пример ориентирован на tornado-k40.
4. Запустить стандартный Intel LINPACK
В примере эталонный LINPACK сначала подготавливается отдельно. Для вашей учётной записи не нужно писать в /linux/share/...; правильнее развернуть архив в домашнем каталоге и запускать оттуда.
Пошагово:
- Скачай официальный архив Intel oneMKL Benchmarks Suite for Linux с сайта Intel:
- страница загрузки:
https://www.intel.com/content/www/us/en/download/780783/intel-oneapi-math-kernel-library-onemkl-benchmarks-suite-for-linux.html - на 2026-03-16 там доступен файл
l_onemklbench_p_2025.3.0_422.tgz
Сохрани его локально и при желании переименуй в linpack.tgz для удобства.
- На локальной машине скопируй архив на кластер:
scp linpack.tgz polytech:~/linpack.tgz
- Подключись к кластеру:
ssh polytech
- Распакуй архив в домашнюю папку:
mkdir -p ~/LINPACK
tar -xzf ~/linpack.tgz -C ~/LINPACK
- Найди каталог, в котором реально лежит
xlinpack_xeon64:
find ~/LINPACK -name xlinpack_xeon64 2>/dev/null
В вашем случае по логам нужный каталог уже известен:
/home/ipmmstudy1/tm3u21/LINPACK/benchmarks_2025.3/linux/share/mkl/benchmarks/linpack.
- Подготовь этот каталог, как в примере:
cd /home/ipmmstudy1/tm3u21/LINPACK/benchmarks_2025.3/linux/share/mkl/benchmarks/linpack
mkdir -p stdio
chmod +x *
chmod -x *.*
- Отправь batch-задачу с явным указанием
LINPACK_DIR:
cd ~/supercomputers/task1
sbatch --export=ALL,LINPACK_DIR=/home/ipmmstudy1/tm3u21/LINPACK/benchmarks_2025.3/linux/share/mkl/benchmarks/linpack scripts/run_intel_linpack.slurm
По умолчанию скрипт использует файл task1/intel/lininput_report_xeon64, где уже зафиксированы размеры
1000 1500 2000 2500 3000 3500, чтобы Intel LINPACK можно было напрямую сравнить с вашей CUDA-реализацией в отчёте.
- Проверь статус:
sacct -j <JOBID_INTEL> --format=JobID,JobName,Partition,State,Start,End,Elapsed,NNodes,AllocTRES%40,NodeList,ExitCode
- Посмотри вывод:
less ~/supercomputers/task1/stdio/task1-intel-linpack-<JOBID_INTEL>.out
В этом файле ищи строки с размерами 1000, 1500, 2000, 2500, 3000, 3500, а внизу --- секцию Performance Summary.
Что нужно собрать для отчёта
Ниже последовательность, которая даст все обязательные материалы для отчёта и скриншотов.
Шаг 1. Скрин входа с логином
На login-узле выполни:
whoami
hostname
date
Сделай скрин терминала. На нём должен быть виден логин tm3u21.
Шаг 2. Скрин конфигурации узла и GPU
После завершения CUDA-задачи открой:
less results/task1-cuda-<JOBID_CUDA>.out
В начале файла уже будут:
whoami,hostname,date;scontrol show job ...;scontrol show node ...;lscpu;nvidia-smi.
Сделай отдельные скрины с этой информацией.
Шаг 3. Скрин времени выполнения и числа узлов
Выполни:
sacct -j <JOBID_CUDA>,<JOBID_INTEL> --format=JobID,JobName,Partition,State,Elapsed,NNodes,AllocTRES%40,NodeList,ExitCode
На этом скрине будут:
- время выполнения;
- количество узлов;
- список узлов;
- тип выделенных ресурсов.
Шаг 4. Вынести численные результаты
Для собственной программы значения бери из файла:
cat results/task1-cuda-<JOBID_CUDA>.csv
Для Intel LINPACK значения времени и GFLOPS бери из:
less ~/supercomputers/task1/stdio/task1-intel-linpack-<JOBID_INTEL>.out
Ищи секцию Performance Summary.
Какие картинки ожидает report/report.tex
В отчёте уже подготовлены следующие пути:
report/img/task1-login.pngreport/img/task1-cuda-node.pngreport/img/task1-cuda-run.pngreport/img/task1-cuda-sacct.pngreport/img/task1-intel-run.pngreport/img/task1-intel-sacct.png
Просто положи туда свои скриншоты с этими именами.
Если нужно поменять размеры задач
Собственная программа сейчас запускается на:
100015002000250030003500
Это задаётся параметрами в scripts/run_cuda.slurm:
--start 1000 --step 500 --count 6
Если удобнее задать точный набор размеров, используй:
./bin/linpack_cuda --sizes 1000,2000,3000
Ограничения
Этот код я здесь локально не компилировал, потому что в окружении нет гарантированно настроенного CUDA toolchain и GPU. Поэтому первый реальный прогон лучше делать сразу на СКЦ; если что-то упадёт по модулю, архитектуре GPU или пути к Intel LINPACK, пришли ошибку, и я быстро подправлю.