Вычисления на видеокартах
Графические процессоры (GPU) предоставляют тысячи параллельных вычислительных потоков, поэтому при правильно организованном коде ускорение по сравнению с CPU может достигать ×10–×100. Однако не каждый алгоритм выигрывает от такой архитектуры. На курсе мы разберём, когда GPU-ускорение оправдано, и как извлечь из него максимум производительности.
Помимо разбора архитектуры и синтаксиса GPU-кода (CUDA, OpenCL, Vulkan), курс нацелен на формирование мышления в парадигме массового параллелизма. Мы обсудим, как перенести на GPU даже такие казалось бы линейные алгоритмы как merge-sort и добиться ускорения вплоть до ×100.
API-взаимодействие CPU с GPU мы обсудим лишь обзорно — в практических заданиях его возьмет на себя обёртка-библиотека. Главный акцент будет на коде, исполняемом непосредственно на видеокарте, а не на низкоуровневом управлении копированием памяти и запуском кернелов.
Базовое представление о курсе можно получить посмотрев открытую лекцию «Видеокарты: что они могут? Могут ли они хоть что-то?», однако на курсе темы разбираются гораздо плавнее и глубже, сопровождаются практическими заданиями, а завершает обучение устный экзамен.
Примеры алгоритмов, которые мы реализуем в модели массового параллелизма:
- prefix-sum (scan)
- merge-sort за вместо
- умножение матриц (ядро большинства AI-фреймворков)
- построение BVH-дерева (фундамент современного real-time Ray Tracing)
Пререквизиты:
- умение писать простой C++-код на уровне работы с арифметикой указателей
- понимание асимптотического анализа, базовых алгоритмов и структур данных
- базовые знания многопоточности
- для выполнения заданий достаточно любого ноутбука (видеокарта не требуется, можно тестировать на процессоре)
- для выполнения заданий рекомендуется Ubuntu или Windows, на MacOS потребуются дополнительные усилия
Также на лекциях будут лилипуты и клоуны!
Занятия
12 лекцийЛекция 1
Архитектура CPU, история GPU и GPGPU, введение в OpenCL API

Архитектура CPU, история GPU и GPGPU, введение в OpenCL API
Архитектура CPU, история GPU и GPGPU, введение в OpenCL API
На первой лекции курса обсудим:
- какой уровень C++ и знания алгоритмов ожидается от студентов
- в общих чертах архитектуру CPU чтобы было с чем дальше сравнивать GPU
- Instruction Level Parallelism, Branch Prediction, Cache Lines, Simultaneous Multithreading, Hyper-Threading
- обсудим как работает эксплуатация уязвимостей Meltdown/Spectre
- обсудим SIMD, SSE, AVX intrinsics на примере фрактала Мандельброта
- посмотрим на историю видеокарт и как они пришли от графических задач GPU к задачам вычислений общего назначения GPGPU
- введение в OpenCL API и взглянем на первое домашнее задание на https://github.com/GPGPUCourse
Лекция 2
Архитектура GPU, модель массового параллелизма

Архитектура GPU, модель массового параллелизма
Архитектура GPU, модель массового параллелизма
- Архитектура GPU (на контрасте с CPU)
- Модель массового параллелизма
- code divergence, coalesced memory access
- latency hiding, occupancy, registers pressure/spilling
- Speed of Light (SoL) анализ, профилировщики
- Синтаксис кернелов на OpenCL, CUDA, Vulkan
Лекция 3
Локальная память, суммирование массива

Локальная память, суммирование массива
Локальная память, суммирование массива
- Напоминание ментальной модели
- Local Memory, barrier, bank conflicts
- Суммирование чисел, reduction
Лекция 4
Транспонирование и умножение матриц

Транспонирование и умножение матриц
Транспонирование и умножение матриц
- Транспонирование через local memory (bank conflicts)
- Умножение матриц через local memory
- Tensor Cores, WMMA
- Оптимизации fp8 DeepSeek
- Умножение матриц Методом Штрассена и Виноградова
Лекция 5
Префиксные суммы, scan, битовая арифметика

Префиксные суммы, scan, битовая арифметика
Префиксные суммы, scan, битовая арифметика
- Битовая арифметика
- Префиксная сумма (Scan)
- Как отлаживать
- OpenCL/CUDA самописный эмулятор
Лекция 6
Bitonic sort, radix sort

