OpenCL C

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

  1. OpenCL 1.0 Specification (13. Dezember 2008)
  2. Chris Lattner (LLVM-Chefentwickler, Apple-Angestellter): A cool use of LLVM at Apple: the OpenGL stack (15. August 2006)
  3. : NVIDIA Adds OpenCL To Its Industry Leading GPU Computing Toolkit (14. Dezember 2008)

Weblinks


Wikimedia Foundation.

Игры ⚽ Поможем сделать НИР

Schlagen Sie auch in anderen Wörterbüchern nach:

  • OpenCL — Entwickler Khronos Group Aktuelle Version 1.2 (16. November 2011) Betriebssystem plattformunabhängig Kategorie Programmierschnittstelle …   Deutsch Wikipedia

  • OpenCL — Тип API Разработчик Apple Inc., Khronos Group Операционная система Кроссплатформенное программное обеспечение Первый выпуск 9 декабря 2008 Последняя версия 1.2 (15 ноября 2011) Лицензия …   Википедия

  • OpenCL — Desarrollador Grupo Khronos http://www.khronos.org/opencl Información general Diseñador Apple …   Wikipedia Español

  • OpenCL — This article is about the parallel computing library. For the cryptographic library formerly named OpenCL, see Botan (programming library). OpenCL Original author(s) Apple Inc. Developer(s) Khronos Group …   Wikipedia

  • OpenCL —  Ne doit pas être confondu avec OpenGL. OpenCL (Open Computing Language) est la combinaison d une API et d un langage de programmation dérivé du C, proposé comme un standard ouvert par le Khronos Group. OpenCL est conçu pour programmer des… …   Wikipédia en Français

  • Open CL — OpenCL  Ne doit pas être confondu avec OpenGL. OpenCL (Open Computing Language) est la combinaison d une API et d un langage de programmation dérivé du C, proposé comme un standard ouvert par le Khronos Group. L objectif d OpenCL est de… …   Wikipédia en Français

  • Bullet Physics Library — Физический движок …   Википедия

  • Mac OS X Snow Leopard — Mac OS X v10.6 Snow Leopard Part of the Mac OS X family …   Wikipedia

  • Compute Unified Device Architecture — Entwickler Nvidia Aktuelle Version 4.0 (Mai 2011) Betriebssystem Windows, Linux, MacOS X Kategorie …   Deutsch Wikipedia

  • AMD Fusion — Codename(s) Fusion Desna Ontario Zacate Llano Hondo (cancelled) Wichita (cancelled) Krishna (cancelled) Trinity Weatherford Richland IGP Wrestler WinterPark BeaverCreek ATI/Radeon Driver related BTC[1] [2] …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”