Вступ до GPU програмування з D3D12: Частина 1 - Початок
Це перша частина серії постів про програмування GPU з використанням D3D12. У цій серії ми розглянемо як і навіщо запускати код на GPU, а також деякі суміжні теми.
Зверніть увагу, що деякі частини можуть оновлюватися, поки серія ще виходить.
Цільова аудиторія
Ця серія призначена для людей, які хочуть познайомитися з програмуванням GPU або вже знайомі з високорівневим графічним API і хочуть ознайомитися з низькорівневим API.
Для розуміння цієї серії вам не потрібно знати D3D11, на відміну від багатьох інших ресурсів, доступних в Інтернеті.
Вимоги
-
C++ – більшість графічних API можна використовувати напряму тільки в C і C++. У цій серії ми будемо використовувати C++, оскільки це спрощує певні речі. Перш ніж ви зможете ефективно використовувати вищезазначені API вам потрібно досягнути певного рівня знань C++.
-
Математика – ця серія торкнеться як графічних так і обчислень загального призначення на сучасних GPU. Щоб програмувати графіку, вам знадобиться гарне розуміння лінійної алгебри.
-
Сучасний GPU – ми використаємо певні функції, які доступні лише на досить сучасних GPU. Мінімальний необхідний GPU: NVIDIA GeForce RTX 20 серія, AMD Radeon RX 6000 серія, Intel ARC.
Для чого програмувати на GPU?
GPU - це скорочення від Graphics Processing Unit. Це дуже поширений компонент, який є практично в будь-якому сучасному комп’ютері/смартфоні/ігровій консолі тощо. Швидше за все, саме за допомогою GPU ви зараз читаєте цей текст.
Перші GPU були розроблені для вирішення конкретної проблеми: рендер 3D-графіки. Але з роками, з розвитком реалістичності 3D-графіки, GPU ставали спроможними вирішувати все біль і більш загальні задачі, що призвело до того, що сучасні GPU часто використовуються для обчислень, які більше не пов’язані з графікою: наукові симуляції, AI, майнінг криптовалют тощо.
Саме тому варто розібратися, чим саме GPU відрізняються від CPU, чому вони використовуються лише в певних випадках і як написати та запускати власний код на GPU.
Чому саме D3D12?
Щоб взаємодіяти з GPU, вам потрібно використовувати те, що зазвичай називають “Графічний API”. Незважаючи на назву, такі API дозволяють запускати будь-яку роботу на GPU, яку GPU взагалі може виконувати, а не лише «Графіку».
На момент написання статті існує багато актуальних графічних API:
- D3D11
– високорівневий API
- доступний тільки на Windows
- Vulkan
– низькорівневий API
- кросплатформний
- D3D12
– низькорівневий API
- доступний тільки на Windows
- Metal
- низькорівневий API
- доступний тільки на платформах Apple
- WebGL
– високорівневий API
- призначений для використання в браузері
- WebGPU
– низькорівневий API
- призначений для використання в браузері
Високорівневі API не були обрані, оскільки багато сучасних функцій GPU, такі як Hardware Accelerated Raytracing або Mesh Shaders, вимагають саме низькорівневих API.
API, призначені для використання в браузері не були обрані, оскільки вони просто імлементуются за допомогою інших API, а тому є більш обмеженими, ніж API на яких воні побудовані.
Серед API які залишилися: Vulkan, D3D12 і Metal, усі 3 підходять для наших цілей. D3D12 серед них було обрано, оскільки він є трохи простішим порівняно з Vulkan і більш доступним порівняно з Metal. Але багато концепцій та ідей є однаковими для цих API.