【转载】opencl中设备内存
地址空间限定符
一般的内核代码中,里面的内核参数或声明变量时,都会有地址空间限定符
地址空间限定符,地址空间限定符的主要作用是指出数据应该保存在哪个地方
地址空间限定符有4个:
全局内存:
限定符:__global.保存一个设备中的数据,可读也可写,这意味着一个设备中的各个工作组、各个工作项是可以共享的,
主机和设备都可以读写访问,当主机应用程序将缓存对象传输给设备,缓存数据是存放在全局/常数空间中,当主机从设备中
读取缓存对象,数据将来自设备的全局内存。全局/常数内存往往是一个opencl兼容设备上最大的内存区域,但是访问速度最慢。从这里可以看出
全局区域主要用于主机和设备之间进行数据传输。
常数内存:
限定符:__constant.和全局内存相似,但是只可以读。其在使用前必须要初始化
局部内存:
限定符:__local.保存工作组中工作项的数据,这意味着,局部内存在同一个工作组内存是可以共享的.
这种类型的数据只会针对处理内核的各个工作组分配一次,然后在工作组处理结束之后释放内存
私有内存:
限定符:__private。只在一个工作项中有效,需要注意的是,如果内核参数或者内核程序中的变量声明没有加限定符,
那么他将被保存在私有内存中。如果指针变量没有加限定符,他就会被设置指向私有内存。但image2d_t和image3d_t型指针会一直指向全局内存
限定符所限定的对象:
__global:可以限定所有的内核参数,并不仅仅是指针参数。除了参数之外,还可以限定内核之中所声明的指针变量。
__local:可以用于限定内核参数以及内核中声明的变量,但需要特别注意的是,不管是主机还是设备,都不能够对其进行直接初始化
如,下面会报错:
__local float x = 4.0;
这样会报错,解决办法是:
__local float x;
x = 4.0;
__private:可以限定可以用于限定内核参数以及所有非内涵函数的参数和变量。
主机配置局部内存
主机与设别之间的数据通信是通过全局内存实现的,这意味着主机不能读写局部、私有内存。但是主机可以配置局部、私有内存。
比如,主机可以告诉设备如何为内核参数分配局部内存。
为了编程配置整个过程,需要将clSetKernelArg函数的最后一个参数设为NULL。如下面由主机执行的代码,用来配置局部参数,
分配足够保存16个浮点数的内存空间:
slSetKernelArg(kernel,0,16*sizeof(float),NULL);
对应的内核函数:
__kernel void proc_data(__local float* nums,...)
{
}
和全局内存相似,局部内存的访问速度更快,因此,最好是先将数据从全局内存读取到局部内存中,然后在局部内存中进行处理。在工作项处理
完局部数据之后,再将结果写到全局内存中,再传输回主机。
主机配置私有内存
私有内存的访问速度最快,但是内存空间最小。
和局部内存不一样,内核参数的私有数据可以由主机来进行初始化。为了配置私有内存数据,主机需要将clSetKernelArg函数
最后一个参数设定为基本数据类型,如int*、float*,char*等,但内核函数中对应的私有内核参数必须是基本数据类型,对应为int、float、char等。
下面的例子是:内核需要每个工作项都能够访问int变量num_iteration所在的地址空间,并且希望其初始化值为4,对应的主机程序:
int num_iteration = 4;
clSetKernelArg(kernel,0,sizeof(num_iteration),&num_iteration);
对应的内核函数:
__kernel void proc_data(int num_iteration,...)
{
}
该内核函数参数没有限定符,因此默认是私有内存,那么每一个工作项都会有一个自己的副本
该参数和以前的参数不一样,num_iteration不是一个指针。私有内核参数并不是引用,它们必须是像int和float那样的基本数据类型
全局/常数数据只能通过引用传递的方式给内核,而私有数据是值传递的方式
私有内核参数必须是基本数据类型,但是不一定需要是标量,也可以是向量。例如,你想将四个float型数据发送给内核,然后
再将float型数放到设备的私有地址空间中,以便快速访问,在主机应用程序中。可以加入下面的代码来实现这个目的:
float nums[4] = {0.0f,1.0f,2.0f,3.0f};
clSetKernelArg(kernel,0,sizeof(nums),nums);
内核不能以4元素数组的形式访问私有数据,因为私有参数不能是指针,但是数据可以以float4型向量的形式来访问:
__kernel void proc_data(float4 vaues,...)
{
...
}
简单总结:
如果在调用clSetKernelArg函数时,指针指向内存对象(cl_mem),那么对应的内核参数必须是声明为__global或__constant类型的指针。
如果调用clSetKernelArg函数时,指针被声明NULL,对应的内核参数必须被声明为__local类型的指针,且主机程序能够做的只是告诉设备如何为内核参数分配局部内存
如果调用clSetKernelArg函数时,指针指向的是基本数据类型,内核参数就不会是指针,也不需要有任何地址限定符。
【转载】opencl中设备内存的更多相关文章
- (转载)JVM中的内存模型与垃圾回收
转载自微信公众号:Java高级架构(Java-jiagou)-----看完这篇文章,我奶奶都知道JVM中的内存模型与垃圾回收了! 六.内存模型 6.1 内存模型与运行时数据区 Java虚拟机在执行J ...
- [图解tensorflow源码] [转载] tensorflow设备内存分配算法解析 (BFC算法)
转载自 http://weibo.com/p/1001603980563068394770 @ICT_吴林阳 tensorflow设备内存管理模块实现了一个best-fit with coales ...
- windows进程中的内存结构[转载]
在阅读本文之前,如果你连堆栈是什么多不知道的话,请先阅读文章后面的基础知识. 接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据.那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变 ...
- [转载]Java应用程序中的内存泄漏及内存管理
近期发现测试的项目中有JAVA内存泄露的现象.虽然JAVA有垃圾回收的机制,但是如果不及时释放引用就会发生内存泄露现象.在实际工作中我们使用Jprofiler调用java自带的 jmap来做检测还是很 ...
- Unity 3D中的内存管理
本文欢迎转载,但烦请保留此行出处信息:http://www.onevcat.com/2012/11/memory-in-unity3d/ Unity3D在内存占用上一直被人诟病,特别是对于面向移动设备 ...
- 【转】cocos2d-x与ios内存管理分析(在游戏中减少内存压力)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=281 注:自己以前也写过coco ...
- 关于Hash集合以及Java中的内存泄漏
<学习笔记>关于Hash集合以及Java中的内存泄漏 标签: 学习笔记内存泄露hash 2015-10-11 21:26 58人阅读 评论(0) 收藏 举报 分类: 学习笔记(5) 版 ...
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
- 查看linux中swap内存的相关参数
内容主要来源于:linux的内存回收和交换 各项命令查看的linux环境是:Linux SUSE-33 2.6.32.12-0.7-defaul zone? 内存管理的相关逻辑都是以zone为单位的, ...
随机推荐
- python接口自动化(post请求)
python接口自动化(post请求) 一.post请求的作用:新增资源 二.data格式的参数请求(data是字典对象) #1.导包 import requests #2.调用post方法 #请求的 ...
- python_django_template模块
官方文档 博文导航: 定义模板: 变量 标签: if for include url csrf_token 过滤器: 简单过滤器 HTML转义 加减乘除的过滤器 注释: 模板继承 模板语言:Dja ...
- HttpUrlConnection类基本使用
这个类用来模拟浏览器向服务器发送请求和接收响应 注意: HttpUrlConnection对象简称huc对象 1)获取huc对象向url构造中传递url字符串,并调用openconnection方法即 ...
- 3年A班,从现在起大家都是人质-观后感
花了2天时间观看了由小室直子.铃木勇马.水野格导演,武藤将吾编剧的3年A班日剧. 这部剧我觉得很擅长用对比的手法,将一个受欢迎的老师人前人后强烈对比,一群外表成熟,内心却始终还是孩子气的学生对比,也将 ...
- 单独编译和使用webrtc音频回声消除模块(附完整源码+测试音频文件)
单独编译和使用webrtc音频降噪模块(附完整源码+测试音频文件) 单独编译和使用webrtc音频增益模块(附完整源码+测试音频文件) 说实话很不想写这篇文章,因为这和我一贯推崇的最好全部编译并使用w ...
- 56 Marvin: 一个支持GPU加速、且不依赖其他库(除cuda和cudnn)的轻量化多维深度学习(deep learning)框架介绍
0 引言 Marvin是普林斯顿视觉实验室(PrincetonVision)于2015年提出的轻量化GPU加速的多维深度学习网络框架.该框架采用纯c/c++编写,除了cuda和cudnn以外,不依赖其 ...
- gulp 安装与使用
一.Gulp 是基于node.js 流(stream)的一个前端自动化构建工具,可以使用它构建自动化工作流程,简化我们工作量,让我们把重点放在功能的开发上,从而提高我们的开发效率和工作质量 我们可以用 ...
- (转)当android调试遇到ADB server didn't ACK以及顽固的sjk_daemon进程 .
转:http://blog.csdn.net/wangdong20/article/details/20839533 做Android调试的时候经常会遇到,程序写好了,准备接上手机调试,可不一会儿出现 ...
- 构建高性能高并发Java系统 .
转:http://blog.csdn.net/nengyu/article/details/7591854 场景这里指的高性能高并发服务器是一个有状态的服务,可以理解成web或者socket服务器,每 ...
- pycharm 使用心得(一)安装和首次使用
PyCharm 是我用过的python编辑器中,比较顺手的一个.而且可以跨平台,在macos和windows下面都可以用,这点比较好. 首先预览一下 PyCharm 在实际应用中的界面:(更改了PyC ...