OpenCL ist ein Berechnungsframework, das entwickelt wurde, um die Vorteile von Multicore-Plattformen zu nutzen. Mit der Zeit haben sich einige Mythen um OpenCL gebildet, denen wir hier im Beitrag auf den Grund gehen möchten.

Mythen OpenCL

OpenCL ist ein offener, plattformübergreifender, paralleler Rechenstandard der Khronos-Arbeitsgruppe. Anwendungen werden in einer Variante von C geschrieben und die neueste OpenCL 2.2 bringt eine statische Teilmenge von C++ 14 in den Mix.

OpenCL hat eine breite Unterstützung sowohl auf der Hard- als auch auf der Softwareseite. Es ist oft ein Kontrollkästchen für Hardware-Featuresätze und Entwickler können OpenCL-basierte Software verwenden, ohne zu wissen, was mit der Hard- oder Software, auf der sie läuft, verbunden ist. Diejenigen, die sich mit OpenCL besser auskennen und wissen, wie es funktioniert, werden in diesem Beitrag nichts Neues finden. Ebenso geht es denen, die einfach OpenCL-basierte Software verwenden, egal, ob ihre Software auf von OpenCL unterstützter Hardware ordnungsgemäß ausgeführt wird oder nicht. Der Rest von euch sollte auf jeden Fall weiterlesen.

Ich muss nur C-Code schreiben, um OpenCL zu verwenden.

Das stimmt. OpenCL ist eine Sprachspezifikation, eine Laufzeit-API und ein Software-Framework, das einen OpenCL-Compiler und eine passende Laufzeit enthält. Der Anwendungscode wird in Form von kleinen Kerneln geschrieben, die anschließend von der Laufzeit ausgeführt werden. OpenCL-Kernel werden in C oder C++ geschrieben.

Ein Teil der Herausforderung beim Schreiben von OpenCL-Code besteht darin, die Vorteile der Erweiterungen und Konstrukte für die Parallelisierung der Berechnung zu nutzen, da dies nun OpenCL ist und die Ausführung einer Anwendung beschleunigt. Dies ist nicht einfach durch die Verwendung eines OpenCL-Compilers möglich. Auch das Bestimmen, wie Funktionen in einem Kernel implementiert werden, hat Auswirkungen auf die Performance.

Die Runtime plant Kernel und deren übereinstimmende Daten so, dass sie auf der Hardware laufen, die normalerweise aus mehreren Kernen besteht, was möglicherweise zu einer Beschleunigung der Anwendung führt. Ein Kernel läuft bis zum Ende und die resultierenden Daten können für zukünftige Berechnungen verwendet werden.

Der Code für einen Kernel kann zwischen den Kernen in einem gemeinsamen Speichersystem geteilt werden oder er kann wie in einem Clustersystem auf einen Knoten kopiert werden. Kernel sind nicht auf verschiedene Hardware portierbar, aber der Quellcode ist es.

OpenCL läuft nur auf GPUs.

Das ist nicht wahr. OpenCL ist eine Spezifikation, die von einem OpenCL-Compiler implementiert wird. Es kann Code für die Zielhardware generieren, der CPUs, GPUs oder eine Mischung aus beidem beinhalten kann. Der Compiler bestimmt, welche Ziele dieser unterstützen soll. Eine OpenCL-Anwendung kann auf einer Single-Core-CPU ausgeführt werden, aber normalerweise sind Mehrkernsysteme das Ziel, um mehr Gesamtleistung von einem System zu erhalten.

OpenCL kann auch auf FPGAs ausgeführt werden. Dieser Ansatz ist etwas statischer, da die Kernel in einem FPGA implementiert sind und sich seine Konfiguration normalerweise nicht mit der Zeit ändert. Alteras SDK für OpenCL verfügt über einen OpenCL-Compiler, der eine FPGA-Konfiguration erzeugt. Dazu gehört auch die Unterstützung der Konfiguration für die im Wesentlichen OpenCL-Laufzeit. Es gibt auch eine Softwareunterstützung, die die Daten zwischen einem Host und dem FPGA verschiebt und die Kernelausführung im FPGA initiiert.

