Share via


UMA-Optimierungen: Barrierefreie CPU-Texturen und Swizzle-Standardtest

UMA-GPUs (Universal Memory Architecture) bieten einige Effizienzvorteile gegenüber diskreten GPUs, insbesondere bei der Optimierung für mobile Geräte. Wenn Ressourcen CPU-Zugriff gewähren, wenn die GPU UMA ist, kann die Menge des Kopierens zwischen CPU und GPU reduziert werden. Es wird zwar nicht empfohlen, Anwendungen blind cpu-Zugriff auf alle Ressourcen in UMA-Designs zu gewähren, aber es gibt Möglichkeiten, die Effizienz zu verbessern, indem den richtigen Ressourcen CPU-Zugriff erteilt wird. Im Gegensatz zu diskreten GPUs kann die CPU technisch gesehen über einen Zeiger auf alle Ressourcen verfügen, auf die die GPU zugreifen kann.

Übersicht über CPU-zugängliche Texturen

CPU-zugängliche Texturen in der Grafikpipeline sind ein Feature der UMA-Architektur, die CPUs Lese- und Schreibzugriff auf Texturen ermöglicht. Auf den häufigeren diskreten GPUs hat die CPU keinen Zugriff auf Texturen in der Grafikpipeline.

Der allgemeine best practice-Rat für Texturen besteht darin, diskrete GPUs zu berücksichtigen. Dies umfasst in der Regel die Schritte im Hochladen von Texturdaten über Puffer, zusammengefasst wie folgt:

  • Kein CPU-Zugriff für die meisten Texturen.
  • Festlegen des Texturlayouts auf D3D12_TEXTURE_LAYOUT_UNKNOWN.
  • Hochladen der Texturen in die GPU mit CopyTextureRegion.

In bestimmten Fällen können CPU und GPU jedoch so häufig mit denselben Daten interagieren, dass Zuordnungstexturen hilfreich sind, um Strom zu sparen oder ein bestimmtes Design für bestimmte Adapter oder Architekturen zu beschleunigen. Anwendungen sollten diese Fälle erkennen und die unnötigen Kopien optimieren. In diesem Fall sollten Sie folgendes berücksichtigen, um eine optimale Leistung zu erzielen:

  • Erst wenn D3D12_FEATURE_DATA_ARCHITECTURE::UMA true ist, beginnen Sie mit der besseren Leistung von Zuordnungstexturen. Achten Sie dann auf CacheCoherentUMA , wenn Sie entscheiden, welche CPU-Cacheeigenschaften auf dem Heap ausgewählt werden sollen.

  • Die Nutzung des CPU-Zugriffs für Texturen ist komplizierter als für Puffer. Die effizientesten Texturlayouts für GPUs werden selten row_major. Tatsächlich können einige GPUs nur row_major Texturen beim Kopieren von Texturdaten unterstützen.

  • UMA-GPUs sollten universell von einer einfachen Optimierung profitieren, um die Ladezeiten des Füllstands zu reduzieren. Nach dem Erkennen von UMA kann die Anwendung die anfängliche CopyTextureRegion optimieren, um Texturen aufzufüllen, die die GPU nicht ändert. Anstatt die Textur in einem Heap mit D3D12_HEAP_TYPE_DEFAULT zu erstellen und die Texturdaten durch zu marshallen, kann die Anwendung WriteToSubresource verwenden, um zu vermeiden, das tatsächliche Texturlayout zu verstehen.

  • In D3D12 sind Texturen, die mit D3D12_TEXTURE_LAYOUT_UNKNOWN und ohne CPU-Zugriff erstellt wurden, die effizientesten für häufiges GPU-Rendering und Sampling. Bei Leistungstests sollten diese Texturen mit D3D12_TEXTURE_LAYOUT_UNKNOWN mit CPU-Zugriff und D3D12_TEXTURE_LAYOUT_STANDARD_SWIZZLE mit CPU-Zugriff und D3D12_TEXTURE_LAYOUT_ROW_MAJOR für adapterübergreifende Unterstützung verglichen werden.

  • Die Verwendung D3D12_TEXTURE_LAYOUT_UNKNOWN mit CPU-Zugriff ermöglicht die Methoden WriteToSubresource, ReadFromSubresource, Map (ohne Anwendungszugriff auf zeiger) und Unmap; kann jedoch die Effizienz des GPU-Zugriffs opfern.

  • Die Verwendung von D3D12_TEXTURE_LAYOUT_STANDARD_SWIZZLE mit CPU-Zugriff ermöglicht WriteToSubresource, ReadFromSubresource, Map (die einen gültigen Zeiger auf die Anwendung zurückgibt) und Unmap. Es kann auch die Effizienz des GPU-Zugriffs mehr als D3D12_TEXTURE_LAYOUT_UNKNOWN mit CPU-Zugriff opfern.

