Parallel/OpenCL

데이터 형

Houkibosi 2013. 10. 8. 13:52
OpenCL은 C언어를 기반으로 하는 기술이기 떄문에
C언어에서 벡터화가 추가되는 정도이다.
컴파일은 C99를 기반으로 하고있다.


I. 스칼라 데이터형 
   

 OpenCL Type

 API Type

 Description

 bool 

 

 true (1) or false (0)

 char 

 cl_char

 8-bit signed

 unsigned char, uchar

 cl_uchar

 8-bit unsigned

 short

 cl_short

 16-bit signed

 unsigned short, ushort

 cl_ushort

 16-bit unsigned

 int

 cl_int

 32-bit signed

 unsigned int, uint

 cl_uint

 32-bit unsigned

 long

 cl_long

 64-bit signed

 unsigned long, ulong

 cl_ulong

 64-bit unsigned

 float 

 cl_float

 32-bit float 

 double  (OPTIONAL)

 cl_double

 64-bit. IEEE 754

 half

 cl_half

 16-bit float (storage only)

 size_t

 

 32- or 64-bit unsigned integer

 ptrdiff_t

 

 32- or 64-bit signed integer

 intptr_t

 

 32- or 64-bit signed integer

 uintptr_t

 

 32- or 64-bit unsigned integer

 void

 void

void




특이사항은 없다. API type은 표준 OpenCL의 type을 재정의한 것에 불과하다.
long이 64비트라는것과 int가 32비트 또는 62비트라는것. 그리고 half형, 포인터형의 추가정도이다.
직관적인 내용이므로 설명은 생략한다.

- 주의사항! half형은 half *p = (half*)float_val등의 캐스팅은 되지 않는다. opencl함수를 통해서 읽고 쓴다.
필요하다면 스펙참조..

II. 벡터 데이터형 (OpenCL language type - API type)

 OpenCL Type API Type Description

 charn 

 cl_charn

 8-bit signed

 ucharn 

 cl_ucharn

 8-bit unsigned

 shortn 

 cl_shortn

 16-bit signed

 ushortn 

 cl_ushortn

 16-bit unsigned

 intn 

 cl_intn

 32-bit signed

 uintn 

 cl_uintn

 32-bit unsigned

 longn 

 cl_longn

 64-bit signed

 ulongn 

 cl_ulongn

 64-bit unsigned

 floatn 

 cl_floatn

 32-bit float

 doublen    (OPTIONAL) cl_doublen 64-bit float



사용 1> 스칼라변수를 벡터변수에 대입 -> 동일값으로 치환
int4 a;
int b = 1;
a = (int4)b; // a = 1,1,1,1의 값이 치환된다.

사용 2> 벡터변수내의 개별 스칼라값의 사용 (xyzw 또는 s0123사용)
int4 a, b;
int2 c;
a.x = 0;           // x를 첫번째 스칼라값이다. 여기에 0을대입
a.xy = (int2)(1,2); // 두개의 스칼라값을 대입한다. 소괄호()의 사용을 주의깊게 보자.
a.xwyw = b.xxyy; // 같은스칼라값을 복사하는 연산도 가능하다. L-value에는 xxyy식으로 쓰면안된다.
b.s0123 = a.wzyx; // s0123등 앞에 s(S)를 붙이고 숫자로 인덱스를 붙여도 xyzw와 같다.
a.s31 = c.xy; // 2byte일때는 xy만 사용한다. 2바이트형에서는 zw는 사용할수없다.

사용 3> lo,hi,even,odd의 사용 - 데이타의 추출/배치
int4 a, b;
b.even = a.lo; // a의 하위 2스칼라값을 even번째에 배치한다.
// b <- a0 xx a1 xx
b.odd = a.hi // 상위 2스칼라값을 odd번째에 배치한다.
// b <- a0 a2 a1 a3 : 최종결과


III. 그외 데이타형
1. image2d_t - 2D image
2. image3d_t - 3D image
3. sampler_t - 샘플러
4. event_t - 이벤트

캐스팅
1. 벡터형끼리는 캐스팅이 되지 않는다.!
int4 a; float4 b; -> a = (int4)b; - (안됨)
2. 스칼라형은 캐스팅이된다.
int4 a; float b; -> a = (int4)b; - b가 int로 바뀌고 다시 b,b,b,b값으로 a에 저장된다.
3. 벡터형끼리의 캐스팅은 함수를 사용한다.
uchar4 u;
int4 c = convert_int4(u);
4. 벡터와 스칼라의 연산은 스칼라값이 벡터로 변경된다.
float4 v, u;
float f;
v = u + f; // 스칼라 f값이 벡터로 확장된다.




출처 : http://www.khronos.org/files/opencl-1-2-quick-reference-card.pdf

http://cafe.naver.com/opencl/5