Auf meinem Computer habe ich zwei Warteschlangenfamilien, eine, die alles unterstützt und eine, die nur die Übertragung unterstützt.
Die Warteschlangenfamilie, die alles unterstützt, hat einen queueCount von 16
.
Jetzt gibt die Spezifikation an
Befehlspuffer, die an verschiedene Warteschlangen übergeben werden, können parallel oder sogar in einer anderen Reihenfolge ausgeführt werden
Bedeutet das, dass ich versuchen sollte, alle verfügbaren Warteschlangen für maximale Leistung zu verwenden?
Ja, wenn Sie eine sehr unabhängige Arbeitslast haben, verwenden Sie separate Warteschlangen.
Wenn die Warteschlangen viel Synchronisation zwischen sich benötigen, kann es jeden möglichen Nutzen töten, den Sie erhalten können.
Was Sie tun, ist im Grunde, dass Sie der GPU einige alternative Funktionen zur Verfügung stellen (und füllen Sie Stalle und Bubbles und Idle mit und geben GPU die Wahl) im Fall der gleichen Warteschlange Familie. Und es gibt ein gewisses Potenzial, die CPU besser zu nutzen (z. B. ein Thread mit einem Thread oder eine mit einem Thread pro Thread).
Die Verwendung separater Übertragungswarteschlangen (oder einer anderen spezialisierten Familie) scheint sogar der empfohlene Ansatz zu sein.
Das ist allgemein gesagt. Eine realistischere, empirischere, skeptischere und praktischere Sichtweise wurde bereits in den Antworten von SW und NB dargestellt.
Zu welchem Zweck?
Nehmen Sie die typische Struktur eines verzögerten Renderers. Sie bauen Ihre g-Puffer, machen Ihre Lichtdurchgänge, machen Post-Processing und Tone-Mapping, werfen vielleicht etwas transparentes Zeug hinein und präsentieren dann das endgültige Bild. Jeder Prozess hängt davon ab, dass der vorherige Prozess abgeschlossen wurde, bevor er beginnen kann. Sie können Ihre Lichtdurchgänge nicht durchführen, bis Sie Ihren g-Puffer fertig haben. Und so weiter.
Wie können Sie das über mehrere Ausführungswarteschlangen hinweg parallelisieren? Sie können das G-Buffer-Gebäude oder die Lichtdurchgänge nicht parallelisieren, da alle diese Befehle in dieselben angehängten Bilder schreiben (und Sie können dies nicht aus mehreren Warteschlangen tun). Und wenn sie nicht auf die gleichen Bilder schreiben, dann müssen Sie eine Warteschlange auswählen, in der die resultierenden Bilder in die endgültige kombiniert werden. Außerdem habe ich keine Ahnung, wie die Tiefenpufferung funktionieren würde, ohne den gleichen Tiefenpuffer zu verwenden.
Und dieser Kombinationsschritt würde eine Synchronisierung erfordern.
Nun gibt es viele Aufgaben, die können parallelisiert werden. Frustum Culling machen. Partikelsystem-Updates Speicherübertragungen Sachen wie diese; Daten, die für den nächsten Rahmen bestimmt sind. Aber wie viele Warteschlangen könnten Sie realistisch auf einmal beschäftigen? 3? Vielleicht 4?
Ganz zu schweigen davon, dass Sie ein Rendering-System erstellen müssen, das skalierbar ist. Vulkan erfordert nicht, dass Implementierungen mehr als eine Warteschlange bereitstellen. Ihr Code muss also in der Lage sein, auf einem System vernünftig zu laufen, das nur eine Warteschlange sowie ein System mit 16 bietet. Und um ein 16-Warteschlangen-System zu nutzen, müssen Sie möglicherweise sehr unterschiedlich rendern.
Ach ja, und wenn Sie nach einer Reihe von Warteschlangen fragen, diese aber nicht verwenden, kann die Leistung beeinträchtigt werden. Wenn Sie nach 8 Warteschlangen fragen, hat die Implementierung keine andere Wahl als anzunehmen, dass Sie beabsichtigen, 8 gleichzeitige Befehlssätze auszugeben. Dies bedeutet, dass die Hardware nicht alle Ressourcen einer einzelnen Warteschlange zuweisen kann. Wenn Sie also nur 3 davon verwenden, verlieren Sie möglicherweise mehr als 50% Ihrer potenziellen Leistung an Ressourcen, auf die die Implementierung wartet.
Zugegeben, die Implementierung könnte solche Dinge dynamisch skalieren. Aber wenn Sie diesen speziellen Fall nicht kennen, werden Sie es nie erfahren. Oh, und wenn es dynamisch skaliert ... dann werden Sie nicht viel gewinnen, wenn Sie mehrere Warteschlangen wie diese benutzen.
Das hängt stark von Ihrem tatsächlichen Szenario und Setup ab. Es ist schwer ohne Details zu sagen.
Wenn Sie Befehlspuffer an mehrere Warteschlangen senden, müssen Sie auch die richtige Synchronisierung durchführen. Wenn dies nicht richtig durchgeführt wird, können Sie möglicherweise eine schlechtere Leistung erzielen, als wenn Sie nur eine Warteschlange verwenden.
Beachten Sie, dass selbst wenn Sie nur eine Warteschlange senden, eine Implementierung Befehlspuffer parallel und sogar außer Betrieb ausführen kann (auch als "in-flight" bezeichnet), siehe dazu im Kapitel Kapitel 2.2 der Spezifikationen oder diese AMD Präsentation .
Wenn Sie Berechnungen und Grafiken ausführen, verbessert die Verwendung separater Warteschlangen mit gleichzeitiger Übertragung (und einer Synchronisierung) die Leistung auf Hardware, die asynchrone Berechnungen unterstützt.
Es gibt also kein definitives Ja oder Nein, ohne über Ihren tatsächlichen Anwendungsfall zu wissen.
Tags und Links vulkan