OpenCL (Open Computing Language) ist eine Programmierplattform für CPUs ,GPUs und DSPs mit zugehöriger Programmiersprache OpenCL C. Sie soll erstmals von Apple 2009 mit OS X 10.6 (Snow Leopard) auf den Markt kommen und ist als offener Standard bei der Khronos Group erarbeitet worden [1]. Die Spezifikation für OpenCL 1.0 wurde am 8. Dezember 2008 veröffentlicht.
OpenCL
| |
---|---|
![]() | |
Basisdaten
| |
Entwickler | Khronos Group |
Erscheinungsjahr | 28. August 2009 |
Aktuelle Version | 1.0 (8. Dezember 2008) |
Betriebssystem | plattformunabhängig |
Programmiersprache | C++, C |
Kategorie | API |
Lizenz | verschieden |
OpenCL |
OpenCL Programme und Programmteile werden zur Laufzeit auf vorhandene OpenCL fähige Devices verteilt. Die Sprache selbst basiert auf der Syntax von ISO C99 und wurde um weitere Datentypen und Funktionen zur parallelen Verarbeitung erweitert.
Architektur
Die Architektur von OpenCL besteht aus einem Host und einem oder mehreren OpenCL Devices. Ein Device wiederum besteht aus einem oder mehreren Recheneinheiten (englisch compute unit, CU) die ihrerseits in ein oder mehrere ausführende Elemente (englisch processing element, PE) unterteilt sind. Der Host verteilt sogenannte Kernel auf die Devices.
Es gibt zwei Arten von Kernel:
- OpenCL Kernel: Diese sind in der Programmiersprache OpenCL C geschrieben. OpenCL C ist eine Untermenge von ISO C99 und wurde um weitere Funktionen und Datentypen zur parallelen Verarbeitung erweitert.
- Native Kernel: Diese Kernel sind optional und implementierungs spezifisch.
Die OpenCL Kernel werden zur Laufzeit vom OpenCL Compiler übersetzt und ausgeführt. Hierdurch muss zur Entwicklungszeit nicht bekannt sein, auf welcher Hardware das Programm zur Laufzeit ausgeführt werden wird.
OpenCL C
Ergänzend zu den C99 Datentypen unterstützt OpenCL C folgende Datentypen:
- half: 16 Bit Fließkommazahlen nach IEEE 754-2008
- Vektordatentypen: Die Datentypen char, uchar, short, ushort, int, uint, long, ulong und float gibt es als Vektoren mit 2, 4, 8 und 16 Elementen. Die Elementanzahl wird hierbei an den Namen der Datentypen angehängt, also z.B.: uchar4, float8 oder int16.
- image2d_t: Ein zweidimensionales Bild.
- image3d_t: Ein dreidimensionales Bild.
- sampler_t: Ein sampler, der definiert, wie ein Bild abgetastet wird.
- event_t: Ein Event Handler.
Folgende Datentypen wurden zudem für spätere Versionen von OpenCL reserviert:
- booln: Ein Vektor mit bool.
- double, doublen: 64 Bit Fließkommazahlen und Vektoren. Eine Erweiterung für double existiert bereits, deren Unterstützung ist aber bei OpenCL 1.0 nicht zwingend erforderlich.
- halfn: Ein Vektor mit 16 Bit Fließkommazahlen.
- quad, quadn: 128 Bit Fließkommazahlen.
- complex {half|float|double|quad}: Komplexe Zahlen mit unterschiedlicher Genauigkeit.
- complex {half|float|double|quad}n: Vektoren komplexer Zahlen mit unterschiedlicher Genauigkeit.
- imaginary {half|float|double|quad}: Imaginär Zahlen mit unterschiedlicher Genauigkeit.
- imaginary {half|float|double|quad}n: Vektoren imaginärer Zahlen mit unterschiedlicher Genauigkeit.
- {float|double}nxm: nxm Matrizen mit 32 oder 64 Bit Genauigkeit.
- long double, long doublen: Fließkommazahlen und Vektoren mit mindestens der Genauigkeit von double und maximal der Genauigkeit von quad.
- long long, long longn: Vorzeichenbehaftete 128 Bit Integerzahlen und Vektoren.
- unsigned long long, long longn: Vorzeichenlose 128 Bit Integerzahlen und Vektoren.
Arithmetische Operationen (+, -, *, /, %, ++, --), Vergleichsoperationen (>, >=, ==, !=, <= <), Bitoperatoren (&, |, ^, ~) sowie logische Operatoren (&&, ||) sind sowohl für skalare Datentypen definiert, als auch für Vektoren. Werden sie auf Vektoren angewendet, so wird die Operation komponentenweise durchgeführt. Hier verhält sich OpenCL analog zu bekannten Shadersprachen wie zum Beispiel glsl.
Ebenfalls den Shadersprachen entlehnt sind eine Reihe von mathematischen Funktionen, die ebenfalls komponentenweise durchgeführt werden. Beispielsweise Sinus, Cosinus, Wurzel, Minimum, Maximum etc.
Nutzung von OpenGL Objekten
OpenCL kann direkt auf Objekte von OpenGL zugreifen, etwa auf Texturen. Somit kann OpenCL genutzt werden um beispielsweise OpenGL Texturen zu ändern, ohne die Daten umkopieren zu müssen.
Erweiterungen
Wie OpenGL kann auch OpenCL durch herstellerspezifische Erweiterungen um zusätzliche Funktionen ergänzt werden. Beispiele für bereits definierte Erweiterungen sind:
- Fließkommazahlen mit doppelter Genauigkeit (64 Bit Fließkommazahlen, cl_khr_fp64).
- Vektoren von Fließkommazahlen mit halber Genauigkeit (16 Bit Fließkommazahlen, cl_khr_fp16).
- Die Art des Rundens bei Fließkommaoperationen zu definieren (cl_khr_select_fprounding_mode).
- Schreiben in 3D Bilder (cl_khr_3d_image_writes).
Implementierungen
OpenCL kann für beliebige Betriebssysteme und Hardwareplattformen implementiert werden. So ist in der Spezifikation von CPUs ,GPUs, DSPs und dem Cell die Rede. Es existiert zudem eine Spezifikation für eingebettete Systeme mit reduzierten Anforderungen.
Gemeinhin wird davon ausgegangen, dass die OpenCL Implementierung bei Mac OS X 10.6 technisch auf LLVM basiert, eine Technologie, die Apple in OS X seit Version 10.5 in seinem JIT OpenGL Compiler [2] und auch im iPhone einsetzt, sowie auf Clang.
Quellen
- ↑ OpenCL 1.0 Specification (13. Dezember 2008)
- ↑ Chris Lattner (LLVM-Chefentwickler, Apple-Angestellter): A cool use of LLVM at Apple: the OpenGL stack (15. August 2006)