CFD на GPU (OpenFOAM‑CUDA): сборки и I/O

Задача страницы. Дать инженерный каркас для запуска CFD‑кейсов на облачных GPU: как собирать/запускать OpenFOAM‑совместимые решатели с CUDA‑ускорением, как разбирать домен на подзадачи (MPI), какие требования к сети/дискам, как строить очереди для Interruptible, какие метрики наблюдать и как посчитать экономику (cells_per_s, Cost_per_million_cells). Страница — входная точка ветки CFD на GPU.

TL;DR

  • GPU‑resident пайплайн: минимизируйте CPU↔GPU копии; переносите линейные решатели/операции на GPU; 1 MPI‑rank = 1 GPU.
  • Масштабирование: внутри узла — NVLink/NVSwitch; межузловое — CUDA‑aware MPI + UCX/RDMA, низкий RTT, правильный pinning. См. https://cloudcompute.ru/solutions/multi-gpu/
  • Мезги и I/O: генерация/конверсия сеток на «тёплом», рабочий scratch на NVMe (processor*/пишущие директории), collated‑I/O снижает число файлов. См. https://cloudcompute.ru/solutions/storage-data/
  • Режимы: tightly‑coupled проды — On‑Demand; массовые свипы/варианты сеток — Interruptible с write‑интервалом ≤ 120 с (идемпотентные шаги). См. https://cloudcompute.ru/solutions/interruptible-patterns/
  • Профили GPU: 24 ГБ (Compact) — малые сетки/свипы; 48 ГБ (Balanced) — база продакшена; 80 ГБ (HQ) — крупные сетки/много фаз/4K пост‑поля.
  • Наблюдаемость: cells_per_s, iteration_time_seconds (p50/p95), residual_{p,U,k,eps}, gpu_utilization, mpi_wait_ratio, rdma_rx/tx_mb_s, io_write_mb_s. См. https://cloudcompute.ru/solutions/monitoring-logging/
  • Экономика: Cost_per_million_cells = (c_gpu * N_nodes * gpus_per_node / U) / (cells_per_s / 1e6); учитывайте стоимость рестартов/хранилища. См. https://cloudcompute.ru/solutions/cost-planner/
  • Практики: collated‑I/O, NVMe‑prefetch, pinned memory, CUDA‑aware MPI, processors/scotch декомпозиция, ограничение частоты writeInterval. См. https://cloudcompute.ru/solutions/performance-tuning/

Сценарии: когда это нужно

  • Стационарные задачи (simpleFoam/аналог): устойчивые решатели, высокая доля линейной алгебры → отличный выигрыш на GPU.
  • Неустойчивые (pisoFoam/pimpleFoam): много шагов по времени; важна стабильная сеть и предсказуемый I/O.
  • Турбулентность/многофазность: большие объёмы полей; критично грамотное I/O и VRAM.
  • Параметрические свипы: сетки, режимы обтекания, материалы → много независимых коротких прогонов (Interruptible идеально).
  • Гибридные пайплайны: CFD → пост‑обработка/рендер/видео. См. https://cloudcompute.ru/solutions/rendering/ и https://cloudcompute.ru/solutions/rendering/video-transcode/

Архитектуры/пайплайны A) Одноузловой multi‑GPU (NVLink) — быстрый старт

[Warm Storage (case)] -> [Prefetch -> NVMe scratch] -> [decomposePar] -> [solver -parallel (GPU backends)]
 | |
 [processor*/] [write/funcObjects -> warm/cold]

Ключи: 1 MPI‑rank на 1 GPU; collated‑I/O, NVMe‑scratch для processor‑директорий; write‑интервал подобран под ≤ 120 с.

B) Многоузловой MPI + RDMA — плотный обмен

[Warm Storage] -> [Stager] -> [NVMe per node]
 |
 +-------------------+-------------------+
 | (UCX/RDMA Interconnect) |
 [Node #1 GPUxN] <=====> ... <=====> [Node #M GPUxN]
 | |
 srun/mpirun (CUDA-aware, 1 rank/GPU) [collated writer]
 --------------> [Scheduler/Queue] <---/

Ключи: RDMA, bind ранков к NUMA, избегать «тонких» субдоменов (ухудшают отношение вычисления/коммуникации).

C) Свипы/варианты сеток (Interruptible)

