Введение
Графический процессор (GPU, Graphics Processing Unit) — специализированный вычислительный чип, изначально созданный для рендеринга 2D/3D‑графики и обработки видео. Сегодня GPU — ключевой элемент не только игровых систем и рабочих станций для дизайна, но и суперкомпьютеров, дата‑центров для ИИ, майнинга, научных расчётов.
В статье рассмотрены:
- эволюция и базовые принципы архитектуры GPU;
- устройство шейдерных блоков и конвейера рендеринга;
- переход от фиксированной функциональности к унифицированным шейдерам;
- концепция GPGPU (General‑Purpose computing on GPU);
- программные модели и API для вычислений на GPU;
- примеры применения и перспективы.
1. Эволюция архитектуры GPU
1.1. От фиксированных функций к программируемым конвейерам
- 1990‑е: GPU с фиксированными блоками (геометрия, текстурирование, блендинг).
- 2001–2004: появление программируемых вершинных шейдеров (VS).
- 2003–2006: пиксельные шейдеры (PS) и первые унифицированные архитектуры (NVIDIA GeForce 8, AMD R600).
- 2010‑е: массовое внедрение унифицированных шейдерных ядер, поддержка вычислений общего назначения (CUDA, OpenCL).
1.2. Современные тенденции
- Увеличение числа вычислительных ядер (тысячи ALU на чип).
- Интеграция тензорных ядер (для ИИ) и RT‑ядер (для трассировки лучей).
- Гибридные CPU+GPU чипы (APU, SoC).
- Поддержка памяти HBM (High Bandwidth Memory) для высокой пропускной способности.
2. Базовая архитектура современного GPU
2.1. Иерархия компонентов
- GPU Die — кристалл с миллиардами транзисторов.
- Compute Units (CU) / Streaming Multiprocessors (SM) — основные вычислительные блоки (десятки на чип).
- Шейдерные ядра (ALU) — арифметико‑логические устройства внутри CU/SM (сотни–тысячи).
- Кэш‑память (L1, L2, иногда L3) и регистровый файл.
- Контроллеры памяти (интерфейсы к GDDR6/HBM2/HBM3).
- Блоки фиксированной функциональности (ROP, TMU, HW scheduler).
2.2. Compute Unit / Streaming Multiprocessor
- AMD CU:
- 64 векторных ALU (SIMD32 × 2);
- скалярные ALU;
- локальная память (Local Data Share, LDS);
- кэш L1/Texture.
- NVIDIA SM:
- 128 CUDA‑ядер (FP32);
- тензорные ядра (для матричных операций);
- RT‑ядра (для трассировки лучей);
- регистровый файл (4 КБ регистров на SM);
- кэш L1/Texture и общий L2.
2.3. Память и пропускная способность
- VRAM (GDDR6, GDDR6X, HBM2, HBM3):
- пропускная способность: 300–1000+ ГБ/с;
- объём: 4–48 ГБ (в дата‑центрах — до 80 ГБ).
- Кэши:
- L1: 16–128 КБ на CU/SM;
- L2: 2–8 МБ (общий для всех CU/SM);
- Texture Cache: оптимизирован для 2D‑фильтрации.
3. Шейдерные блоки и конвейер рендеринга
3.1. Этапы графического конвейера
- Входная сборка (Input Assembler) — сборка вершин из буферов.
- Вершинный шейдер (Vertex Shader, VS) — преобразование координат, нормалей, текстурных координат.
- Тесселяция (Tessellation) — адаптивное разбиение поверхностей.
- Геометрический шейдер (Geometry Shader, GS) — генерация новых примитивов.
- Потоковая сборка (Stream Output) — запись промежуточных данных.
- Растеризация (Rasterizer) — преобразование примитивов в фрагменты (пиксели).
- Пиксельный/фрагментный шейдер (Pixel/Fragment Shader, PS/FS) — расчёт цвета, освещения, текстур.
- Тестовая стадия (Depth/Stencil Test) — отсечение невидимых фрагментов.
- Блендинг (Blending) — смешивание цветов с буфером кадра.
- ROP (Render Output Units) — финальная запись в буфер кадра (MSAA, сжатие).
3.2. Унифицированные шейдеры
- Все стадии конвейера выполняются на универсальных шейдерных ядрах (ALU).
- Шейдерные программы компилируются в машинные инструкции GPU.
- Ресурсы (регистры, кэш) динамически распределяются между стадиями.
3.3. Типы шейдерных программ
- Vertex Shader — обработка вершин (трансформации, анимация).
- Pixel Shader — расчёт цвета пикселя (материалы, освещение).
- Compute Shader — произвольные вычисления (не связаны с рендерингом).
- Hull/Domain Shader — тесселяция.
- Geometry Shader — генерация геометрии.
- Ray Generation Shader — трассировка лучей (в RT‑конвейере).
4. Вычисления общего назначения на GPU (GPGPU)
4.1. Почему GPU подходит для GPGPU?
- Массовая параллельность: тысячи ALU для SIMD/SIMT‑операций.
- Высокая пропускная способность памяти: 10–100× выше, чем у CPU.
- Энергоэффективность для задач с регулярными вычислениями.
4.2. Ограничения GPU
- Низкая латентность не критична, но высокая задержка доступа к памяти.
- Ограниченная поддержка ветвлений (warp divergence).
- Сложность программирования (управление памятью, синхронизацией).
- Не все задачи параллелизуются (например, рекурсия).
4.3. Типичные задачи для GPGPU
- Глубокое обучение (матричные умножения, CNN, RNN).
- Научные расчёты (CFD, молекулярная динамика, криптография).
- Обработка изображений/видео (фильтрация, кодирование).
- Финансовая аналитика (Monte Carlo, риск‑моделирование).
- Майнинг криптовалют (хеш‑функции).
5. Программные модели и API
5.1. CUDA (NVIDIA)
- Язык: C/C++ с расширениями (
__global__,__device__). - Модель:
- ядро (kernel) — функция, выполняемая на GPU;
- grid → block → thread (иерархия потоков);
- warp (32 thread) — минимальная единица исполнения.
- Память: глобальная, разделяемая, константная, локальная.
- Инструменты: cuBLAS, cuFFT, NCCL, TensorRT.
5.2. OpenCL
- Кросс‑платформенный (NVIDIA, AMD, Intel, ARM).
- C99‑подобный язык с расширениями.
- Модель:
- контекст → очередь команд → ядро;
- NDRange (Global/Local size).
- Гибкость: поддержка CPU, GPU, FPGA.
5.3. Vulkan Compute
- Низкоуровневый API (меньше накладных расходов).
- Ядро (compute shader) на языке SPIR‑V.
- Синхронизация через барьеры и события.
- Интеграция с графическим конвейером.
5.4. DirectCompute (Microsoft)
- Часть DirectX 11/12.
- HLSL (High Level Shader Language) для ядер.
- Интеграция с D3D‑рендерингом.
5.5. SYCL (Khronos)
- C++‑оболочка над OpenCL.
- Единая кодовая база для CPU/GPU/FPGA.
6. Оптимизации для GPGPU
6.1. Управление памятью
- Коалесцированный доступ (coalesced memory access) — чтение



