OpenCL 컨텍스트
컨텍스트(Context)
- OpenCL 컨텍스트
- 커널이 실행되는 황경
- 동기화와 메모리 관리가 정의되는 도메인
- 호스트 프로그램이 API clCreateContext()를 이용하여 생성
- 포함하는 리소스
- 디바이스
- 호스트가 사용할 OpenCL 디바이스 목록
- 커널
- OpenCL 디바이스에서 실행할 OpenCL 함수들
- 프로그램 오브젝트
- 프로그램 소스 및 실행 오브젝트
- 메모리 오브젝트
- 호스트와 OpenCL 디바이스에서 접근 가능한 메모리 오브젝트 집합
- 커널은 계산 과정에서 메모리 오브젝트 사용
- 디바이스
cl_context clCreateContext(const cl_context_properties *properties, cl_uint num_devices, const cl_device_id *device, void (CL_CALLBACK *pfn_notify) (const char *errinfo, const void *private_info, size_t cb, void *user_data), void *user_data, cl_int *errcode_ret)
- properties
- 사용하고자 하는 컨텍스트의 속성 결정
- CL_CONTEXT_PLATFORM
- cl_platform_id 값을 통해 사용하고자 하는 플랫폼 정의
- CL_CONTEXT_INTEROP_USER_SYNC
- boolean 값으로 OpenCL extension 의 다른 API들과의 동기화 관련 설정
- 마지막 값은 항상 0
- CL_CONTEXT_PLATFORM
- 사용 예
- properties[0] = CL_CONTEXT_PLATFORM;
- properties[1] = platform;
- properties[2] = 0;
- 사용하고자 하는 컨텍스트의 속성 결정
- num_devices
- devices
- pfn_notify
- 컨텍스트를 만드는 과정에서 에러가 발생하는 경우 사용자에게 알리기 위해 사용
- errinfo
- 기본적인 error 정보
- private_info
- 추가 정보
- cb
- private_info 의 크기
- user_data
- pfn_notify 에 사용자가 전하고자 하는 파라미터
- errcode_ret
- 에러 정보
cl_context clCreateContextFromType(const cl_context_properties *properties, cl_device_type device_type, void (CL_CALLBACK *pfn_notify) (const char *errinfo, const void *private_info, size_t cb, void *user_data), void *user_data, cl_int *errcode_ret)
- 컨텍스트를 만드는 다른 함수
- 디바이스 타입만을 지정하여 컨텍스트를 생성
- clGetDeviceIDs()로 얻을 수 있는 디바이스만을 이용
- 서브 디바이스는 사용하지 않음
- 사용 예
- cl_context context = clCreateContextFromType(context_props, CL_DEVICE_TYPE_GPU, NULL, NULL, &err);
cl_int clGetContextInfo(cl_context context, cl_context_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret)
컨텍스트와 참조 개수(Reference Count)
- Reference Count
- 컨텍스트가 몇 번 참조되었는지 나타내 줌
- 0이 되면 메모리가 해제됨
- 컨텍스트를 라이브러리나 다른 코드에서 사용하고 싶은 때, reference count 를 0보다 크게 유지해야 함
- 변화 방법
- cl_int clRetainContext(cl_context, context)
- context의 reference count를 1 증가 시킴
- clCreateContext()와 clCreateContextFromType()은 내부적으로 retain을 수행
- cl_int clReleaseContext(cl_context context)
- context의 reference count를 1 감소 시킴
- context의 reference count가 0이고 context에 연관된 오브젝트(ex : 메모리 오브젝트, 커맨드 큐)가 해제되면 context도 해제됨
- cl_int clRetainContext(cl_context, context)
반응형
'멀티코어 프로그래밍 > OpenCL' 카테고리의 다른 글
OpenCL 메모리 오브젝트(2) (14) | 2022.04.26 |
---|---|
OpenCL 메모리 오브젝트 (2) | 2022.04.25 |
OpenCL 디바이스 (9) | 2022.04.21 |
OpenCL 플랫폼 (10) | 2022.04.20 |
커널, 커맨드큐 (9) | 2022.04.19 |
댓글