Im Wesentlichen werden Daten in den Speicher des FPGAs abgelegt, auf den ein Kernel Zugriff hat. Die Ergebnisse können dann auf die gleiche Weise extrahiert oder einem anderen Kernel zur Verfügung gestellt werden, da OpenCL auf einer CPU oder GPU arbeitet. FPGAs haben den Vorteil, dass sie viele Operationen parallel durchführen.

CUDA ist nur Nvidias Version von OpenCL.

Falsch. Nvidias CUDA ist ähnlich wie OpenCL, aber sie sind unterschiedlich. Beide verwenden den Kernel-Ansatz zur Partitionierung von Code und bei unterstützen C und C++ für Kernel-Code.

CUDA ist eine Nvidia-Architektur, sie speziell auf Nvidia-GPU-Hardware ausgerichtet ist, aber auch Code für einige CPUs generieren kann, wie beispielsweise x86-Plattformen, die ähnliche Funktionen wie OpenCL bieten. Darüber hinaus enthält das CUDA-Toolkit zusätzliche Bibliotheken wie cuDNN für Deep Learning. CuFFT, cuBLAS und NPP (Nvidia Performance Primitives for Imaging). Nvidia-Gerätetreiber für Nvidia-Hardware unterstützen CUDA sowie OpenCL. Normalerweise wählen Entwickler, die sich an Nvidia-GPUs wenden, für Ihre Projekte CUDA oder OpenCL.

OpenCL läuft auf einem GPU besser als auf einer CPU.

Ja und nein. Typischerweise hat ein Grafikprozessor viel mehr Kerne als sogar eine Multicore-CPU. Viele Kerne können in einigen Anwendungen helfen, aber jede Beschleunigung ist in der Regel anwendungsspezifisch. Einige Anwendungen schneiden auf einer Multicore-CPU besser ab, während andere auf GPUs besser abschneiden. Es hängt viel davon ab, wie verschiedene Kernel geschrieben und ausgeführt werden, sowie von der Art der auszuführenden Operationen. Operationen, die die Vorteile der GPU-Funktionalität nutzen, laufen in der Regel besser auf einem GPU. Manchmal kann ein Mix aus Hardware die beste Alternative sein. Es ist möglich, ein OpenCL-System zu haben, das beide Bereiche umfasst.

Ich muss in OpenCL programmieren, um es zu nutzen.

Falsch. Es ist möglich, Anwendungen zu verwenden, die für eine OpenCL-Plattform geschrieben und kompiliert wurden. In diesem Fall muss auf der Plattform die OpenCL-Laufzeit installiert (in der Regel als Gerätetreiber) und die Anwendung muss für diese Plattform kompiliert sein. Dies ist vergleichbar mit herkömmlichen nativen Code-Anwendungn, die für ein Betriebssystem entwickelt wurden. Die Anwendungen erfordern die Ausführung des passenden Betriebssystems und der Hardware.

Eine weitere Möglichkeit, OpenCL zu verwenden, besteht darin, eine OpenCL-basierte Bibliothek zu verwenden und Funktionen in der Bibliothek von einer Anwendung aus aufzurufen, die auf der CPU läuft. Die OpenCL-APIs sind für eine Reihe von Programmiersprachen definiert, darunter Python, Java, C und C++.

Das Schreiben eines OpenCL-Programms ist nur dann notwendig, wenn keines der beiden vorherigen Szenarien geeignet ist.

OpenCL kann nur von C-Anwendungen verwendet werden.

Falsch. Kernel-Code wird auch C- oder C++-Quellcode kompiliert, aber eine OpenCL-Anwendung besteht nicht nur aus dem Kernel-Code. Es ist möglich, OpenCL-basierte Bibliotheken und Anwendungen in Verbindung mit Anwendungscode auf der CPU-Seite zu verwenden, der in fast jeder Programmiersprache geschrieben ist.