Bitonic sort, radix sort
Bitonic sort, radix sort
- Результаты соревнования по умножению матриц
- Bitonic sort (битоническая сортировка)
- Radix sort (поразрядная сортировка)
- Как отлаживать
Лекция 7
Merge sort, Coarse-to-Fine схема, Patch Match, Look Up Tables

Merge sort, Coarse-to-Fine схема, Patch Match, Look Up Tables
Merge sort, Coarse-to-Fine схема, Patch Match, Look Up Tables
- Merge sort на GPU (merge path)
- Coarse to Fine схема оптимизаций
- Patch Match алгоритм ретуширования фотографий и построения карт глубины, оптимизация под видеокарты
- Look Up Tables (LUT): поиск соседей в октодереве, маршировка кубов для реконструкции поверхности
Лекция 8
Разреженные матрицы, Системы Непересекающихся Множеств

Разреженные матрицы, Системы Непересекающихся Множеств
Разреженные матрицы, Системы Непересекающихся Множеств
- Разреженные матрицы
- COO, CSR, CSC
- ELL, DIA, HYB
- Система Непересекающихся Множеств (СНМ, Disjoint Set)
Лекция 9
Real-time построение BVH для Ray Tracing

Real-time построение BVH для Ray Tracing
Real-time построение BVH для Ray Tracing
- Ray Tracing, Bounded Volume Hierarchy, AABB
- Z curve, Morton code
- Linear BVH (LBVH), H-PLOC
- Как читать научные статьи
Лекция 10
Signed Distance Functions

Signed Distance Functions
Signed Distance Functions
- Signed Distance Functions
- shadertoy.com
- Ray marching
- Применения в физических симуляциях, глобальном освещении и навигации роботов
Лекция 11
Программная растеризация

Программная растеризация
Программная растеризация
- Вершинный и фрагментный шейдеры
- Растеризация в OpenGL/Vulkan
- Алгоритм Брезенхэма
- Проект Larrabee
- Проект cudaraster
Лекция 12
Как работает Nanite в Unreal Engine 5

Как работает Nanite в Unreal Engine 5
Как работает Nanite в Unreal Engine 5
Лекция будет интересна если вам нравится компьютерная графика, вычислительная геометрия, алгоритмическая инженерия или вас вдохновляет когда кто-то поставил себе священную цель, пошел за мечтой, не растерялся и бескомпромиссно решил задачу "как рисовать высокополигональную геометрию с высоким FPS".
Представьте: gamedev-команда Babazaki разрабатывает игру. 3D-моделлеры создали ПОТРЯСАЮЩИЙ воображение мир: скалы, пещеры, замки, ЦИКЛОПИЧЕСКИХ РАЗМЕРОВ ДЕРЕВО.
Разработчики загрузили это на видеокарту, попытались отрисовать, видеокарта отрисовала 1 FPS и произошел отвал GPU-чипа. Заменили видеокарту - ситуация повторилась. Так сделали 10 раз - игра показала КРАЙНЕ стабильное поведение. Выбросив 11 видеокарт, РАЗРАБОТЧИКИ ЧТО-ТО ЗАПОДОЗРИЛИ, сказали 3D-моделлерам, что современные технологии не могут отрисовать мир из более чем тысячи треугольников. 3D-моделлеры пригорюнились: «Но так мы ничего красивого не создадим... Это будет посредственная игра!»
И шли споры... шли долго... до 2021 года... Как вдруг в переговорку вошел он, Brian Karis, и приободрил он моделлеров, и заговорщицки подмигнул разработчикам, и молвил: «Не дело это идти на компромиссы! Но и FPS хороший нужен! Вы мне высокополигональную геометрию, а я вам - высокий FPS! Мена? Мена!» И пошло, и поехало! И вынул он из-за пазухи конверт, на конверте было написано Unreal Engine 5, а внутри конверта был Nanite!
Обсудим как работает Nanite:
- виртуальные текстуры
- кластеризация графов
- иерархичный Z buffer (Z test)
- репроекция кадров в VR
- deferred rendering
- софтварный растеризатор для ускорения (т.к. реализация в видеодрайверах - СУБОПТИМАЛЬНА, можно лучше)
- упрощение геометрии алгоритмом QSlim (схлопывание ребер)
- и чем же Nanite принципиально отличается от упрощения геометрии и объектов разного LOD (level of details)
Пререквизиты (можно послушать в первых 15 минутах последней лекции ссылка):
- что такое растеризация
- что такое вершинные и фрагментные шейдеры