Ergebnis mit Hilfe eines OpenCL Kernels erzielt. Mittels des Aufrufs *get\_global\_id(0);* erhält das aktuell ausgeführte Work Unit seine ID und kann daraus die Position in den Bildarrays errechnen, die es zu bearbeiten hat. Im Gegensatz zum klassischen C-Programm kann der OpenCL Kernel von einer Vielzahl von Work Units parallel abgearbeitet werden.\
\
OpenCL verfügt über eine Vielzahl von Datentypen und Funktionen, die Grafikprogrammierung unterstützen und vereinfachen. So existieren die Datentypen *float2, float3, float4, float8* und *float16* im OpenCL Standard. Diese entsprechen n-dimensionalen Vektoren deren Komponenten *float* Werte beinhalten. So kann eine Variable x des Typs *float3* z.B. über seine Komponenten *x.S0*, *x.S1* und *x.S2* angesprochen werden. Arithmetische Operationen auf Vektor-Datentypen werden von den GPUs unterstützt und entsprechend schnell berechnet. So ist eine Addition zweier *float4*- Werte auf einer GPU ebenso schnell oder gar schneller wie die Addition zweier reiner *float*-Werte mittels einer CPU. OpenCL liefert, wie bereits erwähnt, auch mehrere nützliche Funktionen für die Grafikprogrammierung. So kann mittels *fast\_normalize(x)* ein *float-n*-Wert schnell normalisiert werden. Ebenso werden Funktionen zur Berechnung des Skalarprodukts (*dot(v1,v2)*) oder des Kreuzprodukts (*cross(v1,v2)*) zweier Vektoren mitgeliefert, welche durch die GPU ebenfalls besonders schnell ausgeführt werden können.

Entwurf eines Raycasters mit OpenCL
===================================

In diesem Kapitel wird ein 