2013-06-22 4 views
4

나는 C++ API를 사용하여 장치를 릴리스 할 필요가없는 어딘가에서 (비록 내 인생에서 소스를 찾을 수 없다) 커널/메모리와 같은 C/C와 같은 메모리 : cl :: Kernel, cl :: Buffer, cl :: Device에 대한 소멸자로 클래스 개체가 범위를 벗어날 때 (프로그램 종료 등). 그러나 cl.hpp (최신 버전, 1.1 rev 04)를 자세히 살펴보면 소멸자가 전혀 정의되어 있지 않습니다. 예를 들면 다음과 같습니다. cl : Device -Opencl 메모리, 커널, 장치 등의 공개

/*! \class Device 
* \brief Device interface for cl_device_id. 
*/ 
class Device : public detail::Wrapper<cl_device_id> 
{ 
public: 
    Device(cl_device_id device) { object_ = device; } 

    Device() : detail::Wrapper<cl_type>() { } 

    Device(const Device& device) : detail::Wrapper<cl_type>(device) { } 

    Device& operator = (const Device& rhs) 
    { 
     if (this != &rhs) { 
      detail::Wrapper<cl_type>::operator=(rhs); 
     } 
     return *this; 
    } 

    template <typename T> 
    cl_int getInfo(cl_device_info name, T* param) const 
    { 
     return detail::errHandler(
      detail::getInfo(&::clGetDeviceInfo, object_, name, param), 
      __GET_DEVICE_INFO_ERR); 
    } 

    template <cl_int name> typename 
    detail::param_traits<detail::cl_device_info, name>::param_type 
    getInfo(cl_int* err = NULL) const 
    { 
     typename detail::param_traits< 
      detail::cl_device_info, name>::param_type param; 
     cl_int result = getInfo(name, &param); 
     if (err != NULL) { 
      *err = result; 
     } 
     return param; 
    } 

#if defined(USE_CL_DEVICE_FISSION) 
    cl_int createSubDevices(
     const cl_device_partition_property_ext * properties, 
     VECTOR_CLASS<Device>* devices) 
    { 
     typedef CL_API_ENTRY cl_int 
      (CL_API_CALL * PFN_clCreateSubDevicesEXT)(
       cl_device_id /*in_device*/, 
       const cl_device_partition_property_ext * /* properties */, 
       cl_uint /*num_entries*/, 
       cl_device_id * /*out_devices*/, 
       cl_uint * /*num_devices*/) CL_EXT_SUFFIX__VERSION_1_1; 

     static PFN_clCreateSubDevicesEXT pfn_clCreateSubDevicesEXT = NULL; 
     __INIT_CL_EXT_FCN_PTR(clCreateSubDevicesEXT); 

     cl_uint n = 0; 
     cl_int err = pfn_clCreateSubDevicesEXT(object_, properties, 0, NULL, &n); 
     if (err != CL_SUCCESS) { 
      return detail::errHandler(err, __CREATE_SUB_DEVICES); 
     } 

     cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id)); 
     err = pfn_clCreateSubDevicesEXT(object_, properties, n, ids, NULL); 
     if (err != CL_SUCCESS) { 
      return detail::errHandler(err, __CREATE_SUB_DEVICES); 
     } 

     devices->assign(&ids[0], &ids[n]); 
     return CL_SUCCESS; 
    } 
#endif 
}; 

누구에게이 사실에 대해 알고 있나요? 이걸 내가 신경 써야 할까? C++ 래퍼 문서에서 releaseClMemObject 또는 free (cl_devices)와 유사한 것은 언급하지 않았습니다.

감사합니다.

답변

8

더 자세히 살펴보면 모든 클래스가 템플릿 detail::Wrapper<T>에서 상속 받고 각 클래스에 대해 특수화 된 것을 볼 수 있습니다 모든 유형은 소멸자에서 해당하는 clRelease... 함수를 호출해야합니다. 알다시피 클래스의 소멸자는 항상 기본 클래스 소멸자를 호출하므로 cl::Buffer, cl::Kernel 및 친구들에 사용자 정의 소멸자가 필요하지 않습니다. (음, Wrapper<T> 전문은 아니지만 retainrelease 기능을 제공합니다 ReferenceHandler<T>라는 이름의 다른 전문화 된 특성 클래스를 사용하여 정확합니다.) 그래서

모든 OpenCL을 객체 참조 횟수 의미의 일종 및 모든 C++ 래퍼를 사용하기 때문에 생성자와 소멸자에서 해당 clRetain/clRelease 호출을 래핑하면 실제로 C++로 작업 할 때 OpenCL 리소스를 적절하게 공개 할 필요가 없습니다. 장치는 보통의 OpenCL 1.2의 장치로.) 유지 또는 해제 (그리고 detail::Wrapper<cl_device_id>의 죄수/소멸자 아마 아무것도하지 않습니다되지 않기 때문에

(그러나 같은 이미 DarkZeros 말했다는 장치는, 아마 나쁜 예입니다 핵무기가있을 수 있지만 C++ 래퍼는 1.2를 지원하지 않습니다.)

+0

화려한 반응, 잘 부탁드립니다. 그러나 이전에 소스 파일을 살펴 봤는데 Wrapper 또는 메모리/컨텍스트 등의 수퍼 클래스에서 릴리스 호출 또는 소멸자 함수가 표시되지 않습니다. 파일/줄 #을 제공 할 수 있습니까? ? W.r.장치의 것, 나는 오직 C 문법에서 디바이스 분열에 대해 전혀 몰랐다는 것을 보았을뿐입니다. –

+1

@SteveNovakov'Wrapper '(라인 1103)의 소멸자에서'Wrapper :: release'을 호출하고, (1133 번째 라인)은'ReferenceHandler :: release'를 호출하고 1000-1087 라인에서 'ReferenceHandler '과 모든 다른 OpenCL 객체 유형에 대한 다양한 전문화. (나는 행 번호가 일치하기를 바란다. * Khronos *의 공식 헤더가있다. 물론이 파일은 C++ 래퍼를위한 유일한 파일 인 cl.hpp이고 다른 모든 파일은 C 인터페이스를위한 것이다.) –

+0

그래, 내가 처음 읽었을 때 내가 어떻게 유약을했는지 모르겠다. 고맙습니다. –

1

OpenCL에서 릴리스가 필요한 유일한 것은 추상 구성입니다. 마찬가지로 :

  • 메모리 객체
  • 컨텍스트
  • 명령 대기열
  • 프로그램
  • 커널
  • 이벤트

장치가 "파괴 될 수 없기 때문에 당신은 장치를 해제 할 수 있습니다 "또는 할당되지 않은. getDevice를 호출하면 새로 생성 된 장치가 아니라 장치에 ID가 전송됩니다.

참고 : OCL 1.2에서 장치는 상위 장치 (하위 장치)의 파티션으로 구성 될 수 있습니다. 따라서 삭제가 필요합니다. 어쩌면 CL API가 새로운 버전의이 특별한 경우를 돌봐야 할 것입니다.도 몰라요