Задание 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
sbatch scripts/run_intel_linpack.slurm
Проверка статуса и итогов:
sacct -j <JOBID_INTEL> --format=JobID,JobName,Partition,State,Start,End,Elapsed,NNodes,AllocTRES%40,NodeList,ExitCode
less results/task1-intel-linpack-<JOBID_INTEL>.out
Если каталог с Intel LINPACK на кластере другой, отправь задание так:
sbatch --export=ALL,LINPACK_DIR=/linux/share/mkl/benchmarks/linpack scripts/run_intel_linpack.slurm
Что нужно собрать для отчёта
Ниже последовательность, которая даст все обязательные материалы для отчёта и скриншотов.
Шаг 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 results/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, пришли ошибку, и я быстро подправлю.