Files
supercomputers/task1/README.md
2026-03-16 19:48:50 +03:00

246 lines
9.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Задание 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 <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`.
После завершения посмотри:
```bash
less results/task1-cuda-<JOBID_CUDA>.out
cat results/task1-cuda-<JOBID_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 <JOBID_INTEL> --format=JobID,JobName,Partition,State,Start,End,Elapsed,NNodes,AllocTRES%40,NodeList,ExitCode
```
9. Посмотри вывод:
```bash
less ~/supercomputers/task1/stdio/task1-intel-linpack-<JOBID_INTEL>.out
```
В этом файле ищи строки с размерами `1000`, `1500`, `2000`, `2500`, `3000`, `3500`, а внизу --- секцию `Performance Summary`.
## Что нужно собрать для отчёта
Ниже последовательность, которая даст все обязательные материалы для отчёта и скриншотов.
### Шаг 1. Скрин входа с логином
На login-узле выполни:
```bash
whoami
hostname
date
```
Сделай скрин терминала. На нём должен быть виден логин `tm3u21`.
### Шаг 2. Скрин конфигурации узла и GPU
После завершения CUDA-задачи открой:
```bash
less results/task1-cuda-<JOBID_CUDA>.out
```
В начале файла уже будут:
- `whoami`, `hostname`, `date`;
- `scontrol show job ...`;
- `scontrol show node ...`;
- `lscpu`;
- `nvidia-smi`.
Сделай отдельные скрины с этой информацией.
### Шаг 3. Скрин времени выполнения и числа узлов
Выполни:
```bash
sacct -j <JOBID_CUDA>,<JOBID_INTEL> --format=JobID,JobName,Partition,State,Elapsed,NNodes,AllocTRES%40,NodeList,ExitCode
```
На этом скрине будут:
- время выполнения;
- количество узлов;
- список узлов;
- тип выделенных ресурсов.
### Шаг 4. Вынести численные результаты
Для собственной программы значения бери из файла:
```bash
cat results/task1-cuda-<JOBID_CUDA>.csv
```
Для Intel LINPACK значения времени и GFLOPS бери из:
```bash
less ~/supercomputers/task1/stdio/task1-intel-linpack-<JOBID_INTEL>.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, пришли ошибку, и я быстро подправлю.