Українська
Підсумки
Висновки
GPU має тисячі простих ядер, згрупованих у потокові мультипроцесори, і швидку пам’ять, але дані потрапляють до нього через повільнішу шину PCIe. Програма CUDA C++ запускає ядро (__global__) сіткою блоків потоків; кожен потік обчислює глобальний індекс із blockIdx, blockDim, threadIdx і перевіряє межі. Хост виділяє пам’ять пристрою, копіює дані, запускає ядро й копіює результат; закріплена пам’ять удвічі прискорює копіювання, а уніфікована спрощує код. Спільна пам’ять і __syncthreads() дозволяють блоку повторно використовувати дані (тайли в множенні матриць) і будувати редукції, а локальні гістограми зменшують конкуренцію атомарних операцій. Потоки CUDA перекривають копіювання з обчисленнями, події вимірюють час на GPU. Бібліотеки Thrust і cuBLAS швидші за власні ядра, а Nsight Systems показує, куди витрачено час. ILGPU дозволяє писати ядра мовою C# без CUDA Toolkit. Чесне порівняння з CPU враховує копіювання: GPU виграє в задачах із великою кількістю обчислень на байт даних.
Питання для самоперевірки
- Чим архітектура GPU відрізняється від архітектури CPU? Що таке SM і варп?
- Що означає модель SIMT? Чому розгалуження всередині варпа сповільнює ядро?
- З яких частин складається платформа CUDA? Що таке compute capability?
- Як установити CUDA у WSL2 і чому не можна встановлювати драйвер Linux?
- Чим відрізняються кваліфікатори
__global__,__device__і__host__? - Опишіть ієрархію сітка – блок – потік. Як обчислити глобальний індекс потоку?
- Навіщо перевіряти межі в ядрі та як обчислити кількість блоків?
- Які кроки виконує програма для обміну даними між хостом і пристроєм?
- Чим закріплена пам’ять відрізняється від звичайної? Що таке уніфікована пам’ять?
- Які види пам’яті пристрою існують? Що таке об’єднання звертань?
- Як зібрати проєкт CUDA за допомогою CMake? Що задає
CMAKE_CUDA_ARCHITECTURES? - Як перевіряти помилки запуску та виконання ядра?
- Що таке тайлінг і навіщо в ньому два виклики
__syncthreads()? - Як виконується паралельна редукція? Чому послідовна адресація швидша?
- Навіщо локальні гістограми у спільній пам’яті?
- Що таке потоки CUDA і як перекрити копіювання з обчисленнями?
- Як правильно виміряти час роботи ядра?
- Що показує Nsight Systems?
- Які основні класи ILGPU і які обмеження мають ядра ILGPU?
- Коли обчислення на GPU вигідні, а коли – ні?
Корисні посилання
- Посібник з програмування CUDA: https://docs.nvidia.com/cuda/cuda-programming-guide/
- Посібник з найкращих практик CUDA: https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html
- CUDA у WSL: https://docs.nvidia.com/cuda/wsl-user-guide/index.html
- CUDA Toolkit: https://developer.nvidia.com/cuda-toolkit
- Compute capability GPU NVIDIA: https://developer.nvidia.com/cuda-gpus
- Nsight Systems: https://docs.nvidia.com/nsight-systems/
- Модуль CMake FindCUDAToolkit: https://cmake.org/cmake/help/latest/module/FindCUDAToolkit.html
- Проєкти CUDA у CLion: https://www.jetbrains.com/help/clion/cuda-projects.html
- Документація ILGPU: https://ilgpu.net/docs/