- Vulkan ist eine Low-Level-API für verschiedene Plattformen, die 3D-Grafik und allgemeine Berechnungen mithilfe von Compute Shadern auf einem einzigen Speichermodell, Warteschlangen und Synchronisierung vereint.
- Im Vergleich zu OpenGL und DirectX 11 reduziert Vulkan den Treiber-Overhead drastisch, skaliert besser auf Mehrkernprozessoren und nutzt SPIR-V für vorkompilierte Shader.
- Im Vergleich zu CUDA bietet Vulkan weniger spezialisiertes, dafür aber deutlich portableres GPGPU-Computing, das mit verschiedenen Herstellern und Betriebssystemen kompatibel ist.
- Die Wahl zwischen Vulkan Compute, OpenGL, DirectX oder CUDA hängt vom Verhältnis zwischen Leistung, Komplexität, Zielplattformen und der Notwendigkeit ab, Grafik und Berechnung in eine einzige Pipeline zu integrieren.
Wenn man anfängt, daran herumzubasteln GPU-Computing Es ist normal, bei so vielen APIs – OpenGL, Vulkan, DirectX, CUDA usw. – den Überblick zu verlieren und innerhalb von Vulkan oft von „Vulkan Compute“ zu hören, als wäre es etwas völlig anderes. Wenn Sie Simulationen oder Physik implementieren möchten, IA oder jede andere GPGPU-Aufgabe, gut verstehen Die Unterschiede zwischen Vulkan für Grafikanwendungen und seiner Verwendung als Computing-API Es ist der Schlüssel zur Wahl des richtigen Weges.
Letztendlich ist Vulkan nur eine von vielen Sprachen, aber sie kann verwendet werden als Traditionelle Grafik-API oder universelle Computing-API Wir nutzen die Vorteile der Compute Shader. Schauen wir uns genauer an, was sich im Vergleich zu OpenGL ändert, welche Unterschiede es zu CUDA gibt und wie sich das alles in das übrige moderne API-Ökosystem wie DirectX oder sogar OpenCL einfügt.
Was ist Vulkan und wie sieht Vulkan Compute aus?
Vulkan ist eine Low-Level-API. Entwickelt und gepflegt von der Khronos Group als Weiterentwicklung des alten OpenGL und der Mantle-Philosophie (AMD). Es wurde 2016 als moderne API für 3D-Grafik und allgemeines GPU-Computing mit zwei klaren Zielen eingeführt: das Maximum aus der GPU herauszuholen. Hardware und wirklich plattformübergreifend sein.
Im Gegensatz zu OpenGL, das durch Erweiterungen und Patches wuchs, Vulkan wurde von Grund auf neu entwickelt. für Mehrkernprozessoren, moderne GPUs und Geräte von Desktop-PCs über Mobiltelefone bis hin zu Konsolen. Es basiert maßgeblich auf der Idee, dass der Entwickler einen Großteil der Ressourcenverwaltung und -synchronisierung übernimmt und im Gegenzug … brutale Reduzierung der Überlastung der Treiber.
Wenn wir von „Vulkan Compute“ sprechen, meinen wir eigentlich die Verwendung von Compute-Shader in Vulkan Für GPGPU-Aufgaben wie Simulationen, Bildverarbeitung, Teilchenphysik, fortgeschrittene Nachbearbeitung, KI usw. gibt es keine separate API mit diesem Namen; stattdessen existiert ein einheitliches Modell, in dem… Grafik- und Berechnungs-Shader Sie teilen sich dasselbe Ökosystem: dasselbe Beschreibungssystem, dieselbe Warteschlange BefehleDerselbe Speicher und dieselben Synchronisierungswerkzeuge.
Dieser einheitliche Ansatz ermöglicht es einer einzigen Engine oder Anwendung, die Verwaltung zu übernehmen. Rendering und Berechnung mit derselben APIohne beispielsweise OpenGL für die Grafik und eine weitere separate Compute-API für allgemeine GPU-Arbeiten mischen zu müssen.
Von OpenGL zu Vulkan: Der Sprung bei Compute Shadern
OpenGL wurde vor Jahren integriert Compute-ShaderDadurch war GPGPU für viele Aufgaben recht gut geeignet. Aber sein Design birgt einen Nachteil globaler Zustandsautomatstarke Abhängigkeit von einem einzigen Kontext und ein Overhead an Validierungen, impliziten Sperren und versteckter Synchronisierung, die auf Mehrkernprozessoren nicht immer gut skalieren.
In OpenGL ist der größte Teil des API-Zustands mit einem globalen Kontext verknüpft: Die Anrufe erfolgen nacheinander. Der Treiber trifft viele „magische“ Entscheidungen für Sie. Für ein kleines Programm oder eine Demo mag das funktionieren, aber wenn Sie wirklich parallelisieren, alle CPU-Kerne nutzen und gut optimierte Arbeitswarteschlangen erstellen möchten, stößt dieser Ansatz an seine Grenzen.
Vulkan bricht mit diesem Modell und basiert auf Objekte ohne globalen ZustandAnstatt Funktionen aufzurufen, die globale Zustände verändern, erstellt man in Vulkan Folgendes: Befehlspuffer Hier beschreiben Sie genau, was Sie ausführen möchten: welche Ressourcen verwendet werden sollen, welche Shader gestartet werden sollen, wie die Synchronisierung erfolgen soll usw. Diese Befehle können parallel von mehreren Threads generiert und dann sehr effizient an die GPU gesendet werden.
Dies hat eine klare Konsequenz: im Vergleich zu OpenGL, Vulkan ermöglicht eine wesentlich bessere Auslastung von Mehrkernprozessoren.Vulkan ermöglicht die Vorbereitung und Ausführung von Compute-Shadern durch mehrere Threads, ohne dass der Treiber zum Flaschenhals wird. Daher wird Vulkan häufig bei sehr anspruchsvollen Aufgaben oder solchen mit vielen kleinen Prozessen eingesetzt. OpenGL übertreffen einfach durch die Reduzierung der CPU-Kosten und die Ermöglichung einer besseren Lastverteilung.
Ein weiterer wichtiger Unterschied liegt in den Shadern: OpenGL verwendet GLSL auf höherer Ebene. Jeder Treiber benötigt einen eigenen Compiler, der den Quellcode zur Laufzeit in GPU-Binärcode übersetzt. Dies erschwert die Treiberwartung und kann zu unterschiedlichem Verhalten zwischen den Herstellern führen.
Vulkan verfolgt einen ähnlichen Ansatz wie Direct3D: Shader werden nicht als Text, sondern in einem Standardisiertes binäres Zwischenformat namens SPIR-VSie können Ihre Shader einmal kompilieren (z. B. von GLSL oder HLSL in die SPIR-V-Binärdatei), und der Treiber muss dann nur noch die abschließende Optimierung durchführen. Dies verbessert die Leistung. los tiempos de cargoEs reduziert Laufzeitkompilierungsfehler und vereinfacht die Nutzung. große Anzahl verschiedener Shader in derselben Szene oder Rechenpipeline.
Leistungsunterschiede: OpenGL-Berechnung vs. Vulkan-Berechnung
Aus rein GPU-bezogener Sicht, der Rechencode, der in einem Compute-Shader ausgeführt wird Ob Sie die Anwendung für OpenGL oder Vulkan entwickeln, kann sehr ähnlich sein. Die Gesamtleistung hängt jedoch nicht nur von der verwendeten GPU ab, sondern auch von... Wie wird die GPU von der CPU mit Strom versorgt? und wie Sie Daten synchronisieren und teilen.
Mit Vulkan können Sie einen Großteil des Fahreraufwands eliminierenDie explizite Verwendung von Befehlswarteschlangen, die Gruppierung vieler Operationen in Batches, die manuelle Speicherverwaltung und die Vermeidung globaler Zustände, die die Parallelverarbeitung blockieren, bedeuten in der Praxis Folgendes: Dieselbe Simulation oder dieselbe allgemeine Berechnung läuft in Vulkan tendenziell besser. als in OpenGL, insbesondere in Szenarien mit vielen Threads oder vielen kleinen Aufgaben.
In realen Anwendungen wurden ähnliche Unterschiede auch in der reinen Grafik beobachtet: bei identischer Hardware und in einer Umgebung wie beispielsweise Windows 7Es wurde gemessen, dass Vulkan erreicht etwa 303 fps, im Vergleich zu etwa 270 fps mit einer anderen API. In bestimmten Benchmarks ist es traditioneller, genau dank dieser Reduzierung des Overheads und der besseren CPU/GPU-Lastverteilung.
Zusätzlich Vulkan skaliert mit Mehrkernprozessoren wesentlich besser.OpenGL 4 und DirectX 11 wurden ursprünglich für Einkernprozessoren entwickelt und später um Erweiterungen für Mehrkernprozessoren ergänzt, ihre Skalierbarkeit ist jedoch eingeschränkt. Vulkan hingegen wurde von Grund auf für diese Anforderungen konzipiert, sodass die parallele Verarbeitung für die GPU ein integraler Bestandteil der API und keine nachträgliche Erweiterung ist.
Vulkan vs. DirectX: Moderne Low-Level-APIs
Um Vulkan Compute im Gesamtbild einzuordnen, ist es hilfreich, es mit folgenden Elementen zu vergleichen: Der vollständige Vergleich: Vulkan vs. DirectX vs. OpenGLinsbesondere Direct3D 11 und 12, die nach wie vor ein Maßstab in der Entwicklung von Videospiele für Windows und Xbox.
DirectX, das seit 1995 von Microsoft entwickelt wird, ist eigentlich eine Reihe von Multimedia-APIs (Grafik, Audio, Eingabe usw.). Direct3D ist die 3D-Grafikkomponente, und in Direct3D 11 ist die API höherwertig: Ein Großteil der Ressourcenverwaltung, Synchronisierung und Validierungslogik wird automatisch vom Treiber übernommen. Dies vereinfacht die Arbeit der Entwickler, bedeutet aber auch: höherer CPU-Overhead und weniger Feinsteuerung.
Mit Direct3D 12 näherte sich Microsoft der Vulkan-Philosophie an: Niedrigstufige API, explizite Steuerung und eine bessere Skalierung auf Mehrkernprozessoren. DirectX ist jedoch eine Technologie proprietär und auf das Microsoft-Ökosystem ausgerichtetWindows- und Xbox-Konsolen. Wenn Ihr Hauptaugenmerk auf Windows liegt, bietet DirectX ein sehr ausgereiftes Ökosystem, umfangreiche Dokumentation und eine große Community. Falls Sie sich unsicher sind, können Sie um herauszufinden, welche Version von DirectX Sie installiert haben.
Vulkan hingegen ist Multiplattform von der ersten Minute an. Funktioniert weiter Linux, AndroidBSD Unix, Windows Nintendo Switch und anderen Plattformen, mit Unterstützung von Drittanbietern auf macOS und iOS durch Kompatibilitätsschichten. Dies macht es besonders attraktiv für Studien, die mit einer einzigen Codebasis mehrere Plattformen ansprechen wolleneinschließlich PCs, Mobiltelefone und Konsolen.
Noch ein Punkt: DirectX ist ein API-SammlungVulkan wird üblicherweise beschrieben als Software Programmierung Videospiele der nächsten Generation/OpenGL aber einheitlich für Grafik und Berechnung. Vulkan bietet eine Sehr ausgewogene CPU/GPU-Auslastung und es hat sich in Android und in der Welt der Emulatoren sehr gut positioniert, während DirectX unter Windows klar dominiert.
In Bezug auf die reine Geschwindigkeit heißt es oft, dass Vulkan ist schneller als DirectX. In vielen Szenarien, insbesondere bei gut parallelisierter Verarbeitung und Nutzung der Multithreading-Fähigkeiten der API, kann DirectX 12 in bestimmten Fällen mit DirectX 12 mithalten oder es sogar übertreffen. Um die Kompatibilität zu prüfen, können Sie Folgendes tun: Prüfen Sie, ob Ihre GPU mit DirectX 12 Ultimate kompatibel ist..
Vulkan vs. CUDA für reine GPGPU
Ein weiterer wichtiger Akteur im Bereich des universellen GPU-Computing ist CUDA, die Plattform von NVIDIAWenn Sie von CUDA kommen und überlegen, Ihren Stack zu ändern oder zu ergänzen, ist es wichtig zu verstehen, was Sie mit Vulkan Compute gewinnen und verlieren.
CUDA wurde speziell für Wissenschaftliches Rechnen, HPC, KI, maschinelles Lernen und für rechenintensive Aufgaben. Es bietet ein umfangreiches Ökosystem optimierter Bibliotheken, Debugging-Tools und Profile und ist tief in die akademische Welt und die Supercomputing-Welt integriert. Die C/C++-Syntax mit CUDA-Erweiterungen ist sehr benutzerfreundlich, wenn man bereits mit dieser Umgebung vertraut ist.
Vulkan seinerseits ist ein Allgemeine Grafik- und Rechen-APISeine Compute-Shader können vieles von dem, was man in CUDA macht, aber das mentale Modell ist ein anderes: Man arbeitet mit SPIR-V-ShaderEs werden Deskriptorstrukturen, Befehlswarteschlangen und explizite Synchronisierung verwendet. Die Syntax ist nicht identisch mit CUDA; typischerweise schreiben Sie in GLSL, HLSL oder einer anderen Quellsprache, die Sie dann zu SPIR-V kompilieren.
Der große Vorteil von Vulkan gegenüber CUDA ist, dass Es ist nicht auf NVIDIA-Hardware beschränkt.Als offener Standard von Khronos ist er mit GPUs verschiedener Hersteller und auf vielen verschiedenen Betriebssystemen kompatibel: Linux, Android, Windows, Nintendo und mehr. Wenn Ihre GPGPU-Software auf einem dieser Betriebssysteme laufen soll, … AMD, IntelMobiltelefone oder KonsolenVulkan ist eine wesentlich flexiblere Lösung.
Die Lernkurve für Vulkan ist jedoch in der Regel... steiler als bei CUDA. Es muss viel Infrastruktur eingerichtet werden: logische Geräte, Warteschlangen, Puffer, Deskriptoren, Pipelines, manuelle Synchronisierung usw. Bei CUDA sind viele dieser Schichten stärker integriert oder durch NVIDIAs eigene Bibliotheken abstrahiert.
Im Hinblick auf die praktische Anwendung, Vulkan ist ideal, wenn Grafik und Datenverarbeitung vereinheitlicht werden müssen. und lässt sich auf vielen Plattformen einsetzen. CUDA ist fantastisch für reine GPGPU im NVIDIA-Ökosystem, insbesondere wenn man auf dessen Bibliotheksstack (cuBLAS, cuDNN usw.) zurückgreift und keine erweiterten Grafikfunktionen in dieselbe API integriert benötigt.
Vulkan im Vergleich zu anderen APIs und Standards: OpenCL, Metal, Mantle…
Vulkan steht nicht allein gegenüber OpenGL, DirectX und CUDA; es gibt weitere Akteure im Bereich des parallelen Rechnens. Ein wichtiges Beispiel ist OpenCL, ebenfalls von Khronos, das seit Jahren für die allgemeine parallele Programmierung auf mehreren Geräten eingesetzt wird.
Mit dem Erscheinen von OpenCL 2.2 gab Khronos bekannt, dass OpenCL würde mit Vulkan konvergieren. Der OpenCL-Code sollte nach Möglichkeit sowohl auf OpenCL als auch auf Vulkan einsetzbar sein. Dieser Ansatz hat sich bereits in realen Produkten bewährt: Adobe Premiere Rush verwendet beispielsweise den Open-Source-Compiler. clspv OpenCL-C-Kernel in SPIR-V konvertieren und auf einem ausführen Vulkan-Laufzeitumgebung auf Android.
Es gibt auch plattformspezifische APIs wie zum Beispiel Metall (Apple) oder die historischen Wurzeln von Vulkan in MantelVulkan, die API von AMD, deren Code an Khronos gespendet wurde, um einen Low-Level-, offenen Standard ähnlich DirectX 12, aber plattformübergreifend zu schaffen, übernimmt viele Ideen von Mantle und teilt eine Philosophie mit DirectX 12 und Metal. Geringer Overhead, explizite Steuerung und Fokus auf Mehrkernprozessoren.
Die Entwicklung von Vulkan und der Fokus auf das Rechnen
Seit seiner ersten Veröffentlichung im Jahr 2016 hat Vulkan mehrere Auszeichnungen erhalten. wichtige Updates die ihre Fähigkeiten sowohl für Grafik- als auch für Compute-Shader verfeinert haben.
In Vulkan 1.1 wurden Erweiterungen wie Multiview, Gerätegruppen, prozessübergreifende Freigabe und APIsErweiterte Rechenfunktionen, verbesserte HLSL-Kompatibilität und Unterstützung für Farbformate wie YCbCr wurden eingeführt. Explizite Unterstützung wurde ebenfalls hinzugefügt für mehrere GPUs und Docks für moderne Techniken wie Raytracing, wodurch die Möglichkeiten von DirectX 12 noch weiter ausgereizt werden.
Vulkan 1.2 integriert 23 zusätzliche Erweiterungen Weit verbreitet im Basisstandard. Zu den wichtigsten gehören die Zeitachsen-Semaphore zur Synchronisierung (deutlich besser handhabbar in komplexen Szenarien), ein formales Speichermodell, das präzise definiert, wie Operationen über verschiedene Threads hinweg synchronisiert werden, und die Indexierung von DeskriptorenDies ermöglicht die Wiederverwendung von Deskriptordesigns mit mehreren Shadern, was bei der Kombination von Grafik und Computertechnik sehr nützlich ist.
Vulkan 1.3 setzte diesen Weg fort, integrierte ebenfalls eine gute Anzahl von Erweiterungen und konzentrierte sich auf Fragmentierung reduzierenDamit ein Gerät als mit Vulkan 1.3 kompatibel erklärt wird, sind bestimmte Funktionen nicht mehr optional, sondern obligatorisch. Dadurch wissen Entwickler leichter, welche Funktionen sie erwarten können. Zusätzlich wurden Verbesserungen hinzugefügt. Dynamisches Rendering, dynamischere Zustände und eine verbesserte Synchronisierungs-APIAll dies ist von großer Bedeutung, wenn Grafik mit rechenintensiven Anwendungen kombiniert wird.
Parallel dazu wurde auch SPIR-V weiterentwickelt und hat Versionen wie 1.3 durchlaufen, die Folgendes ermöglichen: zunehmend komplexere Shader und Rechenkerne ausdrücken und kompatibel mit verschiedenen High-Level-APIs.
Praktische Vorteile von Vulkan für Grafik und Computing
Vulkan wurde entwickelt, um sowohl im Bereich Grafik als auch im allgemeinen Rechnen eine Reihe klarer Vorteile gegenüber früheren APIs zu bieten. Einer der offensichtlichsten ist die Reduzierung der ReglerüberlastungDas bedeutet weniger Arbeit für die CPU. Durch die Verwendung von Stapelverarbeitung und Befehlspuffern können Sie große Datenmengen auf einmal für die GPU vorbereiten.
Ein weiterer Vorteil ist die bessere Skalierbarkeit auf MehrkernprozessorenDirectX 11 und OpenGL 4 entstanden in einer Ära von Einkernprozessoren und wurden später für die Nutzung mehrerer Kerne optimiert, ihre Modelle skalieren jedoch nicht so gut. Vulkan hingegen wurde speziell dafür entwickelt, mehreren Threads die parallele und überlappungsfreie Verarbeitung von Befehlen zu ermöglichen und so die Vorteile von Mehrkernprozessoren auszunutzen.
In Bezug auf Speicher und Synchronisierung bietet Vulkan Ihnen explizite Kontrolle über die GPU-Speicherverwaltung und wie die Operationen synchronisiert werden. Dies verhindert unerwartetes, „magisches“ Treiberverhalten, erfordert aber deutlich mehr Sorgfalt. Anstatt wie OpenGL Laufzeitfehler zu überprüfen, Vulkan trennt die Validierung in Entwicklungsschichten. die Sie während der Fehlersuche aktivieren und im Produktivbetrieb deaktivieren können, um die Leistung zu steigern.
Ein weiterer wichtiger Vorteil ist das Es vereinheitlicht die Verwaltung von Rechenkernen und Grafikshadern.Es ist beispielsweise nicht mehr nötig, eine API für Grafik und eine andere für Berechnungen zu verwenden; sowohl Rendering als auch GPGPU arbeiten mit demselben Modell von Warteschlangen, Speicher und Deskriptoren. Dies vereinfacht Projekte erheblich, in denen Grafik und Berechnung eng miteinander verknüpft sind, wie etwa moderne Game-Engines, komplexe Simulatoren oder Anwendungen von virtuelle Realität und erhöht.
Leidenschaftlicher Autor über die Welt der Bytes und der Technologie im Allgemeinen. Ich liebe es, mein Wissen durch Schreiben zu teilen, und genau das werde ich in diesem Blog tun und Ihnen die interessantesten Dinge über Gadgets, Software, Hardware, technologische Trends und mehr zeigen. Mein Ziel ist es, Ihnen dabei zu helfen, sich auf einfache und unterhaltsame Weise in der digitalen Welt zurechtzufinden.
