Научные вычисления

Параллельные вычисления для науки

Купить в два раза больше серверов - получить в два раза больше скорости? Не всегда. AlphaFold 2 от DeepMind показал 80% GPU efficiency на 128 TPU. Большинство научных кодов деградируют до 30-40% при масштабировании. Разница - в правильных паттернах декомпозиции, балансировки и коммуникации.

  • **Климатическая модель CESM:** 3D domain decomposition атмосферы + океана, 10 000+ MPI задач, weak scaling до ~100K ядер
  • **DistributedDataParallel (PyTorch):** AllReduce градиентов через NCCL, ring-allreduce алгоритм для минимизации коммуникации
  • **FLASH (код для астрофизики):** Adaptive Mesh Refinement с динамической балансировкой через Zoltan, strong scaling до 300K ядер

Domain Decomposition

Задача: смоделировать атмосферу Земли на сетке 1000x1000x100 ячеек. Одному процессу не хватит ни памяти, ни времени. **Domain Decomposition** - разрезать пространственную область на куски и отдать каждый кусок своему процессу. Физика внутри куска независима; взаимодействие только на границах.

**Ghost cells (halo cells):** каждый процесс хранит ещё 1-2 слоя ячеек от соседей. Это позволяет вычислять конечные разности на границе без дополнительных запросов к соседу во время вычислений. Обмен ghost cells происходит раз в шаг симуляции.

Сетка 1000x1000 делится между 4 процессами полосами (1D decomposition). Сколько граничных ячеек нужно обменять между P0 и P1 на каждом шаге?

Load Balancing в HPC

Равные куски пространства - не значит равная работа. В задаче N-body симуляции галактики: в центре тысячи звёзд, на периферии пусто. Если разбить по координатам поровну, центральные процессы работают в 100 раз дольше периферийных. Всё время ожидания - потеря. **Load balancing** - распределить вычислительную нагрузку, не объём данных.

8 процессов выполняют задачу. 7 финишируют за 10 сек, один - за 30 сек. Каково реальное время выполнения параллельной программы?

Communication Patterns: scatter/gather

Коммуникация в MPI-программах - это не просто send/recv. Для разных паттернов существуют коллективные операции, оптимизированные на уровне сети: дерево редукций, алгоритм butterfly для AllReduce, пайплайнинг. Знание паттернов позволяет выбрать правильный MPI-вызов вместо ручной реализации.

**Non-blocking коммуникация:** `MPI_Isend`/`MPI_Irecv` запускают передачу и сразу возвращают управление. Пока данные летят по сети, процесс считает внутреннюю часть. `MPI_Wait` дожидается завершения. Это overlap computation и communication - ключ к высокой эффективности.

Какая операция MPI наиболее подходит для вычисления суммы локальных ошибок (residual) чтобы проверить сходимость итерационного метода, причём результат нужен всем процессам?

Strong vs Weak Scaling

Добавили ещё 100 серверов - программа стала в 100 раз быстрее? Почти никогда. Закон Амдала объясняет почему: последовательная часть кода ограничивает ускорение. Есть два способа оценить параллельную программу: **strong scaling** (та же задача, больше процессов) и **weak scaling** (пропорционально больше задача и процессов).

**Roofline Model:** инструмент для диагностики bottleneck. Ось X - арифметическая интенсивность (FLOP/byte), ось Y - производительность (GFLOPS). Точка программы - либо memory-bound (левее roof), либо compute-bound (правее). Memory-bound код ускоряется от лучшего cache usage, compute-bound - от SIMD/GPU.

Программа имеет 5% последовательного кода (закон Амдала). Какое максимальное ускорение достижимо при любом количестве процессоров?

Паттерны параллельных научных вычислений

  • **Domain Decomposition:** разбить пространственную область на куски + ghost cells для граничного обмена; 2D/3D разбиение лучше 1D по соотношению коммуникация/вычисления
  • **Load Balancing:** равный объём != равная нагрузка; статический partition для однородных задач, work stealing для нерегулярных
  • **Collective Communications:** Scatter/Gather/AllReduce оптимизированы на уровне сети; non-blocking Isend/Irecv перекрывает коммуникацию с вычислениями
  • **Scaling Laws:** strong scaling - быстрее ту же задачу (предел Амдала = 1/s); weak scaling - больше задача за то же время (Густафсон); target efficiency >= 70%

Связанные темы

Параллельные паттерны применяются совместно с HPC инструментами и численными методами.

  • High-Performance Computing: MPI, OpenMP, GPU — Базовые инструменты для реализации этих паттернов
  • Monte Carlo методы — Embarrassingly parallel задача: идеальный strong scaling без коммуникации
  • Численные методы: дифференциальные уравнения — PDE на сетках - главный use case domain decomposition

Вопросы для размышления

  • Почему 2D domain decomposition для 2D сетки эффективнее 1D, хотя обе корректны?
  • Как non-blocking MPI коммуникация изменяет структуру итерационного цикла решателя PDE?
  • При каком условии weak scaling более подходящая метрика чем strong scaling для оценки HPC программы?

Связанные уроки

  • par-01
Параллельные вычисления для науки

0

1

Войти