OpenCL C
개요
OpenCL C에 대한 정리.
제약사항
- 커널 함수들은 다음의 제약을 가진다:
- 커널 함수에 대한 인자들 중 포인터는 global, constant, local 지정자를 가진다.
- 커널 함수에 대한 인자는 포인터에 대한 포인터로 선언될 수 없다.
- 커널 함수에 대한 인자는 다음의 내장형으로 선언될 수 없다: bool, half, size_t, ptrdiff_t, intptr_t, uintptr_t, event_t
- 커널 함수의 리턴형은 void여야만 한다.
- 커널 함수의 인자 중 구조체로 선언되는 것은 구조체의 원로 (버퍼, 이미지와 같은) OpenCL 객체를 전달할 수 없다.
-
비트 필드 구조체 멤버는 지원되지 않는다.
- 가변 길이 배열과 우연한(크기가 정해지지 않은) 구조체 배열은 지원되지 않는다.
- 가변 개수의 인자를 가지는 매크로와 함수는 지원되지 않는다.
- extern, static, auto, register 저장 종류 지정자는 지원되지 않는다.
- __func__와 같은 이미 정해진 식별자는 지원되지 않는다.
- 재귀호출은 지원되지 않는다.
- C99 표준 헤더에서 정의한 라이브러리 함수들은 사용 가능하지 않고 프로그램에서 포함될 수 없다. 이런 헤더는 다음과 같다:
assert.h, ctype.h, complex.h, errno.h, fenv.h, float.h, inttypes.h, limits.h, locale.h, setjmp.h, signal.h, stdarg.h, stdio.h, stdlib.h, string.h, tgmath.h, time.h, wchar.h, wctype.h
- image2d_t와 image3d_t 이미지형은 함수 인자의 형으로만 명세될 수 있다. 함수 안에서 지역 변수나 혹은 함수의 리턴형으로 선언될 수 없다. 이미지 함수 인자는 수정이 불가능하다. 이미지형은 private, local, constant 주소공간 지정자와 함께 사용될 수 없다. 이미지형은 read_write 접근 지정자와 함께 사용될 수 없지만, 나중을 위해 예약되어 있다. 이미지형은 변수, 구조체나 공용체 필드, 이미지의 배열, 이미지에 대한 포인터 혹은 함수의 리턴형으로 사용될 수 없다.
-
샘플러형 sampler_t는 함수 인자의 형이나 프로그램 범위에서 선언된 변수 혹은 커널 함수의 가장 바깥 범위에서 선언된 변수로만 명세될 수 있다. 커널 함수에서 가장 바깥 범위가 아닌 곳에서 선언된 샘플러 변수의 동작은 구현에 따라 다르게 정의된다. 샘플러에 대한 포인터 혹은 함수의 리턴형으로 사용될 수 없다. 샘플러형은 local, global 주소공간 지정자와 함께 사용될 수 없다.
-
이벤트형 event_t는 커널 함수를 제외한 함수 인자 혹은 함수 안에서 선언된 변수의 형으로 사용될 수 있다. 이벤트형은 이벤트 배열을 선언하는 데 사용되 수 있다. 이벤트형은 이벤트에 대한 포인터를 선언하는 데 사용될 수 있는데, 예를 들어 다음과 같이 사용 가능하다:
event_t *even_ptr. 이벤트 인자 혹은 변수는 수정이 불가능하다. 이벤트형은 구조체나 공용체 필드 혹은 프로그램 범위에서 선언된 변수들에 대해 사용될 수 없다. 이벤트형은 local, global, constant 주소공간 지정자와 함께 사용될 수 없다.
- 커널에서 단축 불가능한 제어 플로우는 구현에 따라 정의된다. 단축 불가능한 제어 플로우는 일반적으로 goto문을 사용하는 코드에서 발견된다. 단축 불가능한 제어 플로우의 예는 중첩된 반복문안에서 goto문을 사용하여 분기하거나 Duff의 디바이스와 같은 분기문이다.
출처 - OpenCL 프로그래밍 가이드(아프탑 문시, 베네딕트 R. 가스터, 티모시 G. 맷슨, 제임스 펑, 단 긴스부르크 공저)