본문 바로가기
멀티코어 프로그래밍/OpenCL

OpenCL 프로그램, 커널, 커맨드 큐

by 기리의 개발로그 2015. 7. 25.

OpneCL 프로그램, 커널, 커맨드 큐



프로그램과 커널


- 프로그램 오브젝트

- 프로그램 소스 또는 바이너리

- 각 디바이스별 실행 코드

- 커널 오브젝트의 리스트


- 커널 오브젝트

- 디바이스에서 실행되는 하나의 함수

- 프로그램 내의 하나의 커널에 해당

- __kernel이 사용된 함수

- 커널의 파라미터 정보

- 호스트 프로그램이 지정한 실제 값을 저장

- 기타 커널 정보

- 커널명, 메모리 사용량, 속성 정보 등



프로그램(Program)


cl_program clCreateProgramWithSource(cl_context context, cl_uint count, const char **strings, const size_t *lengths,

                                                        cl_int *errocode_ret)


- 소스코드로부터 프로그램을 생성


- count

- 만들고자 하는 프로그램의 개수


- strings

- 소스 코드들에 대한 스트링


- lengths

- 각 소스 코드의 길이



디바이스별 빌드


- 호스트 API가 자동으로 빌드

- 컨텍스트 내의 모든 디바이스별로 커널 빌드

- 프로그램 오브젝트에 함께 포함됨


- 다른 디바이스에 같은 코드 실행

- 같은 커널 소스 코드를 실행한다는 의미

- 실행 코드는 디바이스별로 다름



cl_int clBuildProgram(cl_program program, cl_uint num_devices, const cl_device_id *device_list, const char *options,

                              void (CL_CALLBACK *pfn_notify) (cl_program program, void *user_data), void *user_data) 


- 생생된 프로그램을 빌드(전처리 + 컴파일 및 링크)


- options

- 빌드 옵션(-DMACRO=1)


- pfn_notify

- 프로그램 빌드가 완료되었을 때 호출 될 callback 함수

- pfn_notify가 NULL인 경우 cl_BuildProgram은 블라킹 방식으로 작동


- 사용 예

- const char options[] = "-cl-std=CL1.1 -cl-mad-enable -Werror";

- clBuildProgram(program, 1, &device, options, NULL, NULL);



 cl_int clGetProgramInfo(cl_program program, cl_program_info param_name, size_t param_value_size,

                                  void *param_value, size_t *param_value_size_ret)


- 프로그램 오브젝트의 정보를 얻어 옴



cl_int clGetProgramBuildInfo(cl_program program, cl_device_id device, cl_program_build_info param_name,

                                         size_t param_value_size, void *param_value, size_t *param_value_size_ret)


- 프로그램 오브젝트의 각 디바이스별 빌드 정보를 얻어 옴




커널(Kernel)


cl_kernel clCreateKernel(cl_program program, const char *kernel_name, cl_int *errcode_ret) 


- 프로그램을 토대로 커널 오브젝트를 생성


- program

- 프로그램 오브젝트


- kernel_name

- 생성하고자 하는 커널의 이름


- 사용 예

- char kernel_name[] = "convolve";

- kernel = clCreateKernel(program, kernel_name, &err);



cl_int clGetKernelInfo(cl_kernel kernel, cl_kernel_info param_name, size_t param_value_size, void *param_value,

                              size_t *param_value_size_ret)


- kernel의 param_name의 정보를 얻어 옴



cl_int clSetKernelArg(cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value)


- kernel의 argument 설정


- kernel

- 커널 오브젝트


- arg_index

- 어떤(몇 번째) 인자인지


- arg_size

- 인자의 크기


- arg_value

- 인자의 값이 들어있는 포인터


- 사용 예

- err = clSetKernelArg(kernel, 0, sizeof(cl_mem), *mem_A);



커맨드 큐(Command Queue)


- 호스트가 디바이스별로 생성

- 하나의 디바이스에 여러 개의 커맨드 큐 연결 가능

- 호스트가 디바이스에서 실행될 커맨드를 enqueue

- 커맨드의 종류

- 커널 실행 커맨드

- 메모리 커맨드

- 데이터 이동, 호스트 메모리에 메모리 오브젝트의 map/unmap

- 동기화 커맨드

- 커맨드 실행 모드

- In-order execution

- 기본 실행 모드


- Out-of-order execution

- 커맨드 큐 생성시 지정 가능



 cl_command_queue clCreateCommandQueue(cl_context context, cl_device_id device, cl_command_queue_properties

                                                                  properties, cl_int *errcode_ret)


- 커맨드 큐의 생성


- properties

- 사용하고자 하는 커맨드 큐의 성질 결정

- CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE

- CL_QUEUE_PROFILING_ENABLE

- bitfield(각 비트 값으로 설정)


- 사용 예

- clCreateCommandQueue(context, device, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &err)



 cl_int clGetCommandQueueInfo(cl_command_queue command_queue, cl_command_queue_info param_name,

                                              size_t param_value_size void *param_value, size_t *param_value_size_ret)


- command_queue의 param_name 정보를 얻어 옴



반응형

'멀티코어 프로그래밍 > OpenCL' 카테고리의 다른 글

OpenCL 프로그래밍(3)  (2) 2015.08.06
OpenCL 프로그래밍(2)  (0) 2015.07.25
OpenCL 프로그래밍(1)  (0) 2015.07.25
OpenCL 플랫폼, 디바이스, 컨텍스트  (0) 2015.07.25
OpenCL 호스트 프로그램  (0) 2015.07.25

댓글