Welche Funktionen machen OpenCL für die Berechnung gegenüber OpenGL mit GLSL einzigartig? Gibt es trotz der grafischen Terminologie und der unpraktischen Datentypen eine echte Einschränkung für OpenGL?
Ja, es ist eine Grafik-API. Daher muss alles, was Sie darin tun, unter diesen Bedingungen formuliert werden. Sie müssen Ihre Daten als eine Art "Rendering" verpacken. Sie müssen herausfinden, wie Sie mit Ihren Daten in Bezug auf Attribute, einheitliche Puffer und Texturen umgehen.
Mit OpenGL 4.3 und OpenGL ES 3.1 Compute Shadern werden die Dinge etwas durcheinander. Ein Compute-Shader kann über SSBOs / Image Load / Store auf ähnliche Weise wie OpenCL-Rechenoperationen auf den Speicher zugreifen (obwohl OpenCL tatsächliche Zeiger bietet, GLSL jedoch nicht). Ihr Interop mit OpenGL ist auch viel schneller als das OpenCL / GL-Interop.
Trotzdem ändern Compute-Shader nichts an einer Tatsache: OpenCL-Compute-Operationen arbeiten mit einer ganz anderen Genauigkeit als die Compute-Shader von OpenGL. Die Gleitkomma-Präzisionsanforderungen von GLSL sind nicht sehr streng, und die von OpenGL ES sind noch weniger streng. Wenn also die Gleitkomma-Genauigkeit für Ihre Berechnungen wichtig ist, ist OpenGL nicht die effektivste Methode, um das zu berechnen, was Sie zur Berechnung benötigen.
Außerdem erfordern OpenGL-Compute-Shader 4.x-fähige Hardware, während OpenCL auf viel minderwertigerer Hardware ausgeführt werden kann.
Wenn Sie durch Kooptieren der Rendering-Pipeline rechnen, gehen OpenGL-Treiber weiterhin davon aus, dass Sie rendern. Auf dieser Grundlage werden Optimierungsentscheidungen getroffen. Dadurch wird die Zuweisung von Shader-Ressourcen optimiert, sofern Sie ein Bild zeichnen.
Wenn Sie beispielsweise in einen Gleitkomma-Framebuffer rendern, entscheidet sich der Treiber möglicherweise nur für einen R11_G11_B10-Framebuffer, da er erkennt, dass Sie mit dem Alpha nichts tun und Ihr Algorithmus die geringere Genauigkeit tolerieren kann. Wenn Sie jedoch das Laden / Speichern von Bildern anstelle eines Framebuffers verwenden, ist die Wahrscheinlichkeit, dass dieser Effekt auftritt, sehr viel geringer.
OpenCL ist keine Grafik-API. Es ist eine Berechnungs-API.
Außerdem bietet OpenCL nur Zugriff auf weitere Inhalte. Sie erhalten Zugriff auf Speicherebenen, die in Bezug auf den GL implizit sind. Bestimmter Speicher kann von Threads gemeinsam genutzt werden, aber separate Shader-Instanzen in GL können sich nicht direkt gegenseitig beeinflussen (außerhalb von Image Load / Store, OpenCL wird jedoch auf Hardware ausgeführt, die keinen Zugriff darauf hat).
OpenGL verbirgt, was die Hardware hinter einer Abstraktion tut. OpenCL setzt Sie fast genau dem aus, was gerade passiert.
Sie können OpenGL verwenden, um beliebige Berechnungen durchzuführen. Aber Sie müssen nicht wollen zu; nicht, solange es eine absolut praktikable Alternative gibt. Compute in OpenGL wird für die Wartung der Grafikpipeline verwendet.
Der einzige Grund, OpenGL für jede Art von Nicht-Rendering-Rechenoperation auszuwählen, ist die Unterstützung von Hardware, auf der OpenCL nicht ausgeführt werden kann. Gegenwärtig umfasst dies viel mobile Hardware.
varying
Schlüsselwort deklariert wurden. Wie würden Sie das entsprechende Ziel in OpenCL erreichen?