OpenCL spezifiziert C- und C++-APIs für die Schnittstelle mit OpenCL-Anwendungen. Diese APIs wurden in andere Programmiersprachen übersetzt, darunter populäre wie Java und Python.

OpenCL ist schwer zu erlernen und zu programmieren.

Wahr und falsch. OpenCL verwendet C und C++, was den Einstieg erleichtert, wenn man einen Hintergrund in C oder C++ hat. Der Trick ist, dass OpenCL seine eigenen Konventionen, Techniken und Debugging-Methoden hat, die sich von der Standard-C und C++-Entwicklung unterscheiden.

Es gibt eine Vielzahl von Informationen, Dokumentationen und Beispielen für OpenCL im Internet sowie zahlreiche Bücher zu diesem Thema. Dennoch gibt es noch einiges zu lernen, um effiziente und fehlerfreie OpenCL-Anwendungen zu erstellen. Debugger wie CodeXL von AMD haben ähnliche, aber andere Eigenschaften als herkömmliche CPU-Debugger. OpenCL verwendet auch verschiedene Tracing und Profiling Tools.

OpenCL kann nicht für die Stream-Programmierung verwendet werden.

Falsch. Die Stream-Programmierung ist normalerweise mit einem Datenstrom wie beispielsweise einem Audio- oder Videostrom verbunden. Die Verwaltung der Daten ist etwas komplexer als eine typische OpenCL-Anwendung, aber es ist möglich.

OpenCL läuft nur auf AMD- und Nvidia-GPUs.

Falsch. OpenCL wird auf den meisten GPGPUs ausgeführt, einschließlich GPUs von ARM, Imagination Technologies, Intel und anderen Anbietern. Es läuft jedoch nicht auf allen GPUs und erfordert eine passende Laufzeit/Treiber und einen OpenCL-Compiler. Die GPGPUs können in eine CPU integriert werden oder sie können eigenständige GPUs sein, die mit einem Host verbunden sind (normalerweise über PCI Express).

OpenCL erfordert viel Hardware zum Ausführen.

Falsch, obwohl mehr Hardware dazu neigt, die Leistung zu verbessern. OpenCL kann auf Single-Core-Mikrocontrollern ausgeführt werden, aber es ist sinnvoller auf Geräten mit mehreren Kernen oder GPUs, die OpenCL unterstützen. OpenCL-Systeme können auf sehr große Cluster skaliert werden, die mehrere Nodes mit mehreren CPUs oder GPUs enthalten. Die Verteilung von Code und Daten innerhalb eines Clusters kann eine komplexere Aufgabe sein, aber dies ermöglicht es Entwicklern, sich auf den Code für die Kernel zu konzentrieren.

OpenCL ist nicht gut für Embedded-Anwendungen.

Falsch. OpenCL kann in Embedded-Anwendungen sehr nützlich sein. Das eingebettete System wird Unterstützung für OpenCL benötigen, aber es gibt eine Reihe von Mikrocontrollern und SoCs, die über ausreichende Ressourcen verfügen, zusammen mit der OpenCL-Unterstützung, um ihren Einsatz sinnvoll zu gestalten.

Embedded Designer haben tatsächlich einen Vorteil, da der Leistungsumfang und die Anforderungen bekannt sind. Sie können oft die verwendeten Chips anpassen, um sie nach oben oder unten zu skalieren, um diese Anforderungen zu erfüllen. OpenCL kann auch bei leistungsempfindlichen Anwendungen helfen, da es oft effizienter ist.

Dennoch ist OpenCL nicht gerade günstig. Die notwendige Hardware kostet Geld und verbraucht Strom. Es kann die Implementierung von Funktionen ermöglichen, die ohne OpenCL nicht möglich wären. Die Entscheidung, wann und wie OpenCL eingesetzt wird, ist der entscheidende Faktor für Entwickler.

Vielen Dank für Ihren Besuch.