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 |
댓글