243 lines
8.7 KiB
Markdown
243 lines
8.7 KiB
Markdown
# Задание 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/linpack/xlinpack_xeon64`,
|
||
то нужный каталог для запуска:
|
||
`/home/ipmmstudy1/tm3u21/LINPACK/benchmarks/linpack`.
|
||
|
||
6. Подготовь этот каталог, как в примере:
|
||
|
||
```bash
|
||
cd <НУЖНЫЙ_КАТАЛОГ_С_XLINPACK>
|
||
mkdir -p stdio
|
||
chmod +x *
|
||
chmod -x *.*
|
||
```
|
||
|
||
7. Отправь batch-задачу с явным указанием `LINPACK_DIR`:
|
||
|
||
```bash
|
||
cd ~/supercomputers/task1
|
||
sbatch --export=ALL,LINPACK_DIR=<НУЖНЫЙ_КАТАЛОГ_С_XLINPACK> scripts/run_intel_linpack.slurm
|
||
```
|
||
|
||
8. Проверь статус:
|
||
|
||
```bash
|
||
sacct -j <JOBID_INTEL> --format=JobID,JobName,Partition,State,Start,End,Elapsed,NNodes,AllocTRES%40,NodeList,ExitCode
|
||
```
|
||
|
||
9. Посмотри вывод:
|
||
|
||
```bash
|
||
less <НУЖНЫЙ_КАТАЛОГ_С_XLINPACK>/stdio/task1-intel-linpack-<JOBID_INTEL>.out
|
||
```
|
||
|
||
## Что нужно собрать для отчёта
|
||
|
||
Ниже последовательность, которая даст все обязательные материалы для отчёта и скриншотов.
|
||
|
||
### Шаг 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 results/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, пришли ошибку, и я быстро подправлю.
|