OpenCL2.0特性之SVM
from: http://blog.csdn.net/hdanbang/article/details/50198415
在OpenCL2.0中,增加了SVM(shared virtual memory)的特性。在开始讲解SVM之前,我们先用图片来看下OpenCL1.2中主机与设备端的地址空间:
图1 OpenCL1.2中主机与设备端地址空间
从图1可以看到,主机与设备具有不同的地址空间,各自需要对各自的内存进行管理。彼此之间不能直接访问对方的地址空间。所以,两者之间数据需要通信的话,只能把数据在主机与设备间来回拷贝,或者把设备端地址空间map /unmap到主机端。对于这样一种模式下,如果我们要想在设备端处理主机端的链表、树之类的数据。我们只能鞭长莫及!对于异构平台,我们就真的没办法愉快地处理链表之类的数据么?技术是发展的,有需求就必有技术来解决!
从CUDA6以后,GPU与CPU之间支持统一寻址(Unified Memory) ,GPU与CPU间可以直接访问彼此的地址空间,不需要我们人为的数据拷贝。这给异构计算又带入了一个新的高度,我们可以处理链表数据啦!既然CUDA都开始支持了,OpenCL也不能落后呀。在OpenCL2.0中,增加了共享虚拟内存(shared virtual memory),我们还是以一张图片来形象的描述:
图2 OpenCL2.0中主机与设备端地址空间
从图2可以看到,图1中原来两个彼此不相交的地址空间现在有个公共交集,这个公共交集就是SVM.。对于SVM的地址空间,主机和设备都可以直接访问,妈妈再也不用担心异构平台的数据访问方式了!
说完了SVM的意义,我们来聊聊SVM的具体细节。
对于SVM的创建,OpenCL2.0中有两种方式,一种缓冲分配(buffer allocation),另一种是系统分配(System allocation):
1、所谓缓冲分配,就是我们使用OpenCL API函数clSVMAlloc来分配,然后使用clSetKernelArgSVMPointer把分配的SVM作为内核参数传入
2、所谓系统分配,就是在主机端,我们可以使用malloc,new之类的系统分配内存函数来分配空间,然后使用clSetKernelArgSVMPointer把分配的SVM作为内核参数传入。
对于SVM的类型,OpenCL2.0也是有两种类型:一种是粗粒度;另一种是细粒度:
1、粗粒度SVM:共享发生在OpenCL缓冲内存对象区域粒度。在同步点强制内存一致性,使用map/unmap命令来更新主机与设备间的数据。粗粒度的SVM与OpenCL1.2中使用缓冲对象类似,不过唯一不同的是:我们不需要来回拷贝数据,设备与主机可以直接访问对方的数据,这才是重点!
2、所谓细粒度SVM:共享发生在OpenCL缓冲对象单个的加载/存储粒度。内存一致性在同步点得到保证。
好,结合SVM分配方式和SVM类型,可以把OpenCL2.0中的SVM分为:粗粒度缓冲SVM,细粒度缓冲SVM,细粒度系统SVM。(木有粗粒度系统SVM)。对于你的OpenCL设备(请确保你的设备支持OpenCL2.0),到底支持上述三种的哪三种呢?我们可以通过如下代码查询:
- cl_device_svm_capabilities svm;
- clGetDeviceInfo(*device,CL_DEVICE_SVM_CAPABILITIES,sizeof(svm),&svm,NULL);
- if(svm&CL_DEVICE_SVM_FINE_GRAIN_SYSTEM)
- printf("CL_DEVICE_SVM_FINE_GRAIN_SYSTEM\n");
- if(svm&CL_DEVICE_SVM_FINE_GRAIN_BUFFER)
- printf("CL_DEVICE_SVM_FINE_GRAIN_BUFFER\n");
- if(svm&CL_DEVICE_SVM_COARSE_GRAIN_BUFFER)
- printf("CL_DEVICE_SVM_COARSE_GRAIN_BUFFER\n");
在我的AMD A10-7400 Radeon R6平台上,当设备为CL_DEVICE_TYPE_GPU时,输出为:
- CL_DEVICE_SVM_FINE_GRAIN_BUFFER
- CL_DEVICE_SVM_COARSE_GRAIN_BUFFER
对于细粒度系统SVM,AMD当前是不支持的。
粗粒度缓冲SVM和细粒度缓冲SVM大致用法,如下表格所示
Coarse-grained SVM (Map/Unmap is requred) |
fine-grained SVM buffer |
---|---|
[cpp] view plaincopy
|
[cpp] view plaincopy
|
具体的SVM例子,请移步这里。
OpenCL2.0 SVM的讲解,就到这吧!
ps:最后唠叨一句:对于SVM,方便了我们码农编程,从硬件上来说,OpenCL设备与主机不一定是共享物理内存的。
OpenCL2.0特性之SVM相关推荐
- 1024 程序员节专题论坛来袭,权威解读 MindSpore、CANN 5.0 特性和 HCIA MDC 开发者认证...
"授人以鱼不如授人以渔",一句古话中蕴含的发展真理,我们将其套用到如今炽手可热的 AI 领域之上会发现无比适用.2018 年,华为提出了普惠 AI 的概念,降低 AI 开发门槛,让 ...
- 实用知识点梳理:网络操作系统、HTTPS、交换机中用户权限、路由器与集线器功能、HTTP2.0特性
网络操作系统 网络操作系统的基本任务: 屏蔽本地资源与网络资源之间的差异: 为用户提供基本的网络服务功能: 管理网络系统的共享资源: 提供网络系统的安全服务. HTTPS 在HTTP跟TCP中间多了一 ...
- Entity Framework Core 2.0 特性介绍和使用指南
前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升级EF也发展到EF6.x,Entity Framework Core是一个支持跨平台的全新版本, ...
- ASP.NET Core 2.0 特性介绍和使用指南
ASP.NET Core 2.0 发布日期:2017年8月14日 ASP.NET团队宣布ASP.NET Core 2.0正式发布,发布Visual Studio 2017 15.3支持ASP.NET ...
- .NET Core 2.0 特性介绍和使用指南
前言 这一篇会比较长,介绍了.NET Core 2.0新特性.工具支持及系统生态,现状及未来计划,可以作为一门技术的概述来读,也可以作为学习路径.提纲来用. 对于.NET Core 2.0的发布介绍, ...
- .NET Standard 2.0 特性介绍和使用指南
前言 早上起来.NET社区沸腾了,期待已久的.NET Core 2.0终于发布!根据个人经验,微软的产品一般在2.0时会趋于成熟,所以一个新的.Net开发时代已经来临!未来属于.NET Core. 对 ...
- RT-Thread 4.1.0 特性解析之LIBC与POSIX
1. POSIX 渊源 可移植操作系统接口,POSIX 标准定义了操作系统(很多时候针对的是类 Unix 操作系统)应该为应用程序提供的接口标准,从而保证了应用程序在源码层次的可移植性,如今主流的 L ...
- Redis4.0、5.0、6.0、7.0特性整理(持续更新)
最近研究研究新版本redis的新特性,网上查了查资料,这里记录一下. 0. Redis的版本迭代和里程碑 Redis从发布至今,已经有十余年的时光了,一直遵循着自己的命名规则: 版本号第二位如果是奇数 ...
- python视频行人检测_python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
参照opencv官网例程写了一个基于python的行人检测程序,实现了和自带检测器基本一致的检测效果. opencv版本:3.4.0 训练集和opencv官方用了同一个,可以从http://pasca ...
最新文章
- Nature:科研PUA太严重,过半博士后打算逃离
- (三)Window的特色学习笔记
- mysql的默认sid_默认实例(SID)已经设置,空实例默认连接时却连接不上?
- 基于python的天气预报系统,基于python编写的天气抓取程序
- 为了简单起见,Arquillian Chameleon
- sphinx文档_使用Sphinx构建自定义文档工作流
- 继电器和蜂鸣器的使用
- 计算机毕业设计ssm毕业论文管理系统b909r系统+程序+源码+lw+远程部署
- excel 第2讲:单元格格式设置
- Linux下cuda卸载
- 库存明细帐处理示例(包含结存数).sql
- 【CityHunter】游戏进度总控,及需求设计
- 大厂算法面试之leetcode精讲4.贪心
- 苹果手机技巧计算机,苹果的基本操作,不知道你还敢说你的手机是苹果
- 【华人学者风采】倪冰冰 上海交通大学
- android qq 邮箱格式,安全邮箱我输入的是qq邮箱为什么说邮箱格式 – 手机爱问
- Stream编程之Collectors.joining方法解析
- Notepad++增加读取二进制文件的功能——HexEditor的所有
- c语言的复试笔试题目,c语言面试最必考的十道试题,求职必看!!!
- U3D_关于UI中的锚点