Wie steuere ich, welche Berechnungen auf der CPU und welche auf der GPU durchgeführt werden?

14

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?

Bassinator
quelle
2
Sie können auch mit OpenCL auf der GPU rechnen, wodurch Sie im Wesentlichen Code auf der GPU ausführen können.
Soapy

Antworten:

20

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.

David van Rande
quelle
5
IIRC werden die Shader auf der CPU kompiliert, bevor sie an die GPU gesendet werden. Und das erledigt der GPU-Treiber ohne Betriebssystem.
MSalters
Wahr. Ich habe viele Kompilierungsfehler während des Programmablaufs in den Shadern behoben, auch wenn der Java-Code bereits kompiliert wurde.
Bassinator
1
Theoretisch: Nehmen wir an, ich hatte ein Programm, das sehr CPU-intensiv ist, aber nur eine Befehlszeilenschnittstelle ist (keine grafische Arbeit). Könnte ich einen Teil der Arbeit auf die GPU verlagern? Ich habe nicht wirklich vor, das zu tun. Es ist nur eine konzeptuelle Sache, die mich interessiert.
Bassinator
2
Ja! Der Link, den @return true gepostet hat, bezieht sich auf eine Java-Bibliothek, die dies tut. Im Allgemeinen können Sie einen "Compute-Shader" in OpenGL schreiben oder OpenCL verwenden. In allen Fällen müssen Sie einen Teil Ihres Codes, der parallelisierbar ist, isolieren und Informationen in ihn hinein- und herausgeben. (GPUs eignen sich hauptsächlich für "peinlich parallele" Aufgaben.)
david van brink
1
Ein Sternchen, das zu dieser Antwort hinzugefügt werden muss, ist, dass einige Implementierungen die Idee eines "Preshaders" unterstützen - dh Code, der Teil des Shaders ist, dessen Ergebnis jedoch über alle Aufrufe in einem bestimmten Draw-Aufruf konstant ist (wie das Multiplizieren einer einheitlichen Ansicht) & Projektionsmatrizen). Ein so geneigter Shader-Compiler kann solche Codebits identifizieren und ausgeben, um sie einmal prozessorseitig auszuführen, einschließlich der resultierenden konstanten Ausgabe in der an die GPU gesendeten Arbeit. Dies ist ein häufiger Fall, in dem die Annahme "Shader = GPU" möglicherweise verbogen wird, wenn auch nur im Detail.
DMGregory
7

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.

return true
quelle
1
Sehr interessanter Tipp, Ihr Link zu "aparapi". Führen Sie einen JVM-Code auf der GPU aus ... faszinierend!
David van Brink
3

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/

v.oddou
quelle