OpenCL的buffer以及sub-buffer
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 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;
}
buffer的读写
OpenCL中,host可以使用command来执行对buffer的读写。值得一提的是,在创建buffer的时候,比如使用clCreateBuffer,使用合适的参数,比如CLK_MEM_COPY_HOST,也可以实现对buffer资源的写入操作。但是,这种做法起码有三个明显的局限性:
- 只能在创建buffer的时候执行写入,而无法对已经存在的
cl_mem对象执行写入 - 只能写,而不能读
- 只能写全部的数据,而不能只写部分片段的数据
而OCL提供的相关command则可以十分自由的进行各种操作。
- clEnqueueWriteBuffer:把host的内容写入的buffer region
- clEnqueueReadBuffer:把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的buffer以及sub-buffer的更多相关文章
- NIO中的heap Buffer和direct Buffer区别
在Java的NIO中,我们一般采用ByteBuffer缓冲区来传输数据,一般情况下我们创建Buffer对象是通过ByteBuffer的两个静态方法: ByteBuffer.allocate(int c ...
- 每天3分钟操作系统修炼秘籍(13):两个缓冲空间Kernel Buffer和IO Buffer
两个缓冲空间:kernel buffer和io buffer 先看一张图,稍后将围绕这张图展开描述.图中的fd table.open file table以及两个inode table都可以不用理解, ...
- 全网最清楚的:MySQL的insert buffer和change buffer 串讲
目录 一.前言 二.问题引入 2.1.聚簇索引 2.2.普通索引 三.change buffer存在的意义 四.再看change buffer 五.change buffer 的限制 六.change ...
- directx12中vetex buffer、index buffer和constant buffer绑定piple line的时机
类别 时机 函数 建Heap vetex buffer 在Draw函数中 ID3D12GraphicsCommandList::IASetVertexBuffer 否 index buffer 在Dr ...
- The Bip Buffer - The Circular Buffer with a Twist
Introduction The Bip-Buffer is like a circular buffer, but slightly different. Instead of keeping on ...
- Buffer Pool--SQL Server:Buffer Manager 对象
--============================================================== --参考链接:http://technet.microsoft.com ...
- FIFO buffer 和普通buffer区别
1.FIFO可以说一块具体的硬件存储设备,也可以说程序在内存中开辟的一段内存区域.而buffer往往就是一段缓冲的数据区域 2.FIFO的数据是先进先出的,而buffer没有这个限制,可以全局访问 3 ...
- Direct Buffer vs. Heap Buffer
1. 劣势:创建和释放Direct Buffer的代价比Heap Buffer得要高. 2. 差别:Direct Buffer不是分配在堆上的,它不被GC直接管理(但Direct Buffer的JAV ...
- insert buffer/change buffer double write buffer,双写 adaptive hash index(AHI) innodb的crash recovery innodb重要参数 innodb监控
https://yq.aliyun.com/articles/41000 http://blog.itpub.net/22664653/viewspace-1163838/ http://www.cn ...
- 一个优秀的 ring buffer 或 cycle buffer 的实现代码
#define CIRCLE_BUFFSIZE 1024 * 1024#define min(x, y) ((x) < (y) ? (x) : (y)) struct cycle_buffer ...
随机推荐
- JavaScript 异步编程的前世今生(下)
ES6 中的 Generator 在 ES6 出现之前,基本都是各式各样类似Promise的解决方案来处理异步操作的代码逻辑,但是 ES6 的Generator却给异步操作又提供了新的思路,马上就有人 ...
- Java实现桶排序和基数排序
桶排序代码: import java.util.Arrays; /** * 桶排序 * 工作的原理是将数组分到有限数量的桶里 * 每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序 ...
- idea之debug
[转载]原文地址:https://www.cnblogs.com/nihaorz/p/7613967.html 在Intellij IDEA中使用Debug Debug用来追踪代码的运行流程,通常在程 ...
- [Java]LeetCode138. 复制带随机指针的链表 | Copy List with Random Pointer
A linked list is given such that each node contains an additional random pointer which could point t ...
- [Swift]LeetCode338. 比特位计数 | Counting Bits
Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the ...
- [Swift]LeetCode732. 我的日程安排表 III | My Calendar III
Implement a MyCalendarThree class to store your events. A new event can always be added. Your class ...
- Underscore.js 源码学习笔记(下)
上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...
- Java连接数据库之SQLServer
工具: eclipse Microsoft SQL Server SQL Server连接驱动:mssql-jdbc-6.4.0.jre8.jar SQL script代码 CREATE DATABA ...
- python中的None
python中的None python中的None就相较于Java中的Null.python中就没有所谓的NULL.网络上很多的时候说的"python的Null"这个说法本身就是不 ...
- Python爬虫入门教程 4-100 美空网未登录图片爬取
美空网未登录图片----简介 上一篇写的时间有点长了,接下来继续把美空网的爬虫写完,这套教程中编写的爬虫在实际的工作中可能并不能给你增加多少有价值的技术点,因为它只是一套入门的教程,老鸟你自动绕过就可 ...