Це перша частина серії постів про програмування 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.

Наступний пост