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

OpenCL 컨텍스트

by 기리의 개발로그 2022. 4. 22.

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
    • 사용 예
      • 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도 해제됨
반응형

'멀티코어 프로그래밍 > 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

댓글