Warum OpenCL?

Es gibt Berechnungen, die einen hohen Grad an Parallelität aufweisen. Bspw. kann man eine Vektoraddition derart auffassen, dass jede Stelle von einer kleinen Recheneinheit berechnet wird.

Grafikkarten enthalten, anders als CPUs, viele kleine Recheneinheiten, die parallel rechnen können. Der Takt der Prozessoren ist sehr gering, allerdings können durch den hohen Grad an Parallelität viele Daten auf einmal (nebenläufig) berechnet werden.

Mit der Entwicklung von Grafikkarten wurden die Prozessoren immer generischer (allgemeiner benutzbar), und können mittlerweile mit OpenCL oder CUDA (Nvidia) für gewöhnliche Berechnungen genutzt werden. Hoch parallele Berechnungen können auf den Grafikkarten schnell ausgeführt werden, weil viele Berechnungen gleichzeitig von statten gehen können. Zu Beachten ist, neben den gewöhnlichen Problemen der parallelen Programmierung (Race Conditions, etc) auch, dass sich eine Kommunikation oder Synchronisation in OpenCL zwischen den Working Groups (Recheneinheiten) nicht realisieren lässt.

Nehmen wir folgendes Beispiel. Wir wollen einen Vektor mit 3 Komponenten mit einem anderen addieren.

1   4 
2 + 5
3   6

Eine gewöhnliche sequentielle vorgehensweise wäre, jede Komponente einzeln zu addieren. Jedoch ist klar, dass das Ergebnis jeder Zeile nicht von anderen Zeilen beeinflusst wird (die Komponentenberechnungen sind also unabhängig voneinander und damit parallelisierbar). So kann während die erste Recheneinheit die erste Komponente berechnet, eine andere die zweite und wieder eine andere die dritte Komponente berechnen. Somit sparen wir etwa 3 Zyklen ein.

Was ist mit CUDA?

CUDA ist eine Technik von Nvidia, die im Prinzip ein ähnliches Ziel hat, wie OpenCL. CUDA ist speziell auf Nvidia Karten zugeschnitten, was zum Einen den Nachteil hat, dass die geschriebene Software, die darauf aufbaut nicht auf AMD oder Intel Grafikkarten portabel ist und, dass keine Beschleuniger (Intel Xeon Phi) oder CPUs (neuere Intel oder AMD x86 CPUs) angesprochen werden können.

Umgekehrt gilt, dass OpenCL (wenigstens bis zur Version 1.1) auf Karten aller Hersteller läuft (bzw. laufen kann). Nvidia hat sich entschieden ihre Grafikkarten nur mit der Version 1.1 von OpenCL kompatibel zu halten, die Version 1.2 und 2.0 gibt es nicht auf Nvidia Grafikkarten (Stand 16.04.2015). Allerdings bringen spätere Versionen oft nur kleinere Änderungen oder Features. OpenCL funktioniert problemlos auf Beschleunigern, Grafikkarten oder CPUs und kann damit auf vielen Rechnern verwendet werden. Es ist sogar möglich mehrere Beschleuniger gleichzeitig in einem System zu benutzen.

Außerdem ist OpenCL ein offener Standard, dh. es können neue Hersteller leicht übernehmen, wohingegen CUDA ein Standard von Nvidia ist, der nicht oder nur sehr teuer lizenziert werden kann. Wird Nvidia einmal untergehen, wird es kein CUDA mehr geben (ähnliche Befürchtungen hatte man übrigens beim Aufkauf von SUN Microsystems von Oracle).

In der Nutzung unterscheiden sich OpenCL und CUDA kaum. CUDA ist hier und da etwas komfortabler und hat schnellere Release-Zyklen. Unterstützung von IDEs gibt es bei beiden Systemen und es gibt für beide Systeme Hilfe durch Tools, Offline-Compiler und Debugger.