Übersicht über Compute-Shader

Ein Compute-Shader ist eine programmierbare Shaderphase, die Microsoft Direct3D 11 über die Grafikprogrammierung hinaus erweitert. Die Compute-Shadertechnologie wird auch als DirectCompute-Technologie bezeichnet.

Wie bei anderen programmierbaren Shadern (z. B. Vertex- und Geometry-Shadern) wird ein Compute-Shader mit HLSL entworfen und implementiert, aber genau dort, wo die Ähnlichkeit endet. Ein Compute-Shader bietet Hochgeschwindigkeitscomputing für allgemeine Zwecke und nutzt die große Anzahl paralleler Prozessoren auf der Grafikverarbeitungseinheit (GRAPHICS Processing Unit, GPU). Der Compute-Shader bietet Funktionen zur Speicherfreigabe und Threadsynchronisierung, um effektivere parallele Programmiermethoden zu ermöglichen. Sie rufen die ID3D11DeviceContext::D ispatch- oder ID3D11DeviceContext::D ispatchIndirect-Methode auf, um Befehle in einem Compute-Shader auszuführen. Ein Compute-Shader kann in vielen Threads parallel ausgeführt werden.

Verwenden von Compute-Shader auf Direct3D 10.x-Hardware

Ein Compute-Shader in Microsoft Direct3D 10 wird auch als DirectCompute 4.x bezeichnet.

Wenn Sie die Direct3D 11-API und aktualisierte Treiber verwenden, kann die Direct3D-Hardware der Featureebene 10 und 10.1 optional eine eingeschränkte Form von DirectCompute unterstützen, die die profile cs_4_0 und cs_4_1 verwendet. Beachten Sie bei der Verwendung von DirectCompute auf dieser Hardware die folgenden Einschränkungen:

  • Die maximale Anzahl von Threads ist auf D3D11_CS_4_X_THREAD_GROUP_MAX_THREADS_PER_GROUP (768) pro Gruppe beschränkt.
  • Die X- und Y-Dimension von Numthreads ist auf D3D11_CS_4_X_THREAD_GROUP_MAX_X (768) und D3D11_CS_4_X_THREAD_GROUP_MAX_Y (768) beschränkt.
  • Die Z-Dimension von Numthreads ist auf 1 beschränkt.
  • Die Z-Dimension des Versands ist auf D3D11_CS_4_X_DISPATCH_MAX_THREAD_GROUPS_IN_Z_DIMENSION (1) beschränkt.
  • Nur eine Ansicht mit ungeordnetem Zugriff kann an den Shader gebunden werden (D3D11_CS_4_X_UAV_REGISTER_COUNT ist 1).
  • Nur RWStructuredBuffers und RWByteAddressBuffers sind als ungeordnete Zugriffssichten verfügbar.
  • Ein Thread kann nur auf seine eigene Region im freigegebenen Arbeitsspeicher zugreifen, um zu schreiben, obwohl er von jedem Speicherort aus lesen kann.
  • SV_GroupIndex oder SV_GroupThreadID müssen verwendet werden, wenn sie zum Schreiben auf gruppenfreigaben Arbeitsspeicher zugreifen.
  • Gruppenfreigabespeicher ist auf 16 KB pro Gruppe beschränkt.
  • Ein einzelner Thread ist auf eine 256-Byte-Region mit gruppenfreigabem Arbeitsspeicher zum Schreiben beschränkt.
  • Es sind keine atomischen Anweisungen verfügbar.
  • Es sind keine Werte mit doppelter Genauigkeit verfügbar.

Verwenden von Compute-Shader auf Direct3D 11.x-Hardware

Ein Compute-Shader in Direct3D 11 wird auch als DirectCompute 5.0 bezeichnet.

Wenn Sie DirectCompute mit cs_5_0 Profilen verwenden, sollten Sie folgendes beachten:

  • Die maximale Anzahl von Threads ist auf D3D11_CS_THREAD_GROUP_MAX_THREADS_PER_GROUP (1024) pro Gruppe beschränkt.
  • Die X- und Y-Dimension von Numthreads ist auf D3D11_CS_THREAD_GROUP_MAX_X (1024) und D3D11_CS_THREAD_GROUP_MAX_Y (1024) beschränkt.
  • Die Z-Dimension von Numthreads ist auf D3D11_CS_THREAD_GROUP_MAX_Z (64) beschränkt.
  • Die maximale Dimension des Versands ist auf D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION (65535) beschränkt.
  • Die maximale Anzahl von Ansichten mit ungeordnetem Zugriff, die an einen Shader gebunden werden können, ist D3D11_PS_CS_UAV_REGISTER_COUNT (8).
  • Unterstützt RWStructuredBuffers, RWByteAddressBufferund typisierte ungeordnete Zugriffssichten (RWTexture1D, RWTexture2D, RWTexture3D usw.).
  • Atomische Anweisungen sind verfügbar.
  • Möglicherweise ist Unterstützung mit doppelter Genauigkeit verfügbar. Informationen zum Bestimmen, ob doppelte Genauigkeit verfügbar ist, finden Sie unter D3D11_FEATURE_DOUBLES.

In diesem Abschnitt

Thema BESCHREIBUNG
Neue Ressourcentypen
In Direct3D 11 wurden mehrere neue Ressourcentypen hinzugefügt.
Zugreifen auf Ressourcen
Es gibt mehrere Möglichkeiten, auf Ressourcen zuzugreifen.
Atomic Functions
Um auf einen neuen Ressourcentyp oder einen freigegebenen Speicher zuzugreifen, verwenden Sie eine ineinandergreifende Funktion. Verzahnte Funktionen funktionieren garantiert atomar. Das heißt, sie treten garantiert in der programmierten Reihenfolge auf. In diesem Abschnitt werden die atomischen Funktionen aufgeführt.

Grafikpipeline

Vorgehensweise: Erstellen eines Compute-Shaders