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.
Antworten:
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.
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.
quelle