[Mesh variants/Re] -> [Sharder] -> [Job Queue (chunk ≤120 s, retries)] -> [GPU Workers] -> [Reducer/QA] -> [Publish]

Ключи: write‑интервалы ≈ 60–120 с; идемпотентные шаги; сбор результатов после падов

Профили GPU/VRAM/ориентиры

**Профиль** **VRAM** **Типовые кейсы CFD** **Режим** **Отн. throughput (≈)** **Примечания**
**24 ГБ (Compact)** 24 ГБ Малые/средние сетки, свипы, однопазовые On‑Demand / Interruptible 1.0 Отличен для массовых независимых прогонов
**48 ГБ (Balanced)** 48 ГБ Средние/крупные сетки, стационар/нестационар Оба 1.5–1.8 Базовый профиль продакшена
**80 ГБ (HQ)** 80 ГБ Очень крупные сетки/много фаз/много полей Оба 2.2–2.6 Возможен **MIG**‑шардинг для свипов:

Оценки относительны; итог зависит от решателя, размера сетки и схем дискретизации.

Конфиги и скелеты

1) system/controlDict (runtime write и collated‑I/O)

/* system/controlDict */
application simpleFoam; // или pimpleFoam/pisoFoam
startFrom latestTime;
startTime 0;
stopAt endTime;
endTime 1000;
deltaT 1;
writeControl runtime;
writeInterval 60; // ≤ 120 c для устойчивых рестартов (Interruptible)
purgeWrite 3;
writeFormat binary;
writeCompression on;
functions
{
 residuals
 {
 type residuals;
 libs ("libutilityFunctionObjects.so");
 fields (p U k epsilon);
 writeControl timeStep;
 writeInterval 10;
 }
}
optimisationSwitches
{
 fileHandler collated; // уменьшить количество файлов
}

2) system/fvSchemes (типовой GPU‑friendly)

/* system/fvSchemes */
ddtSchemes
{
 default Euler;
}
divSchemes
{
 div(phi,U) Gauss linearUpwind grad(U);
 div(phi,k) Gauss upwind;
 div(phi,epsilon) Gauss upwind;
 div(phi,omega) Gauss upwind;
}
laplacianSchemes
{
 default Gauss linear corrected;
}
interpolationSchemes
{
 default linear;
}
snGradSchemes
{
 default corrected;
}

3) system/fvSolution (линейные решатели, GPU‑бекенд)

/* system/fvSolution */
solvers
{
 p
 {
 solver GAMG; // многосеточный
 tolerance 1e-8;
 relTol 0.01;
 smoother DICGaussSeidel;
 nCellsInCoarsestLevel 10;
 device GPU; // использовать GPU-бекенд, если доступен
 }
 U
 {
 solver smoothSolver;
 smoother symGaussSeidel;
 tolerance 1e-7;
 relTol 0.1;
 device GPU; // перенос на GPU
 }
}
PISO
{
 nCorrectors 2;
 nNonOrthogonalCorrectors 0;
}
PIMPLE
{
 nOuterCorrectors 2;
 nCorrectors 1;
 nNonOrthogonalCorrectors 0;
}

4) system/decomposeParDict (1 rank = 1 GPU)

/* system/decomposeParDict */
numberOfSubdomains 8; // = ranks = GPUs
method scotch;
distributed yes;
roots ( "node01:/nvme/case" "node02:/nvme/case" ); // при многоузловом запуске

5) Многоузловой запуск (Slurm + CUDA‑aware MPI/UCX)

#!/bin/bash
#SBATCH -J ofoam_gpu
#SBATCH -N 2
#SBATCH --gpus-per-node=4
#SBATCH -p gpu
#SBATCH -t 04:00:00
#SBATCH --exclusive
module load cuda mpi
# UCX/RDMA — адаптируйте под вашу сеть
export UCX_TLS=rc,ud,sm,self,gdr,cuda_copy,cuda_ipc
export UCX_NET_DEVICES=mlx5_0:1
# Подготовка
foamDictionary -entry optimisationSwitches/fileHandler -set collated system/controlDict
decomposePar -force
# Запуск решателя
srun --mpi=pmix_v3 
 simpleFoam -parallel -case /nvme/case > log.simpleFoam
