Mein gegenwärtiges Verständnis ist, dass alles, was in einer Shader-Datei gemacht wird, auf der GPU gemacht wird und alles, was in meinem (Java, in meinem Fall) Code gemacht wird, auf der CPU gemacht wird.
Ist das eine genaue Beschreibung?
Mein gegenwärtiges Verständnis ist, dass alles, was in einer Shader-Datei gemacht wird, auf der GPU gemacht wird und alles, was in meinem (Java, in meinem Fall) Code gemacht wird, auf der CPU gemacht wird.
Ist das eine genaue Beschreibung?
Antworten:
Das ist der Kern davon.
Grundsätzlich könnte die Plattform tun, was sie will. Man könnte sich ein fortschrittliches Betriebssystem vorstellen, das kompilierten Code von beispielsweise x86 in GPU-Code just-in-time übersetzt. Ebenso können OpenGL-Treiber auf der Host-CPU ausgeführt werden, was immer sie möchten.
Aber wirklich, was Sie gerade beschrieben haben, ist was passiert.
Im Allgemeinen ja. Java wird zum Schreiben von Programmen verwendet, die auf der CPU ausgeführt werden. Shader-Sprachen (cg, hlsl, et al) werden zum Schreiben von Programmen verwendet, die auf der GPU ausgeführt werden.
Eine Ausnahme von dieser Regel wäre die Verwendung von Drittanbieter-APIs, die die Lücke schließen können.
david van brink hat Ihre Frage im Allgemeinen beantwortet.
Aber wie er sagt, könnte der OpenGL-Treiber Sachen auf der CPU laufen lassen, und das passiert tatsächlich sehr oft. Insbesondere in Kompatibilitätskontexten, in denen einige verrückte Legacy-Funktionen nicht auf den Grafikkarten implementiert werden können. Sie erfordern eine Software-Emulation. Ich habe zum Beispiel schon gehört, dass das Tupfen auf der CPU ausgeführt wird. Auch beim Kommissionieren erwarten Sie Überraschungen.
Diese Überraschungen können unter MacOS unter Verwendung von 2.1-Kontexten noch mehr auftreten, da Apple die Ansicht von OpenGL über den gesamten Hardwarebereich hinweg recht gut vereinheitlicht hat und einigen kleineren Hardwarekomponenten einige zu emulierende Komponenten fehlen. Es geht so weit, dass die ENTIRE OpenGL 2.1-Spezifikation tatsächlich vollständig auf der CPU ausgeführt werden kann, wenn der Kontext-Erstellungscode ein Software-Gerät explizit spezifiziert.
Umgekehrt KANN Code, der über Computing-Bibliotheken wie Vexcl oder Boost Computing oder Microsoft AMP oder NVIDIA Thrust ausgeführt wird, abhängig von API-Setup-Flags auf der GPU oder der CPU ausgeführt werden.
Und für den letzten Schliff haben Sie in der CPU auch eine DSP-Architektur, von der wir einen Teil als SIMD bezeichnen. Der ispc-Compiler von Intel bietet Hilfe bei der Generierung von Code, der auf SIMD-Lanes "ausgeführt" werden kann, sowie zahlreiche Leistungsdiagnosen zur Kompilierungszeit, damit Sie das Beste daraus machen können. Wenn Sie OpenMP hinzufügen, erhalten Sie ein Multithread-SIMD, das sich den Konzepten von GPUs annähert. Wenn Sie eine High-End-CPU und eine Low-End-GPU haben, kann dies tatsächlich performanter sein.
http://ispc.github.io/