- OpenCL C
-
OpenCL Entwickler: Khronos Group Aktuelle Version: 1.0
(8. Dezember 2008)Betriebssystem: plattformunabhängig Kategorie: API Lizenz: verschieden OpenCL 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 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.
Inhaltsverzeichnis
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 Kerneln:
- 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 implementierungsspezifisch.
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 Gleitkommazahlen nach IEEE 754r
- 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 Gleitkommazahlen 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 Gleitkommazahlen.
- quad, quadn: 128 Bit Gleitkommazahlen.
- 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äre 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: Gleitkommazahlen 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, unsigned 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.
Gegenüber C ist OpenCL C unter anderem in folgenden Punkten eingeschränkt:
- Es gibt keine Pointer auf Funktionen.
- Rekursion ist nicht möglich.
- Arrays dürfen keine variable Länge haben.
Dieser Beispielkernel berechnet von zwei Arrays komponentenweise die Summe der Elemente:
__kernel void vec_add (__global const float *a, __global const float *b, __global float *c) { int gid = get_global_id(0); c[gid] = a[gid] + b[gid]; }
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:
- Gleitkommazahlen mit doppelter Genauigkeit (64 Bit Gleitkommazahlen, cl_khr_fp64).
- Vektoren von Gleitkommazahlen mit halber Genauigkeit (16 Bit Gleitkommazahlen, cl_khr_fp16).
- Die Art des Rundens bei Gleitkommaoperationen 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-Prozessor 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.
NVidia hat angekündigt, OpenCL über ihre GPGPU-Schnittstelle CUDA zu unterstützen[3].
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)
- ↑ : NVIDIA Adds OpenCL To Its Industry Leading GPU Computing Toolkit (14. Dezember 2008)
Weblinks
Wikimedia Foundation.