Az OpenCL programozási nyelv

Utasítások, vezérlési szerkezetek

Értékadás

C-hez megszokott módon. Lényegesebb eltérést a vektor esetében tapasztalunk.

Vektor komponensek

A 2, 3, 4 elemű vektorok komponenseit elérhetjük rendre a megszokott x, y, z, w tagokkal.

A vektor nem létező elemére való hivatkozás hibát okoz.

float2 pos; pos.x = 1.0f; // jó pos.z = 1.0f; // hibás float3 pos; pos.z = 1.0f; // jó pos.w = 1.0f; // hibás

Lehetőség van többszörös hivatkozásra. Például:

float4 c; c.xyzw = (float4)(1.0f, 2.0f, 3.0f, 4.0f); c.z = 1.0f; c.xy = (float2)(3.0f, 4.0f); c.xyz = (float3)(3.0f, 4.0f, 5.0f);

Megengedett a komponensek keverése, jobb oldali kifejezés esetén azok duplikálása is.

float4 pos = (float4)(1.0f, 2.0f, 3.0f, 4.0f); float4 swiz= pos.wzyx; // swiz = (4.0f, 3.0f, 2.0f, 1.0f) float4 dup = pos.xxyy; // dup = (1.0f, 1.0f, 2.0f, 2.0f) pos.xw = (float2)(5.0f, 6.0f); // pos = (5.0f, 2.0f, 3.0f, 6.0f) pos.wx = (float2)(7.0f, 8.0f); // pos = (8.0f, 2.0f, 3.0f, 7.0f) pos.xyz = (float3)(3.0f, 5.0f, 9.0f); // pos = (3.0f, 5.0f, 9.0f, 4.0f) pos.xx = (float2)(3.0f, 4.0f); // hibás - kétszeres x komponens // hiba - float2 és float4 típusok között értékadás nem lehetséges pos.xy = (float4)(1.0f, 2.0f, 3.0f, 4.0f); float4 a, b, c, d; float16 x; x = (float16)(a, b, c, d); x = (float16)(a.xxxx, b.xyz, c.xyz, d.xyz, a.yzw); // hibás – a.xxxxxx nem érvényes vektor típus x = (float16)(a.xxxxxxx, b.xyz, c.xyz, d.xyz);

További lehetőség a vektor komponenseinek indexel való elérése. A lehetséges indexek a következők:

Vektor típusa Használható indexek
2 elemű 0, 1
3 elemű 0, 1, 2
4 elemű 0, 1, 2, 3
8 elemű 0, 1, 2, 3, 4, 5, 6, 7
16 elemű 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A, b, B, c, C, d, D, e, E, f, F

Az index jelölést egy s vagy S betű előzi meg. Például:

float8 f; // f.s0 - f első eleme // f.s7 - f 8. eleme float16 x; // x.sa vagy x.sA - f 11. eleme // x.Sf vagy x.SF - f 16. eleme

A jelölés nem keverhető az .xyzw szelektorokkal.

További szelektorok

A .lo, .hi, .even, .odd szelektorok segítségével a vektorok különböző részeit érhetjük el. A .lo szelektor a vektor alsó felét adja vissza, a .hi a felső felét, míg a .even és .odd rendre a vektor páratlan illetve páros sorszámú eleméből képez egy újabb vektor.

A szelektorok egymás után is alkalmazhatóak míg skalár típust nem kapunk.

3 elemű vektor működése hasonló a 4 elemű vektoréhoz de a w komponensnek megfelelő érték meghatározatlan lesz.

float4 vf4; float2 low2 = vf4.lo; // = vf4.xy float2 high2 = vf4.hi; // = vf4.zw float2 even2 = vf4.even; // = vf4.xz float2 odd2 = vf4.odd; // = vf4.yw float8 vf8; float4 left4 = vf8.odd; float4 right4 = vf8.even; float2 high2 = vf8.even.hi; float2 low2 = vf8.odd.lo;

Vektor műveletek

A vektor műveletek komponens szinten működnek. A skalárok automatikusan konvertálódnak a megfelelő méretű vektorra. Például:

float4 v, u, w; float f; v = u + f; // ekvivalens v.x = u.x + f; v.y = u.y + f; v.z = u.z + f; v.w = u.w + f; w = v + u; // ekvivalens w.x = v.x + u.x; w.y = v.y + u.y; w.z = v.z + u.z; w.w = v.w + u.w;

Szekvencia

Hasonlóan működik mint a C-ben.

{ utasítás1 ; utasítás2 ; ... utasításn ; }

Elágazás

A szerkezetek és a működés is hasonló a C-ben megszokotthoz.

Ciklus

A C-ben megszokott szerkezezek használhatóak. Mindhárom esetben a ciklusmagba való belépés feltételét kell megadni.

Vezérlésátadó utasítások