나는 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, ¶m);
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)와 유사한 것은 언급하지 않았습니다.
감사합니다.
화려한 반응, 잘 부탁드립니다. 그러나 이전에 소스 파일을 살펴 봤는데 Wrapper 또는 메모리/컨텍스트 등의 수퍼 클래스에서 릴리스 호출 또는 소멸자 함수가 표시되지 않습니다. 파일/줄 #을 제공 할 수 있습니까? ? W.r.장치의 것, 나는 오직 C 문법에서 디바이스 분열에 대해 전혀 몰랐다는 것을 보았을뿐입니다. –
@SteveNovakov'Wrapper'(라인 1103)의 소멸자에서'Wrapper :: release'을 호출하고, (1133 번째 라인)은'ReferenceHandler :: release'를 호출하고 1000-1087 라인에서 'ReferenceHandler '과 모든 다른 OpenCL 객체 유형에 대한 다양한 전문화. (나는 행 번호가 일치하기를 바란다. * Khronos *의 공식 헤더가있다. 물론이 파일은 C++ 래퍼를위한 유일한 파일 인 cl.hpp이고 다른 모든 파일은 C 인터페이스를위한 것이다.) –
그래, 내가 처음 읽었을 때 내가 어떻게 유약을했는지 모르겠다. 고맙습니다. –