标签:comm switch 另一个 man bytes 函数 retain 相关信息 ble
相同点:都是OCL memory对象
维度 | 特性关键词 | |
---|---|---|
buffer | 一维 | array of bytes |
sub-buffer | 一维 | views into buffer |
image | 二维或者三维 | 读写操作、可选的format、sampler及clamp |
在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。
可以使用clGetMemObjectInfo
查询到cl_mem
对象的各种相关信息。如下的代码查询cl_mem
对象是何种类型:
cl_int errNum;
cl_mem memory;
cl_mem_object_type type;
// initialize memory object and so on
errNum = 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;
}
OpenCL中,host可以使用command来执行对buffer的读写。值得一提的是,在创建buffer的时候,比如使用clCreateBuffer
,使用合适的参数,比如CLK_MEM_COPY_HOST
,也可以实现对buffer资源的写入操作。但是,这种做法起码有三个明显的局限性:
cl_mem
对象执行写入而OCL提供的相关command则可以十分自由的进行各种操作。
mapping一个buffer或者sub-buffer可以得到一个host指针,这个指针可以直接在host上使用,比如作为参数传给其他函数,但这些函数不会感知到这些内存实际是由OCL管理并利用的。
map使用clEnqueueMapBuffer
,使用完之后需要unmap,使用clEnqueueUnmapMemObject
.
标签:comm switch 另一个 man bytes 函数 retain 相关信息 ble
原文地址:https://www.cnblogs.com/willhua/p/9689716.html