This commit is contained in:
2026-03-16 17:28:52 +03:00
parent adbad08ae2
commit 9f6793616a
7 changed files with 886 additions and 0 deletions

188
task1/README.md Normal file
View File

@@ -0,0 +1,188 @@
# Задание 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`. Если снова появится ошибка про `gres`, значит её не надо добавлять вручную.
После завершения посмотри:
```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
```bash
sbatch scripts/run_intel_linpack.slurm
```
Проверка статуса и итогов:
```bash
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 на кластере другой, отправь задание так:
```bash
sbatch --export=ALL,LINPACK_DIR=/linux/share/mkl/benchmarks/linpack scripts/run_intel_linpack.slurm
```
## Что нужно собрать для отчёта
Ниже последовательность, которая даст все обязательные материалы для отчёта и скриншотов.
### Шаг 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, пришли ошибку, и я быстро подправлю.