Съдържание и теми, включени в курса
Въведение в ускорените изчисления с GPU
- Хетерогенни изчисления и архитектура CPU-GPU
- Изпълнение и пространства за памет на CUDA
- Компилиране на CUDA C++ с nvcc и CMake
- Проверка на средата за разработка на GPU
Паралелни алгоритми с Thrust и CUB
- Ускорено сортиране, редуциране и трансформиране от GPU
- Преобразуване на алгоритмите STL за изпълнение на GPU
- Устройствени вектори (device vectors) на Thrust и политики за изпълнение
- Примитиви на CUB за широка гама от потребителски тръбопроводи
Архитектура и управление на паметта за GPU
- Типове глобална, константна и текстура памет
- Експлицитно разпределяне и трансфер на устройствова (device) памет
- Обединена памет (Unified Memory) за опростен достъп до данни
- Коефициенти на паметта и оптимизация на модела на достъп
Асинхронно изпълнение с потоци на CUDA (CUDA Streams)
- Създаване и управление на потоци на CUDA
- Препокриване на изпълнението на ядрата с трансферите на данни
- Управление на зависимостите чрез събития на CUDA (CUDA events)
- Приоритети на потоци и настройка на паралелизма
Писане на персонализирани CUDA ядра
- Модел за програмиране SIMT и изпълнение на warp-ове
- Конфигурация на стартиране на ядро и цикли с решетка (grid-stride loops)
- Индексиране на нишки и многомерни мрежи
- Обработка на грешки и проверки на API-то за изпълнение на CUDA runtime
Йерархия на нишките и модел на изпълнение
- Мрежи (Grids), блокове и нишки в кода на устройството
- Примитиви на ниво warp и операции за гласуване (ballot)
- Синхронизация на ниво блок и бариери
- Анализ на заетостта и използването на ресурсите
Кооперативни групи за гъвкав паралелизъм
- API-то cooperative_groups и типовете групи
- Плитки от блокове на нишки (Thread-block tiles) и tiled_partition
- Кооперативни стартирания на ниво мрежа
- Въздействия за мултимрежова синхронизация
Техники за оптимизация на споделената памет
- Банки за споделена памет и избягване на конфликти между банките
- Стратегии за плочки за матрични операции
- Споделена памет като кеш, управляван от потребителя
- cuda::shared_memory_mdspan за многомерни прегледи
Сливане на ядра и разширени паралелни модели
- Обединяване на множество ядра за намаляване на накладните разходи при стартиране
- Сканиране, редуциране по ключ и сегментирани алгоритми
- Атомни операции и конструкции от данни без ключалки (lock-free)
- Атомни операции, агрегирани на ниво warp, за пропускателна способност
Профилиране и оптимизация с Nsight Systems
- Анализ по времева линия на активността на CPU и GPU
- Идентифициране на тесни места при трансфер на паметта
- Профилиране на производителността и заетостта на ядерата
- Итеративна оптимизация с Nsight Compute
Съвременни функции на C++ в кода за устройство (Device Code) на CUDA
- Lambdas, constexpr и auto в ядерата
- Паралелни алгоритми на C++17 и политики за изпълнение
- Концепции и обхвати на C++20 на устройството (device)
- Поддръжка на C++23 в nvcc и CCCL 3.x
CUDA Graphs и разширен асинхронизъм
- Дефиниране и стартиране на графи на CUDA
- Запис на графи от изпълнението на потоци (streams)
- Обновяване на графи и възли за условно изпълнение
- Намаляване на забавянето при стартиране за йтеративни товари
Шаблони за интеграция със съществуващи приложения
- Запазване на GPU кода зад C++ интерфейси
- Управление на системи с множество GPU и NUMA
- Интегриране на системите за изграждане (build systems) с CMake и CUDA
- Отстраняване на грешки в кода за устройство (device code) с cuda-gdb
Обобщение и най-добри практики
- Избор между Thrust, CUB и персонализирани ядра
- Переносимост на производителността върху различни архитектуры на GPU
- Организация на кода и RAII за ресурси на CUDA
- Следващи стъпки и разширени пътища за обучение по CUDA
Изисквания
- Базови познания по C++ включващи lambdas изрази, шаблони (templates) и STL.
- Познанство със стандартните алгоритми, контейнери и итератори.
- Удобство с цикли, условни оператори и функции.
- Не е необходима предишна опитност с CUDA или програмиране на GPU.
Целева аудитория
- Разработчици на C++, които търсят начини за ускоряване на приложения с интензивни изчисления чрез GPU.
- Инженери по софтуер, преминаващи от програмиране само за CPU към хетерогенно паралелно програмиране.
- Инженери по производителност и количествени разработчици, работещи с големи набори от данни.
Отзиви от участници (3)
Първоначално темпото на треньора ми се стори малко твърде бързо, но след като му дадох обратна връзка по време на обучението, той я прие и забави темпото, без да губи нищо от лекциите. Има добро взаимодействие с аудиторията, много приятен и отворен за дискусии.
Alexandru Ostafi - Siemens
Курс - Advanced C++ : Practical workshop
Машинен превод
Детайлно обяснение, повторение на точките по тихичински начин, който изключително добре подкрепя придобиването на знания. Готовността на Род да провери необикновените и сложни въпроси, които зададохме, за да се увери, че отговорите му са 100% правилни. Освен това, неговата загриженост за обсъждането на предимствата и недостатъците на алтернативните стилове на кодиране, така че да научим не само как да използваме C++ по планиран начин, но и защо трябва да се прави по този начин.
Nick Dillon - cellxica Ltd
Курс - Using C++ in Embedded Systems - Applying C++11/C++14
Машинен превод
Споделянето на опит е ценно и важно знание на учителя.
Carey Fan - Logitech
Курс - C/C++ Secure Coding
Машинен превод