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),到底支持上述三种的哪三种呢?我们可以通过如下代码查询:

[cpp] view plaincopy
  1. cl_device_svm_capabilities svm;
  2. clGetDeviceInfo(*device,CL_DEVICE_SVM_CAPABILITIES,sizeof(svm),&svm,NULL);
  3. if(svm&CL_DEVICE_SVM_FINE_GRAIN_SYSTEM)
  4. printf("CL_DEVICE_SVM_FINE_GRAIN_SYSTEM\n");
  5. if(svm&CL_DEVICE_SVM_FINE_GRAIN_BUFFER)
  6. printf("CL_DEVICE_SVM_FINE_GRAIN_BUFFER\n");
  7. if(svm&CL_DEVICE_SVM_COARSE_GRAIN_BUFFER)
  8. printf("CL_DEVICE_SVM_COARSE_GRAIN_BUFFER\n");

在我的AMD A10-7400 Radeon R6平台上,当设备为CL_DEVICE_TYPE_GPU时,输出为:

[html] view plaincopy
  1. CL_DEVICE_SVM_FINE_GRAIN_BUFFER
  2. CL_DEVICE_SVM_COARSE_GRAIN_BUFFER

对于细粒度系统SVM,AMD当前是不支持的。

粗粒度缓冲SVM和细粒度缓冲SVM大致用法,如下表格所示

Coarse-grained SVM
(Map/Unmap is requred)
fine-grained SVM buffer
[cpp] view plaincopy
  1. float* p = (float*)clSVMAlloc(…);
  2. clEnqueueSVMMap(…,
  3. CL_TRUE,  // block until map is done
  4. p, …);
  5. // Initialize SVM buffer
  6. p[i] = …;
  7. clEnqueueSVMUnmap(…, p, …);
  8. clEnqueueNDRange(…);
  9. clEnqueueSVMMap(…,
  10. CL_TRUE,  // block until map is done
  11. p, …);
  12. // Read the data produced by the kernel
  13. … = p[i];
  14. clEnqueueSVMUnmap(…, p, …);
[cpp] view plaincopy
  1. float* p = (float*)clSVMAlloc(…);
  2. // Initialize SVM buffer
  3. p[i] = …;
  4. clEnqueueNDRange(…);
  5. clFinish(…);
  6. // Read the data produced by the kernel
  7. … = p[i];

具体的SVM例子,请移步这里。

OpenCL2.0 SVM的讲解,就到这吧!

ps:最后唠叨一句:对于SVM,方便了我们码农编程,从硬件上来说,OpenCL设备与主机不一定是共享物理内存的。

OpenCL2.0特性之SVM相关推荐

  1. 1024 程序员节专题论坛来袭,权威解读 MindSpore、CANN 5.0 特性和 HCIA MDC 开发者认证...

    "授人以鱼不如授人以渔",一句古话中蕴含的发展真理,我们将其套用到如今炽手可热的 AI 领域之上会发现无比适用.2018 年,华为提出了普惠 AI 的概念,降低 AI 开发门槛,让 ...

  2. 实用知识点梳理:网络操作系统、HTTPS、交换机中用户权限、路由器与集线器功能、HTTP2.0特性

    网络操作系统 网络操作系统的基本任务: 屏蔽本地资源与网络资源之间的差异: 为用户提供基本的网络服务功能: 管理网络系统的共享资源: 提供网络系统的安全服务. HTTPS 在HTTP跟TCP中间多了一 ...

  3. Entity Framework Core 2.0 特性介绍和使用指南

    前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升级EF也发展到EF6.x,Entity Framework Core是一个支持跨平台的全新版本, ...

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

  5. .NET Core 2.0 特性介绍和使用指南

    前言 这一篇会比较长,介绍了.NET Core 2.0新特性.工具支持及系统生态,现状及未来计划,可以作为一门技术的概述来读,也可以作为学习路径.提纲来用. 对于.NET Core 2.0的发布介绍, ...

  6. .NET Standard 2.0 特性介绍和使用指南

    前言 早上起来.NET社区沸腾了,期待已久的.NET Core 2.0终于发布!根据个人经验,微软的产品一般在2.0时会趋于成熟,所以一个新的.Net开发时代已经来临!未来属于.NET Core. 对 ...

  7. RT-Thread 4.1.0 特性解析之LIBC与POSIX

    1. POSIX 渊源 可移植操作系统接口,POSIX 标准定义了操作系统(很多时候针对的是类 Unix 操作系统)应该为应用程序提供的接口标准,从而保证了应用程序在源码层次的可移植性,如今主流的 L ...

  8. Redis4.0、5.0、6.0、7.0特性整理(持续更新)

    最近研究研究新版本redis的新特性,网上查了查资料,这里记录一下. 0. Redis的版本迭代和里程碑 Redis从发布至今,已经有十余年的时光了,一直遵循着自己的命名规则: 版本号第二位如果是奇数 ...

  9. python视频行人检测_python+opencv3.4.0 实现HOG+SVM行人检测的示例代码

    参照opencv官网例程写了一个基于python的行人检测程序,实现了和自带检测器基本一致的检测效果. opencv版本:3.4.0 训练集和opencv官方用了同一个,可以从http://pasca ...

最新文章

  1. Nature:科研PUA太严重,过半博士后打算逃离
  2. (三)Window的特色学习笔记
  3. mysql的默认sid_默认实例(SID)已经设置,空实例默认连接时却连接不上?
  4. 基于python的天气预报系统,基于python编写的天气抓取程序
  5. 为了简单起见,Arquillian Chameleon
  6. sphinx文档_使用Sphinx构建自定义文档工作流
  7. 继电器和蜂鸣器的使用
  8. 计算机毕业设计ssm毕业论文管理系统b909r系统+程序+源码+lw+远程部署
  9. excel 第2讲:单元格格式设置
  10. Linux下cuda卸载
  11. 库存明细帐处理示例(包含结存数).sql
  12. 【CityHunter】游戏进度总控,及需求设计
  13. 大厂算法面试之leetcode精讲4.贪心
  14. 苹果手机技巧计算机,苹果的基本操作,不知道你还敢说你的手机是苹果
  15. 【华人学者风采】倪冰冰 上海交通大学
  16. android qq 邮箱格式,安全邮箱我输入的是qq邮箱为什么说邮箱格式 – 手机爱问
  17. Stream编程之Collectors.joining方法解析
  18. Notepad++增加读取二进制文件的功能——HexEditor的所有
  19. c语言的复试笔试题目,c语言面试最必考的十道试题,求职必看!!!
  20. U3D_关于UI中的锚点

热门文章

  1. WebService大讲堂之Axis2(2):复合类型数据的传递
  2. Redhat7.2上编译Linux内核源码
  3. Docker源码修改工作总结(三)
  4. JAVA中的异常的触发_java中的异常
  5. phpcms ——模板标签详细使用说明
  6. 03-老马jQuery教程-DOM操作(上)
  7. nginx反向代理监听非80端口造成的端口丢失解决方案
  8. Centos7_ELK5.4.1配置部署
  9. @html.ActionLink的几种参数格式
  10. 数据结构之单链表尾插法创建-RearCreate