Архитектура компьютера
Архитектура GPU: SIMD и массивный параллелизм
ChatGPT обрабатывает ваш запрос за 1 секунду. Без GPU это заняло бы 10 минут. Нейронные сети - это огромные матрицы. GPU - это машина для умножения матриц с тысячами ядер. Архитектура GPU - фундамент AI-революции.
- GPT-4 обучен на тысячах NVIDIA A100 GPU
- Stable Diffusion: генерация изображения за ~1 сек на GPU (vs 5 мин на CPU)
- 3D рендеринг: raytracing на GPU в реальном времени
- Майнинг криптовалют - массово-параллельный хеш
CPU vs GPU: разные философии
**CPU** оптимизирован для последовательных задач с низкой задержкой: 8-64 сложных ядра, глубокий OoO, большой кэш. **GPU** оптимизирован для пропускной способности: тысячи простых ядер, простой pipeline, высокая пропускная способность памяти.
**Amdahl's Law:** Если 5% программы строго последовательно, максимальное ускорение = 20×, независимо от числа GPU-ядер. Bottleneck - sequential код на CPU.
Почему GPU имеет во много раз большую полосу памяти, чем CPU?
SIMT и варпы
**SIMT (Single Instruction, Multiple Threads)** - все потоки в группе (warp) выполняют одну инструкцию, но с разными данными. Это ключевая идея GPU-программирования.
**Warp Divergence:** Если в одном варпе часть потоков идёт по `if`, а часть по `else` - обе ветви выполняются последовательно с маскированием неактивных потоков. При возможности - выносить ветвления на уровень блоков.
В варпе из 32 потоков половина идёт по ветке if, половина по else. Как долго это займёт относительно варпа без ветвлений?
Иерархия памяти GPU
**GPU имеет свою иерархию памяти**, оптимизированную для высокой пропускной способности. Правильное использование памяти - ключ к производительности.
**GPU для ML:** Трансформеры (GPT, BERT) - это в основном матричные умножения. Tensor Cores в NVIDIA GPU выполняют 4×4 матричное умножение за 1 такт. H100: 3958 TFLOPS для FP8 - именно поэтому AI требует GPU.
GPU быстрее CPU потому что в нём больше вычислительных ядер. Чем больше FP32-юнитов, тем быстрее любая программа.
Производительность GPU упирается в иерархию памяти, не в количество ядер. HBM bandwidth, shared memory, coalesced access, register pressure определяют реальные FLOPS больше, чем теоретический peak. Tensor Cores ускоряют не «вычисления», а конкретный паттерн matmul - вне его GPU простаивает.
Интуиция «больше параллелизма = быстрее» забывает про memory wall. Naive CUDA kernel часто получает 5-10% от заявленных TFLOPS, потому что warp ждёт данные из global memory (400-800 cycles latency). Roofline-анализ показывает, что почти все ML-нагрузки memory-bound, а не compute-bound. Поэтому FlashAttention переписывает attention под минимизацию HBM-обращений и ускоряет в 2-4 раза без новых FLOPS.
Зачем в CUDA-ядрах использовать shared memory вместо прямого доступа к global memory?
Ключевые идеи
- GPU: тысячи простых ядер vs десятки сложных у CPU
- SIMT: 32 потока (варп) выполняют одну инструкцию с разными данными
- Warp Divergence: ветвления внутри варпа - главный враг производительности
- Shared memory: быстрая on-chip память для данных блока (явное управление)
- Coalesced access: соседние потоки должны читать соседние адреса
Связанные темы
GPU архитектура дополняет CPU - гетерогенные системы.
- I/O и DMA — GPU работает через PCIe DMA для копирования данных CPU↔GPU
- Иерархия памяти — GPU имеет свою многоуровневую иерархию памяти
Вопросы для размышления
- Почему GPU плохо подходит для задач с нерегулярным доступом к памяти (например, обход графа)?
- Как Tensor Cores отличаются от обычных CUDA ядер? Почему они важны для AI?
- Что такое occupancy в CUDA и почему высокий occupancy не всегда означает лучшую производительность?
Связанные уроки
- ca-14 — Многоядерные CPU - базис перед SIMD масштабом GPU
- arch-14-multicore — GPU доводит параллелизм до тысяч лёгких потоков
- arch-16-multicore-programming — CUDA/OpenCL - прикладной уровень поверх SIMT архитектуры
- ml-01-intro — Весь deep learning зависит от матричных вычислений на GPU
- par-01