东莞市盛裕绒艺玩具有限公司

东莞市盛裕绒艺玩具有限公司

澳门百乐门娱乐成

18572852306
联系方式
全国服务热线: 18572852306

咨询热线:13534118111
联系人:谭忠伦
地址:安徽省合肥市金寨路92号

OpenCL的buffer以及sub-buffer

来源:澳门百乐门娱乐成   发布时间:2019-11-16   点击量:180

buffer,sub-buffer和image对比

相同点:都是OCL memory对象

维度特性关键词
buffer一维array of bytes
sub-buffer一维views into buffer
image二维或者三维读写操作、可选的format、sampler及clamp

关于buffer的释放问题

在OpenCL中,对于cl_mem对象都是采用reference-counted的模式来控制对相应资源的释放的。OpenCL中增加某个cl_mem的方法为cl_int clRetainMemObject ( cl_mem memobj),而clCreateBuffer, clCreateSubBuffer, clCreateImage2D, and clCreateImage3D都会执行一个 implicit retain。clCreateSubBuffer also performs an implicit retain on the memory object used to create the sub-buffer or image object. 所以,如果一个cl_men对象创建了多个sub-buffer,那么应该对每个sub-buffer都进行clRelaseMemObject. 降低引用计数的方法为cl_int clReleaseMemObject ( cl_mem memobj). 当一个cl_mem的引用计数变为0,且相关的命令也已经执行完毕,那么OCL就会释放相关资源。另外,clSetKernelArg并不会retain相关的cl_mem。

查询cl_mem对象的相关信息

可以使用clGetMemObjectInfo查询到cl_mem对象的各种相关信息。如下的代码查询cl_mem对象是何种类型:

cl_int errNum;cl_mem memory;cl_mem_object_type type;// initialize memory object and so onerrNum = clGetMemObjectInfo( memory, CL_MEM_TYPE, sizeof(cl_mem_object_type), &type, NULL);switch(type){ case CL_MEM_OBJECT_BUFFER: { // handle case when object is buffer or sub-buffer break; } case CL_MEM_OBJECT_IMAGE2D: case CL_MEM_OBJECT_IMAGE3D: { // handle case when object is a 2D or 3D image break; } default // something very bad has happened break;}

buffer的读写

OpenCL中,host可以使用command来执行对buffer的读写。值得一提的是,在创建buffer的时候,比如使用clCreateBuffer,使用合适的参数,比如CLK_MEM_COPY_HOST,也可以实现对buffer资源的写入操作。但是,这种做法起码有三个明显的局限性:

    只能在创建buffer的时候执行写入,而无法对已经存在的cl_mem对象执行写入只能写,而不能读只能写全部的数据,而不能只写部分片段的数据

而OCL提供的相关command则可以十分自由的进行各种操作。

clEnqueueWriteBuffer:把host的内容写入的buffer regionclEnqueueReadBuffer:把buffer的内容复制到host内存中clEnqueueReadBufferRect:把一个二维或者三维的buffer的部分区域数据复制到host内存clEnqueueWriteBufferRect:把host上的数据写入到二维或者三维buffer的局部区域clEnqueueCopyBuffer:从一个buffer拷贝数据到另一个buffer,适用于一维的clEnqueueCopyBufferRect:从一个buffer拷贝片段数据到另一个buffer片段,适用于二维或者三维的

map buffer and sub-buffer

mapping一个buffer或者sub-buffer可以得到一个host指针,这个指针可以直接在host上使用,比如作为参数传给其他函数,但这些函数不会感知到这些内存实际是由OCL管理并利用的。map使用clEnqueueMapBuffer,使用完之后需要unmap,使用clEnqueueUnmapMemObject.

参考:OpenCL Programming Guide

相关产品

COPYRIGHTS©2017 澳门百乐门娱乐成 ALL RIGHTS RESERVED 备案号:180