# Задание 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`, достаточно: ```bash scp -r task1 polytech:~/supercomputers/ ``` ### 2. Подключиться ```bash ssh polytech cd ~/supercomputers/task1 ``` ### 3. Запустить собственную CUDA-реализацию ```bash sbatch scripts/run_cuda.slurm ``` Сразу после отправки Slurm вернёт `job id`. Дальше: ```bash squeue -u tm3u21 sacct -j --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`. После завершения посмотри: ```bash less results/task1-cuda-.out cat results/task1-cuda-.csv ``` Если на кластере нужна другая GPU-архитектура, можно пересобрать так: ```bash CUDA_ARCH=sm_70 ./scripts/build.sh ``` По умолчанию в `build.sh` стоит `sm_35`, потому что пример ориентирован на `tornado-k40`. ### 4. Запустить стандартный Intel LINPACK В примере эталонный LINPACK сначала подготавливается отдельно. Для вашей учётной записи не нужно писать в `/linux/share/...`; правильнее развернуть архив в домашнем каталоге и запускать оттуда. Пошагово: 1. Скачай официальный архив 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` для удобства. 2. На локальной машине скопируй архив на кластер: ```bash scp linpack.tgz polytech:~/linpack.tgz ``` 3. Подключись к кластеру: ```bash ssh polytech ``` 4. Распакуй архив в домашнюю папку: ```bash mkdir -p ~/LINPACK tar -xzf ~/linpack.tgz -C ~/LINPACK ``` 5. Найди каталог, в котором реально лежит `xlinpack_xeon64`: ```bash find ~/LINPACK -name xlinpack_xeon64 2>/dev/null ``` В вашем случае по логам нужный каталог уже известен: `/home/ipmmstudy1/tm3u21/LINPACK/benchmarks_2025.3/linux/share/mkl/benchmarks/linpack`. 6. Подготовь этот каталог, как в примере: ```bash cd /home/ipmmstudy1/tm3u21/LINPACK/benchmarks_2025.3/linux/share/mkl/benchmarks/linpack mkdir -p stdio chmod +x * chmod -x *.* ``` 7. Отправь batch-задачу с явным указанием `LINPACK_DIR`: ```bash 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-реализацией в отчёте. 8. Проверь статус: ```bash sacct -j --format=JobID,JobName,Partition,State,Start,End,Elapsed,NNodes,AllocTRES%40,NodeList,ExitCode ``` 9. Посмотри вывод: ```bash less ~/supercomputers/task1/stdio/task1-intel-linpack-.out ``` В этом файле ищи строки с размерами `1000`, `1500`, `2000`, `2500`, `3000`, `3500`, а внизу --- секцию `Performance Summary`. ## Что нужно собрать для отчёта Ниже последовательность, которая даст все обязательные материалы для отчёта и скриншотов. ### Шаг 1. Скрин входа с логином На login-узле выполни: ```bash whoami hostname date ``` Сделай скрин терминала. На нём должен быть виден логин `tm3u21`. ### Шаг 2. Скрин конфигурации узла и GPU После завершения CUDA-задачи открой: ```bash less results/task1-cuda-.out ``` В начале файла уже будут: - `whoami`, `hostname`, `date`; - `scontrol show job ...`; - `scontrol show node ...`; - `lscpu`; - `nvidia-smi`. Сделай отдельные скрины с этой информацией. ### Шаг 3. Скрин времени выполнения и числа узлов Выполни: ```bash sacct -j , --format=JobID,JobName,Partition,State,Elapsed,NNodes,AllocTRES%40,NodeList,ExitCode ``` На этом скрине будут: - время выполнения; - количество узлов; - список узлов; - тип выделенных ресурсов. ### Шаг 4. Вынести численные результаты Для собственной программы значения бери из файла: ```bash cat results/task1-cuda-.csv ``` Для Intel LINPACK значения времени и GFLOPS бери из: ```bash less ~/supercomputers/task1/stdio/task1-intel-linpack-.out ``` Ищи секцию `Performance Summary`. ## Какие картинки ожидает `report/report.tex` В отчёте уже подготовлены следующие пути: - `report/img/task1-login.png` - `report/img/task1-cuda-node.png` - `report/img/task1-cuda-run.png` - `report/img/task1-cuda-sacct.png` - `report/img/task1-intel-run.png` - `report/img/task1-intel-sacct.png` Просто положи туда свои скриншоты с этими именами. ## Если нужно поменять размеры задач Собственная программа сейчас запускается на: - `1000` - `1500` - `2000` - `2500` - `3000` - `3500` Это задаётся параметрами в `scripts/run_cuda.slurm`: ```bash --start 1000 --step 500 --count 6 ``` Если удобнее задать точный набор размеров, используй: ```bash ./bin/linpack_cuda --sizes 1000,2000,3000 ``` ## Ограничения Этот код я здесь локально не компилировал, потому что в окружении нет гарантированно настроенного CUDA toolchain и GPU. Поэтому первый реальный прогон лучше делать сразу на СКЦ; если что-то упадёт по модулю, архитектуре GPU или пути к Intel LINPACK, пришли ошибку, и я быстро подправлю.