C+的Opencl+;,buffer.release()是受保护的成员 我学习如何使用AMD的APP SDK和Khronos的头文件来为OpenCL 1.2制作C++中的简单OpenCL程序。我使用了下面的例子,它是有效的。但当我最后尝试.release()缓冲区时,我从编译器收到一条错误消息,说“无法访问受保护的成员” int problemSize=1024; 常量字符*kernelderleneck= 内核无效Toplam(uuu全局浮点*v1,uu全局浮点*v2) "{" “int i=获取全局id(0);” “v2[i]=v1[i];” "}"; cl::上下文altYapi(cl\U设备类型\U GPU); cl::Program::Sources kaynaklar; kaynaklar.push_-back(标准::制作_对(kernelderenecek,strlen(kernelderenecek)); cl::项目计划(altYapi,kaynaklar); std::vector aygitlar=altYapi.getInfo(); 程序构建(aygitlar); cl::内核(程序,“Toplam”); cl::CommandQueue cmdQ(altYapi,aygitlar[0]); 向量输入; std::generate_n(std::back_inserter(输入),problemSize,rand); cl::Buffer inputBuffer(altYapi,cl_MEM_READ_ONLY | cl_MEM_COPY_HOST_PTR,sizeof(cl_float)*input.size(),&input[0]); cl::Buffer outputBuffer(altYapi,cl_MEM_WRITE_ONLY,sizeof(cl_float)*input.size()); setArg(0,inputBuffer); setArg(1,outputBuffer); cl::nRange Global(1024); cl::NDRange Local(64); EnqueuenRangeKernel(内核,cl::NullRange,全局,局部); 浮点*输出=(浮点*)malloc(1024*sizeof(浮点)); cmdQ.enqueueReadBuffer(outputBuffer,CL_TRUE,01024*sizeof(CL_float),输出); 对于(inti=0;i

C+的Opencl+;,buffer.release()是受保护的成员 我学习如何使用AMD的APP SDK和Khronos的头文件来为OpenCL 1.2制作C++中的简单OpenCL程序。我使用了下面的例子,它是有效的。但当我最后尝试.release()缓冲区时,我从编译器收到一条错误消息,说“无法访问受保护的成员” int problemSize=1024; 常量字符*kernelderleneck= 内核无效Toplam(uuu全局浮点*v1,uu全局浮点*v2) "{" “int i=获取全局id(0);” “v2[i]=v1[i];” "}"; cl::上下文altYapi(cl\U设备类型\U GPU); cl::Program::Sources kaynaklar; kaynaklar.push_-back(标准::制作_对(kernelderenecek,strlen(kernelderenecek)); cl::项目计划(altYapi,kaynaklar); std::vector aygitlar=altYapi.getInfo(); 程序构建(aygitlar); cl::内核(程序,“Toplam”); cl::CommandQueue cmdQ(altYapi,aygitlar[0]); 向量输入; std::generate_n(std::back_inserter(输入),problemSize,rand); cl::Buffer inputBuffer(altYapi,cl_MEM_READ_ONLY | cl_MEM_COPY_HOST_PTR,sizeof(cl_float)*input.size(),&input[0]); cl::Buffer outputBuffer(altYapi,cl_MEM_WRITE_ONLY,sizeof(cl_float)*input.size()); setArg(0,inputBuffer); setArg(1,outputBuffer); cl::nRange Global(1024); cl::NDRange Local(64); EnqueuenRangeKernel(内核,cl::NullRange,全局,局部); 浮点*输出=(浮点*)malloc(1024*sizeof(浮点)); cmdQ.enqueueReadBuffer(outputBuffer,CL_TRUE,01024*sizeof(CL_float),输出); 对于(inti=0;i,c++,buffer,opencl,C++,Buffer,Opencl,类缓冲区自己处理分配和销毁是好的 如果要手动分配和销毁它,只需执行以下操作: vector<cl::Buffer> mybuffer; 要摧毁它: mybuffer.clear(); 好的是,如果您忘记删除它,它会自动删除它。您可以将它包装在指针中,最好是智能指针,如下所示: std::unique_ptr<cl::Buffer> myBuffer(new cl::Buffer(...)); 这将删除旧数据并替换为新数据,保留“reset()”如果您只想删除旧数据,

类缓冲区自己处理分配和销毁是好的

如果要手动分配和销毁它,只需执行以下操作:

vector<cl::Buffer> mybuffer;
要摧毁它:

mybuffer.clear();

好的是,如果您忘记删除它,它会自动删除它。

您可以将它包装在指针中,最好是智能指针,如下所示:

std::unique_ptr<cl::Buffer> myBuffer(new cl::Buffer(...));

这将删除旧数据并替换为新数据,保留“reset()”如果您只想删除旧数据,则为空。

当对象超出范围时,会自动调用析构函数。另外,.好的,这个包装器似乎是一个RAII类,对吗?那么只要我在system manager中看到使用的内存没有不断增加,我就不必担心了?只要您不转换裸(C风格)的CulbDebug到C++包装器吊坠,C++包装类很好地清理在自己后面。你不必担心调用释放,无论如何你也不应该用手工调用析构函数。甚至更好的是用vector。酷。或者把它封装在你自己的类中作为派生类。或者更好地用智能指针来包装它。
mybuffer.push_back(cl::Buffer(/*constructor parameters*/));
mybuffer.clear();
std::unique_ptr<cl::Buffer> myBuffer(new cl::Buffer(...));
myBuffer.reset(new cl::Buffer(...));