Wie viele Direkt- / Rechen- / Kopierwarteschlangen sind sinnvoll?


11

DirectX 12 stellt Befehlswarteschlangen für Grafik- ("Direct" genannt), Rechen- oder Kopieraufgaben bereit. In Bezug auf die bereitgestellte Funktionalität ist jede eine Supermenge der folgenden. Die Spezifikation besagt, dass Befehlswarteschlangen gleichzeitig vom Gerät ausgeführt werden können. Die API begrenzt jedoch in keiner Weise die Anzahl der Befehlswarteschlangen (zumindest ist mir keine Einschränkung bekannt).

Anscheinend gehen verschiedene Anbieter sehr unterschiedlich damit um:

  • Intel hat kürzlich in einer Präsentation (Folie 23) festgestellt, dass die GPUs derzeit nicht in der Lage sind, Grafik und Computer parallel zu verarbeiten, und dass die Kopier-Engine einen schwachen Durchsatz aufweist. Sie raten von der Verwendung mehrerer Grafik- / Rechenwarteschlangen ab.
  • AMD hat vor langer Zeit damit begonnen , die Verwendung von Warteschlangen / "asynchronen Shadern" zu bewerben, beginnend mit Mantle und den aktuellen Gen-Konsolen. Es gibt auch einige Entwickler ( Beispiel ), die signifikante Leistungssteigerungen bestätigen, indem sie Rechen- und Grafikaufgaben parallel ausführen.
  • In letzter Zeit gab es einige Probleme damit, dass Nvidia keinen asynchronen Shader in der Hardware unterstützt: Die gleichzeitige Verwendung einer separaten Grafik- und Rechenwarteschlange scheint die Dinge langsamer zu machen, was auf eine Treiberemulation hinweist. Parallele Kopiervorgänge werden von CUDA hingegen seit sehr langer Zeit unterstützt, was deutlich macht, dass die DMA-Engine unabhängig arbeiten kann.

Gibt es eine Möglichkeit, zur Laufzeit zu entscheiden, ob es sinnvoll ist, CommandLists auf mehrere CommandQueues anstatt auf eine einzige zu übertragen? (da der frühere Fall nicht viel technischen Aufwand bedeutet)

Ich kann zwar leicht erkennen, wie nützlich es ist, Speicheroperationen parallel zu Rechen- / Grafikoperationen auszuführen, aber es erscheint mir unnötig kompliziert, mehrere Rechen- und Grafikprozesse parallel auszuführen (es sei denn, es gibt keinen wesentlichen Leistungsvorteil). Mir ist auch nicht klar, wie dies sowieso zu einer deutlich besseren Leistung führen kann; mit Ausnahme von pathologischen Fällen, in denen viele kleine sequentielle Aufgaben nicht in der Lage sind, eine ausreichende GPU-Last zu erzeugen.


1
Ich glaube nicht, dass es im Moment eine sinnvolle Möglichkeit gibt, ein solches Urteil zu fällen, abgesehen davon, zu überprüfen, wer die GPU herstellt. Letztendlich gibt es mehr Faktoren als nur "Kann die Hardware Befehle aus mehreren Warteschlangen gleichzeitig ausführen", und D3D12 abstrahiert diese Details. Tatsächlich unterscheidet D3D12 nicht einmal zwischen Hardware, die möglicherweise Warteschlangen gleichzeitig ausführt, und Hardware, die dies möglicherweise nacheinander ausführt. Die Dokumente sagen lediglich, dass ihre Abstraktion eine gleichzeitige Ausführung ermöglicht.
MJP

1
gute Frage ! Ich denke auch, dass es etwas Besonderes wäre, Perfektion zu erlangen, um gleichzeitig Computing und Shading auszuführen. Vielleicht können Gewinne dank der gleichen Fakten erzielt werden, die das Hyperthreading irgendwie beschleunigen. Interleaving-Operationen, wenn einige Einheiten für die andere Warteschlange beschäftigt sind. wie Shader, die die Textureinheiten verstopfen, die nicht von der Rechenstufe verwendet werden, die selbst die FPU oder DPU verstopft.
v.oddou

Hm schade. Vielleicht zählt dann "abgesehen von der Überprüfung, wer die GPU herstellt, nein" bereits als Antwort, wenn nicht mehr dahinter steckt. Nachdem ich all diese AMD-Marketing-Artikel gelesen habe, bin ich froh zu hören, dass ich mit meiner Verwirrung nicht allein bin.
Wumpf

1
Sie wissen nur, um ein wenig Gewicht in die Wichtigkeit (eigentlich UNwichtigkeit) dieser Angelegenheit zu heben. Das PS4 SDK hat einen Fehler, der es nicht erlaubt, in eine andere Warteschlange als Warteschlange 0 zu senden. Ich denke, wenn es so wichtig wäre, wäre es schneller behoben worden.
v.oddou

Antworten:


1

Versenden Sie Ihre Anwendung mit einer Benchmarking-Sequenz, in der die tatsächliche Plattform getestet wird. (Mögliche Antwort auf viele Fragen, denke ich ...)

Ich vermute, dass die Leistung stark davon abhängt, wie Sie die Hardware verwenden. Da es unwahrscheinlich ist, dass die Hardware Ihre Anwendung irgendwie rückwärts instrumentiert und Ihnen sagt, was zu tun ist, würde ich mich für alles entscheiden, was in Ihrem Design gut aussieht.

"... Befehlswarteschlangen können vom Gerät gleichzeitig ausgeführt werden ..."

Schlüsselwort ist CAN. Ich sehe keinen Grund, warum ein Anbieter dies vermasseln würde. Am Ende ist es der Plattformanbieter (Intel / AMD / Nvidia), der dafür verantwortlich ist, dass Sie ein ausreichend guter Treiber sind, damit Sie nicht in Betracht ziehen, den Anbieter zu wechseln. Wenn sie ein "Know-Problem" mit dieser Funktionalität haben (das übrigens keine funktionale Bedeutung hat, sondern nur die Leistung), sollten sie es auch mit dem lösen, was sie wissen. Ich meine, um laut zu schreien, ist der Fallback etwas, das sie bereits implementiert haben; synchrone Ausführung.

Hardware ist genug Voodoo, wie es für uns Entwickler ist.


Das GCN von AMD führt Grafiken aus und berechnet gleichzeitig, selbst wenn beide in der Grafikwarteschlange ausgegeben werden, jedoch im Allgemeinen nicht über mehrere Befehlspuffer hinweg (mehrere Draw-Aufrufe können sogar lückenhaft sein). Der Treiber (oder die Anwendung - ich denke in DX12 oder Vulkan) muss nach Datenabhängigkeiten suchen und bei Bedarf zwischen Zeichnen (Grafiken) und Versenden (Berechnen) blockieren. Mehrere Befehlswarteschlangen wären wahrscheinlich nützlich, wenn Sie eine wirklich asynchrone Berechnung aus Grafiken haben (wie die Physik für den nächsten Frame), aber ich habe keine direkte Erfahrung damit.
Daniel M Gessel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.