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资源的写入操作。但是,这种做法起码有三个明显的局限性:

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

而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 Programming Guide

OpenCL的buffer以及sub-buffer的更多相关文章

  1. NIO中的heap Buffer和direct Buffer区别

    在Java的NIO中,我们一般采用ByteBuffer缓冲区来传输数据,一般情况下我们创建Buffer对象是通过ByteBuffer的两个静态方法: ByteBuffer.allocate(int c ...

  2. 每天3分钟操作系统修炼秘籍(13):两个缓冲空间Kernel Buffer和IO Buffer

    两个缓冲空间:kernel buffer和io buffer 先看一张图,稍后将围绕这张图展开描述.图中的fd table.open file table以及两个inode table都可以不用理解, ...

  3. 全网最清楚的:MySQL的insert buffer和change buffer 串讲

    目录 一.前言 二.问题引入 2.1.聚簇索引 2.2.普通索引 三.change buffer存在的意义 四.再看change buffer 五.change buffer 的限制 六.change ...

  4. directx12中vetex buffer、index buffer和constant buffer绑定piple line的时机

    类别 时机 函数 建Heap vetex buffer 在Draw函数中 ID3D12GraphicsCommandList::IASetVertexBuffer 否 index buffer 在Dr ...

  5. 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 ...

  6. Buffer Pool--SQL Server:Buffer Manager 对象

    --============================================================== --参考链接:http://technet.microsoft.com ...

  7. FIFO buffer 和普通buffer区别

    1.FIFO可以说一块具体的硬件存储设备,也可以说程序在内存中开辟的一段内存区域.而buffer往往就是一段缓冲的数据区域 2.FIFO的数据是先进先出的,而buffer没有这个限制,可以全局访问 3 ...

  8. Direct Buffer vs. Heap Buffer

    1. 劣势:创建和释放Direct Buffer的代价比Heap Buffer得要高. 2. 差别:Direct Buffer不是分配在堆上的,它不被GC直接管理(但Direct Buffer的JAV ...

  9. 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 ...

  10. 一个优秀的 ring buffer 或 cycle buffer 的实现代码

    #define CIRCLE_BUFFSIZE 1024 * 1024#define min(x, y) ((x) < (y) ? (x) : (y)) struct cycle_buffer ...

随机推荐

  1. You need to use a Theme.AppCompat theme (or descendant) with this activity 问题解决

    You need to use a Theme.AppCompat theme (or descendant) with this activity 问题解决 问题代码 void initCommit ...

  2. java字符串应用之字符串编码转换

    [转载]原文地址:https://blog.csdn.net/zhouyong80/article/details/1900100 无论是对程序的本地化还是国际化,都会涉及到字符编码的转换的问题.尤其 ...

  3. [Swift]LeetCode437. 路径总和 III | Path Sum III

    You are given a binary tree in which each node contains an integer value. Find the number of paths t ...

  4. [Swift]LeetCode633. 平方数之和 | Sum of Square Numbers

    Given a non-negative integer c, your task is to decide whether there're two integers a and b such th ...

  5. [Swift]LeetCode733. 图像渲染 | Flood Fill

    An image is represented by a 2-D array of integers, each integer representing the pixel value of the ...

  6. MySQL下载、安装和登录详解

    MySQL是一个小型的数据库管理系统,由于其体积小,速度快,尤其是开放源代码等优点,使得其在开发中得到广泛的使用,本文主要介绍MySQL数据库从下载到安装及通过命令行的使用等. 一.下载部分 下载链接 ...

  7. Synchronized的那些事

    在上一篇博客中,我"蜻蜓点水"般的介绍了下Java内存模型,在这一篇博客,我将带着大家看下Synchronized关键字的那些事,其实把Synchronized关键字放到上一篇博客 ...

  8. selenium下拉到页面最底端

    selenium操控浏览器下拉到页面最底端: #!/usr/bin/env python # -*- coding: utf-8 -*- from selenium import webdriver ...

  9. 面向切面编程 ( Aspect Oriented Programming with Spring )

    Aspect Oriented Programming with Spring 1. 简介 AOP是与OOP不同的一种程序结构.在OOP编程中,模块的单位是class(类):然而,在AOP编程中模块的 ...

  10. Unity 本地坐标到世界坐标,世界坐标到本地坐标

    世界=>本地 public GameObject mTarget; public GameObject mPar; //这个注意一定要是mTarget的第一父物体. // Use this fo ...