我正在学习如何使用Amd的app sdk和Khronos的Opencl 1.2头文件在C++中创建简单的opencl程序.我使用下面的例子,它正在工作.但是当我最后尝试.release()
缓冲区时,我从编译器收到一条错误消息,说"无法访问受保护的成员".
int problemSize=1024;
const char * kernelDerlenecek =
"__kernel void Toplam(__global float * v1, __global float * v2)"
"{"
" int i = get_global_id(0);"
" v2[i]=v1[i];"
"}";
cl::Context altYapi(CL_DEVICE_TYPE_GPU);
cl::Program::Sources kaynaklar;
kaynaklar.push_back(std::make_pair(kernelDerlenecek,strlen(kernelDerlenecek)));
cl::Program program(altYapi,kaynaklar);
std::vector<cl::Device> aygitlar=altYapi.getInfo<CL_CONTEXT_DEVICES>();
program.build(aygitlar);
cl::Kernel kernel(program,"Toplam");
cl::CommandQueue cmdQ(altYapi,aygitlar[0]);
std::vector<cl_float> input;
std::generate_n (std::back_inserter ( input ) , 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()) ;
kernel.setArg(0,inputBuffer);
kernel.setArg(1,outputBuffer);
cl::NDRange Global(1024);
cl::NDRange Local(64);
cmdQ.enqueueNDRangeKernel(kernel,cl::NullRange,Global,Local);
float * output = (float *)malloc(1024*sizeof(float));
cmdQ.enqueueReadBuffer(outputBuffer,CL_TRUE,0,1024 * sizeof(cl_float),output);
for(int i=0;i<1024;i++)
{
printf(" %f \n ",output[i]);
}
free(output);
//inputBuffer.release(); <----- this is not accessible!!!
//inputBuffer.~Wrapper() <----- invalid destructor name!!!
Run Code Online (Sandbox Code Playgroud)
所以我搜索了包装类缓冲区的结构,发现:
class Wrapper
{
public:
typedef T cl_type;
protected:
cl_type object_;
public:
Wrapper() : object_(NULL) { }
~Wrapper()
{
if (object_ != NULL) { release(); } //This is releasing, should I destroy myself?
}
Wrapper(const Wrapper<cl_type>& rhs)
{
object_ = rhs.object_;
if (object_ != NULL) { retain(); }
}
Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs)
{
if (object_ != NULL) { release(); }
object_ = rhs.object_;
if (object_ != NULL) { retain(); }
return *this;
}
cl_type operator ()() const { return object_; }
cl_type& operator ()() { return object_; }
protected:
cl_int retain() const
{
return ReferenceHandler<cl_type>::retain(object_);
}
cl_int release() const //<---yes, its true that I cannot access. Who can?
{
return ReferenceHandler<cl_type>::release(object_);
}
};
Run Code Online (Sandbox Code Playgroud)
问题:如何释放专用于缓冲区的内存?甚至~Wrapper()也没有~Memory()不起作用,因为错误说"无效的析构函数名称".也许它在功能退出时会自行毁灭?这是一个DLL和一个C#包装器,它被重复调用所以我需要它只在需要时才被释放.谢谢.
类Buffer缓冲分配和销毁是很好的.
如果您想手动分配和销毁它,请执行以下操作:
vector<cl::Buffer> mybuffer;
Run Code Online (Sandbox Code Playgroud)
然后只需创建一个内存区域:
mybuffer.push_back(cl::Buffer(/*constructor parameters*/));
Run Code Online (Sandbox Code Playgroud)
摧毁它:
mybuffer.clear();
Run Code Online (Sandbox Code Playgroud)
好消息是,如果您忘记删除它,它将自动删除它.
归档时间: |
|
查看次数: |
3191 次 |
最近记录: |