Az OpenCL programozási nyelv

Típusok, típuskonstrukciók

Beépített skalár típusok

Néhány fontosabb beépített skalár típus:

Típus Leírás
bool Feltételes típus. Értéke igaz vagy hamis. Az igaz érték megfelel az egész 1-nek, a hamis az egész 0-nak
char 8 bites, előjeles egész
unsigned char, uchar 8 bites, előjeletlen egész
short 16 bites, előjeles egész
unsigned short, ushort 16 bites, előjeletlen egész
int 32 bites, előjeles egész
unsigned int, uint 32 bites, előjeletlen egész
long 64 bites, előjeles egész
unsigned long, ulong 64 bites, előjeletlen egész
float Szimpla pontosságú lebegőpontos szám. A műveleteknek meg kell felelenie a IEEE-754 szabványnak.
half Fél (16 bit) pontosságú lebegőpontos szám. A műveleteknek meg kell felelenie a IEEE-754-2008 szabványnak.
size_t Előjelentlen egész, a sizeof operátor eredményének típusa

Beépített vektor típusok

Lehetőségünk van vektorokat képezni a char, unsigned char, short, unsigned short, integer, unsigned integer, long, unsigned long, float típusokból.

Szintaxis:

charn, ucharn, shortn, ushortn, intn, uintn, longn, ulongn, floatn,

ahol n 2, 4, 8 és 16 közül kerülhet ki. Az a szabvány 1.1-es verziója bevezeti a 3 használatának lehetőségét is.

Vektor literálok

Vektor literálok segítségével vektorokat hozhatunk létre skalárok, más vektorok vagy ezek keverékének listájával. A literál egy zárójelezett vektortípusnévből és egy zárójelezett értéklistából áll. Felhasználhatók inicializálásra, vagy konstansként egy kifejezésben. Vagy egy literál értéknek kell lennie, vagy pontosan annyinak, amekkora a létrehozandó vektor mérete. Egy érték esetén az minden vektorkomponensnek értékül adódik.

Példák:

float4 f = (float4)(1.0f, 2.0f, 3.0f, 4.0f); uint4 u = (uint4)(1); // eredmény (1, 1, 1, 1). float4 f = (float4)((float2)(1.0f, 2.0f),(float2)(3.0f, 4.0f)); float4 f = (float4)(1.0f, (float2)(2.0f, 3.0f), 4.0f); float4 f = (float4)(1.0f, 2.0f); // hiba

További beépített típusok

Típus Leírás
image2d_t 2D-s képobjektum. Grafikus hardveren annak 2D-s textúráit reprezentálja.
image3d_t 3D-s képobjektum. Grafikus hardveren annak 3D-s textúráit reprezentálja.
sampler_t Mintavételező képobjektumok kezelésére. Megadhatunk különböző szűrési módszereket (legközelebbi, lineáris). Grafikus hardver esetén annak mintavételező egységeit reprezentálja.

Címtér minősítők

Változó deklarációknál a __global, __local, __private, __constant minősítőkkel meghatározhatjuk a változó elhelyezkedési helyét a memóriában. Alapértelmezett minősítő a __private. A program szintű láthatóságú változók csak a konstans memóriában helyezkedhetnek el. Különböző típusú memóriára hivatkozó pointerek nem adhatók értékül egymásnak. A minősítőkkel ekvivalensek a global, local, private, constant kulcsszavak is.

Elérhetőségi minősítők

A kernelek nem írhatnak és olvashatnak egyszerre egy képobjektumot. A __read_only (read_only), __write_only (write_only) minősítőkkel állíthatjuk be a hozzáférés módját. Az alapértelmezett a __read_only.

__kernel void foo (read_only image2d_t imageA, write_only image2d_t imageB) { ... }

Típuskonstrukciók

Lehetőség van a tömb, rekord, unió típus létrehozására. A szintaxis megfelel a C99-nek.

typedef struct { float2 a[3]; int4 b[2]; } foo_t; foo_t my_info[10]; union{ float f; uint u; int i} u;