# Сбор результатов
reconstructPar -latestTime

6) Docker/Compose — одноузловой воркер

services:
 ofoam-worker:
 image: registry.local/openfoam-gpu:latest
 deploy:
 resources:
 reservations:
 devices: [{ capabilities: ["gpu"] }]
 volumes:
 - /mnt/warm/case:/case
 - /nvme:/nvme
 command: >
 bash -lc "
 rsync -a /case/ /nvme/case/ &&
 cd /nvme/case &&
 decomposePar &&
 mpirun -np 4 --bind-to numa --map-by ppr:1:gpu
 simpleFoam -parallel &&
 reconstructPar -latestTime"
 environment:
 - TMPDIR=/nvme/tmp

7) YAML‑спека очереди (универсально)

job:
 name: "cfd_airfoil_re5e5_gpu"
 mode: "on-demand" # on-demand | interruptible
 nodes: 2
 gpus_per_node: 4
 gpu_profile: "48GB-Balanced"
 network: "rdma"
 io:
 prefetch: ["/warm/cases/airfoil/"]
 scratch: "/nvme/case"
 write_interval_seconds: 60
 run:
 solver: "simpleFoam" # или pimpleFoam/pisoFoam
 decompose:
 method: "scotch"
 ranks: 8
 mpi:
 enable: true
 map_by: "ppr:1:gpu"
 hooks:
 on_start: ["python /scripts/prefetch.py"]
 on_write: ["python /scripts/register_time.py"]
 on_failure: ["python /scripts/requeue.py --backoff"]
