地址空间限定符

一般的内核代码中,里面的内核参数或声明变量时,都会有地址空间限定符
地址空间限定符,地址空间限定符的主要作用是指出数据应该保存在哪个地方
地址空间限定符有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函数时,指针指向的是基本数据类型,内核参数就不会是指针,也不需要有任何地址限定符。

转载于:https://www.cnblogs.com/mod109/p/6385491.html

【转载】opencl中设备内存相关推荐

  1. [OpenCL] 内核编程:数据类型和设备内存(13)

    本章涵盖 介绍一个简单的 OpenCL 内核 使用 OpenCL 的标量和矢量数据类型 了解 OpenCL 设备模型   在本章中,我们将抛开创建和部署内核的脚手架,开始编写内核本身. 我们将检查 O ...

  2. [转载] java对象在内存中的结构

    参考链接: 了解Java中的类和对象 今天看到一个不错的PPT:Build Memory-efficient Java Applications,开篇便提出了一个问题,在Hotspot JVM中,32 ...

  3. (转载)Java中关于内存泄漏出现的原因以及如何避免内存泄漏

    原文链接 Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题.内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实 ...

  4. Linux中Cache内存占用过高解决办法

    在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: 这里的默认显示单位是kb,我的服务器是128G内存,所以数字显 ...

  5. 从Zabbix数据库中提取内存采集的数据,做内存使用率计算

    背景需求很简单,分析所有的设备的内存使用率,看那些设备的内存不够用是否需要加内存... 下面的脚本逻辑,就是通过提取zabbix数据库中的hostid,在提取itemid.. 然后通过item nam ...

  6. 深度学习中的内存管理问题研究综述

    点击上方蓝字关注我们 深度学习中的内存管理问题研究综述 马玮良1,2, 彭轩1,2, 熊倩1,2, 石宣化1,2, 金海1,2 1 华中科技大学计算机科学与技术学院,湖北 武汉 430074 2 华中 ...

  7. Unity 3D中的内存管理与优化游戏运行性能的经验

    Unity3D在内存占用上一直被人诟病,特别是对于面向移动设备的游戏开发,动辄内存占用飙上一两百兆,导致内存资源耗尽,从而被系统强退造成极差的体验.类似这种情况并不少见,但是绝大部分都是可以避免的.虽 ...

  8. Linux中动态内存的分配与回收(heap, buddy system, stab)

    1.malloc 和free的原理(http://m.blog.csdn.net/article/details?id=39496057) 从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调 ...

  9. 【Unity】Unity 3D中的内存管理

    本文欢迎转载,但烦请保留此行出处信息:http://www.onevcat.com/2012/11/memory-in-unity3d/ Unity3D在内存占用上一直被人诟病,特别是对于面向移动设备 ...

最新文章

  1. 怎么装python的keras库_matlab调用keras深度学习模型(环境搭建)
  2. Kubernetes初探:原理及实践应用
  3. Android5.1.1源码 - 让某个APP以解释执行模式运行
  4. c#扩展方法奇思妙用变态篇四:string 的翻身革命
  5. android拦截短信获取短信内容,《英雄联盟手游》先锋测试招募说明:仅安卓用户...
  6. 面试字节跳动Android工程师该怎么准备?深度解析,值得收藏
  7. 工作这几年,同事对我的称呼肉眼可见的在变化着......
  8. nuxt asyncData extendRoutes nuxtServerInit
  9. 抗锯齿 文字_PS之使用文字工具
  10. 计算机无论采用何种方式接入网络,自考计算机网络实用技术考核知识点之Internet的结构及其接入方式...
  11. PHP利用smarty生成静态页详解
  12. VS2015自带的LocalDB数据库的用法
  13. 猫途鹰联手携程集团打造面向中国出境旅行者的顶级旅行平台
  14. 计算机二进制教案教程,计算机的二进制教案.doc
  15. PDF提取图片(错误纠正)
  16. Echarts绘制极坐标系下的多色柱状图
  17. pc机安装android,4种在PC机上运行Android系统的方法
  18. Codeforces 854 B Maxim Buys an Apartment
  19. c语言罗马数字换成整数,leetcode 13 罗马数字转整数 C语言
  20. linux memwatch的内存检测-double-free

热门文章

  1. 2020 年百度之星程序设计大赛 - 初赛二
  2. R语言︱list用法、批量读取、写出数据时的用法
  3. AndroMDA 4.x架构
  4. DIY audio player - 自定义audio播放器样式
  5. rem + vw 布局
  6. 使用STL中的list容器实现单链表的操作
  7. jquery 甘特图开发指南
  8. 2013元旦成都九寨沟攻略
  9. Win8 Metro App里玩XNA:ContentPipeline内容管线问题
  10. SQL Server datetime数据类型设计与优化误区