Übersicht über Standard Swizzle

D3D12 (und D3D11.3) führen ein mehrdimensionales Standarddatenlayout ein. Dies geschieht, damit mehrere Verarbeitungseinheiten mit denselben Daten arbeiten können, ohne die Daten zu kopieren oder die Daten zwischen mehreren Layouts zu verschieben. Ein standardisiertes Layout ermöglicht Effizienzgewinne durch Netzwerkeffekte und ermöglicht es Algorithmen, bei einem bestimmten Muster Abkürzungen vorzunehmen.

Eine ausführliche Beschreibung der Texturlayouts finden Sie unter D3D12_TEXTURE_LAYOUT.

Beachten Sie jedoch, dass dieser Standard-Swizzle ein Hardwarefeature ist und möglicherweise nicht von allen GPUs unterstützt wird.

Hintergrundinformationen zum Swizzling finden Sie unter Kurve der Z-Reihenfolge.

APIs

Im Gegensatz zu D3D11.3 unterstützt D3D12 standardmäßig die Texturzuordnung, sodass es nicht erforderlich ist , D3D12_FEATURE_DATA_D3D12_OPTIONS abzufragen. D3D12 unterstützt jedoch nicht immer standard swizzle. Dieses Feature muss mit einem Aufruf von CheckFeatureSupport abgefragt und das Feld StandardSwizzle64KBSupported von D3D12_FEATURE_DATA_D3D12_OPTIONS überprüft werden.

Die folgenden APIs verweisen auf die Texturzuordnung:

Enumerationen

  • D3D12_TEXTURE_LAYOUT : Steuert das Swizzle-Muster der Standardtexturen und aktiviert die Kartenunterstützung für CPU-zugängliche Texturen.

Strukturen

Methoden

Ressourcen und übergeordnete Heaps haben Ausrichtungsanforderungen:

  • D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT (4 MB) für Texturen mit mehreren Beispielen.
  • D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT (64 KB) für Einzelne Beispieltexturen und Puffer.
  • Das Kopieren von linearen Unterressourcen muss an D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT (512 Bytes) ausgerichtet werden, wobei die Zeilenabstandslage an D3D12_TEXTURE_DATA_PITCH_ALIGNMENT (256 Bytes) ausgerichtet wird.
  • Konstante Pufferansichten müssen an D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT (256 Bytes) ausgerichtet sein.

Texturen, die kleiner als 64 KB sind, sollten über CreateCommittedResource verarbeitet werden.

Bei dynamischen Texturen (Texturen, die jeden Frame ändern) schreibt die CPU linear in den Upload-Heap, gefolgt von einem GPU-Kopiervorgang.

Erstellen Sie zum Erstellen dynamischer Ressourcen in der Regel einen großen Puffer in einem Uploadheap (siehe Unterzuweisung innerhalb von Puffern). Um Stagingressourcen zu erstellen, erstellen Sie einen großen Puffer in einem Readback-Heap. Um statische Standardressourcen zu erstellen, erstellen Sie benachbarte Ressourcen in einem Standardheap. Um standardaliasierte Ressourcen zu erstellen, erstellen Sie überlappende Ressourcen in einem Standardheap.

WriteToSubresource und ReadFromSubresource ordnen Texturdaten zwischen einem Zeilen-Hauptlayout und einem nicht definierten Ressourcenlayout neu an. Der Vorgang ist synchron, daher sollte die Anwendung die CPU-Planung berücksichtigen. Die Anwendung kann das Kopieren immer in kleinere Regionen aufteilen oder diesen Vorgang in einer anderen Aufgabe planen. MSAA-Ressourcen und Tiefenschablonenressourcen mit undurchsichtigen Ressourcenlayouts werden von diesen CPU-Kopiervorgängen nicht unterstützt und führen zu einem Fehler. Formate, die keine Größe von zwei Elementen aufweisen, werden ebenfalls nicht unterstützt und verursachen ebenfalls einen Fehler. Es können Code für die Rückgabe von Nichtspeichern auftreten.

Kernkonstanten

ID3D12Heap

Ressourcenbindung