``` **Наблюдаемость/метрики/алерты**

База:[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/?utm_source=chatgpt.com) и[ https://cloudcompute.ru/solutions/llm-inference/observability/](https://cloudcompute.ru/solutions/llm-inference/observability/?utm_source=chatgpt.com)

**Ключевые метрики CFD:**

- **Производительность:** cells\_per\_s, iterations\_per\_s, iteration\_time\_seconds (p50/p95), CourantNumber.
- **Сходимость:** residual\_p, residual\_Ux/Uy/Uz, residual\_k, residual\_epsilon (или другие).
- **GPU:** gpu\_utilization, gpu\_memory\_used\_bytes, sm\_occupancy, gpu\_power\_watts.
- **Сеть:** mpi\_wait\_ratio, rdma\_rx\_mb\_s, rdma\_tx\_mb\_s, allreduce\_time\_ms.
- **Диск/I‑O:** io\_read\_mb\_s, io\_write\_mb\_s, write\_seconds, nvme\_usage\_bytes, collated\_flush\_seconds.
- **Очередь:** job\_queue\_depth, tasks\_inflight, retry\_total.

**Алерты:**

- p95 iteration\_time\_seconds растёт &gt; X% к эталону.
- mpi\_wait\_ratio &gt; порога при низком gpu\_utilization → сетевое/распиновка ранков.
- write\_seconds &gt; интервала → риск потери прогресса на **Interruptible**.
- gpu\_memory\_used\_bytes → VRAM‑предел → снизить поля/параллелизм/размер домена или перейти на 80 ГБ.
- Сходимость «застыла»: residual\_\* не снижается N итераций → QC/авто‑стоп.

## **Экономика и формулы**

См.[ https://cloudcompute.ru/solutions/cost-planner/](https://cloudcompute.ru/solutions/cost-planner/?utm_source=chatgpt.com) и <https://cloudcompute.ru/solutions/throughput-vs-latency/>

**Определения:**

Throughput\_cells\_per\_s = cells\_per\_s

Cost\_total = ((c\_gpu \* N\_nodes \* gpus\_per\_node) \* t\_run\_hours) / U \* r + Cost\_storage

Cost\_per\_million\_cells = (c\_gpu \* N\_nodes \* gpus\_per\_node / U) / (Throughput\_cells\_per\_s / 1e6)

Cost\_per\_case = Cost\_total

**Масштабирование:**

Speedup(N) = T1 / TN

Scale\_eff(N) = Speedup(N) / N

Выбирайте N, где Scale\_eff(N) остаётся приемлемой, а Cost\_per\_million\_cells — минимальной.

**Interruptible‑свип (K кейсов):**

Total\_cost = Σ\_i ( (c\_gpu \* t\_i / 3600) / U \* r\_i ) + Storage\_cost

## **Практики производительности**

- **1 rank = 1 GPU**, NUMA‑пиннинг, CUDA‑aware MPI, UCX с GDR; избегайте «узких» сабдоменов.
- **Collated‑I/O** + NVMe‑scratch: меньше файлов, быстрее запись/чтение, write‑behind в «тёплое».
- **Декомпозиция:** scotch/metis для баланса; processors — если известна форма домена.
- **Схемы:** bounded/лимитированные градиенты и upwind/linearUpwind — предсказуемая сходимость.
- **Память:** следите за числом полей/форматом (binary + compression), чистите временные директории.
- **Write‑интервалы:** ≤ 120 с для устойчивых рестартов; purgeWrite для контроля места.
- **Контейнеры:** фиксируйте версии решателей/библиотек/драйверов. См. <https://cloudcompute.ru/solutions/containers-ci-cd/>

**Безопасность/политики**

См.[ https://cloudcompute.ru/solutions/security/](https://cloudcompute.ru/solutions/security/?utm_source=chatgpt.com)

- **Данные/кейсы:** приватные сетки/геометрии в изолированных проектах; доступ по временным токенам; no‑list бакетов.
- **Секреты:** токены хранилищ/репозиториев — через секрет‑хранилище; не логировать.
- **Сеть:** egress по allow‑list; RDMA‑пулы изолированы; аудит подключений.
- **Ретеншн:** промежуточные processor\*/time автоочисткой; мастера/итоги — в «холодное».
- **Аудит:** кто запускал, какие версии/параметры/сетку публиковал.

**Траблшутинг (симптом → причина → решение)**

<table><tbody><tr><td>**Симптом**

</td><td>**Возможная причина**

</td><td>**Решение**

</td></tr><tr><td>Сходимость «стоит»

</td><td>Схемы/шаг по времени избыточны

</td><td>Уменьшить deltaT/усилить upwind/ограничители; проверить CourantNumber

</td></tr><tr><td>Взрыв остатков на старте

</td><td>Плохая сетка/качество

</td><td>Улучшить сетку/сгладить; проверить non‑orthogonality/скошенность

</td></tr><tr><td>Низкий gpu\_utilization, высокий mpi\_wait\_ratio

</td><td>Неудачная декомпозиция/нет RDMA

</td><td>SCOTCH/METIS, 1 rank/GPU, включить RDMA/UCX, NUMA‑пиннинг

</td></tr><tr><td>Письмо времени длится минуты

</td><td>Пишем на удалённое/много файлов

</td><td>Collated‑I/O, NVMe‑scratch, реже writeInterval, сжатие binary

</td></tr><tr><td>OOM VRAM

</td><td>Слишком много полей/слишком крупный домен

</td><td>Снизить число полей, перейти на 48–80 ГБ, уменьшить домен/параллелизм

</td></tr><tr><td>«Пиление» iteration\_time

</td><td>Холодный кэш/конкуренция I/O

</td><td>Prefetch на NVMe, исключить конкурентов, pinned memory

</td></tr><tr><td>Не растёт скорость с узлами

</td><td>Барьеры коммуникаций

</td><td>Увеличить размер сабдоменов/работы на ранг; снизить N; проверить MTU/топологию

</td></tr><tr><td>Зависание при реконструкции

</td><td>Нет места/сетевые тайм‑ауты

</td><td>Реконструировать по частям, чистить лишние времена, проверить purgeWrite

</td></tr></tbody></table>

## **Как запустить в cloudcompute.ru**

1. **Шаблон**:[ https://cloudcompute.ru/solutions/templates/](https://cloudcompute.ru/solutions/templates/?utm_source=chatgpt.com)
 - «CFD OpenFOAM‑CUDA (single/multi‑GPU)» — быстрый старт.
 - «HPC MPI (Slurm/K8S)» — многоузловые задания с RDMA.
2. **Профиль GPU**: 24/48/80 ГБ по таблице; крупные сетки/много полей — 80 ГБ (HQ); свипы — 24/48 ГБ или **MIG**. См. <https://cloudcompute.ru/solutions/mig/>
3. **Режим**:
 
 - Tightly‑coupled проды — **On‑Demand**.
 - Свипы/варианты — **Interruptible** (write‑интервал ≤ 120 с, ретраи). См. <https://cloudcompute.ru/solutions/interruptible-patterns/>
4. **Сеть/диск**: RDMA‑пулы для межузлового; NVMe‑scratch для processor\*/time; «тёплое/холодное» — по политике. См.[ https://cloudcompute.ru/solutions/storage-data/](https://cloudcompute.ru/solutions/storage-data/?utm_source=chatgpt.com)
5. **Контейнеры/CI**: закрепите версии решателей/библиотек/драйверов; smoke‑бенч на 1/2/М узлах. См. <https://cloudcompute.ru/solutions/containers-ci-cd/>
6. **Наблюдаемость/алерты**: дашборды GPU/сети/диска + cells\_per\_s, iteration\_time\_seconds, residual\_\*. См.[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/?utm_source=chatgpt.com)

**Чек‑лист перед продом**

- 1 rank = 1 GPU; CUDA‑aware MPI/UCX включены; NUMA‑пиннинг задан.
- NVMe‑scratch подключён; collated‑I/O активен; writeInterval ≤ 120 с.
- Декомпозиция scotch/metis сбалансирована; форма сабдоменов адекватна.
- Метрики и алерты: cells\_per\_s, p95 iteration\_time\_seconds, gpu\_utilization, mpi\_wait\_ratio, io\_\*.
- Экономика: Cost\_per\_million\_cells и Cost\_per\_case посчитаны для выбранного масштаба.
- Политики безопасности/ретенции применены; логи без секретов.
- Версии контейнера/библиотек зафиксированы; smoke‑бенч на 1/2/М узлах прошёл.

**Навигация**

- Хаб HPC: <https://cloudcompute.ru/solutions/hpc/>
- Родственные приложения:
 
 - GROMACS: <https://cloudcompute.ru/solutions/hpc/gromacs/>
 - LAMMPS: <https://cloudcompute.ru/solutions/hpc/lammps/>
 - NAMD/AMBER: <https://cloudcompute.ru/solutions/hpc/namd/>
 - AutoDock‑GPU: <https://cloudcompute.ru/solutions/hpc/autodock/>
 - Parabricks (геномика): <https://cloudcompute.ru/solutions/hpc/parabricks/>
 - Монте‑Карло: <https://cloudcompute.ru/solutions/hpc/monte-carlo/>
 - Граф‑аналитика: <https://cloudcompute.ru/solutions/hpc/graph-analytics/>
 - Линал: <https://cloudcompute.ru/solutions/hpc/linear-algebra/>
- Сквозные и вспомогательные:
 
 - Multi‑GPU/топологии:[ https://cloudcompute.ru/solutions/multi-gpu/](https://cloudcompute.ru/solutions/multi-gpu/?utm_source=chatgpt.com) • MIG: <https://cloudcompute.ru/solutions/mig/>
 - Данные/хранилище:[ https://cloudcompute.ru/solutions/storage-data/](https://cloudcompute.ru/solutions/storage-data/?utm_source=chatgpt.com)
 - Контейнеры/CI/CD: <https://cloudcompute.ru/solutions/containers-ci-cd/>
 - Мониторинг/логи:[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/?utm_source=chatgpt.com)
 - Наблюдаемость:[ https://cloudcompute.ru/solutions/llm-inference/observability/](https://cloudcompute.ru/solutions/llm-inference/observability/?utm_source=chatgpt.com)
 - Оптимизация вычислений:[ https://cloudcompute.ru/solutions/performance-tuning/](https://cloudcompute.ru/solutions/performance-tuning/?utm_source=chatgpt.com) • <https://cloudcompute.ru/solutions/throughput-vs-latency/>
 - Interruptible‑паттерны: <https://cloudcompute.ru/solutions/interruptible-patterns/>

Готовы запустить?

Запустить GPU-сервер