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.