首先我们了解一些优化时候的术语及其定义:

1、deferred allocation(延迟分配),

在第一次使用memory object传输数据时,runtime才对memory object真正分配空间。 这样减少了资源浪费,但第一次使用时要慢一些[一个context多个设备,一个memory object多个location,见前面的blog]。

2.peak interconntect bandwith(峰值内联带宽)

host和device之间通过PCIE总线传输数据,PCIE2.0的上行、下行带宽都是8Gb/s, 对于我们的程序,能达到3Gb/s就不错了,我的笔记本测试只有1.2Gb/s。

3.Pinning(对内存实施pinning操作)

host memory准备向gpu传输时,都要首先进行pinning,就是lock page(禁止交换到外存),pinning操作有一定的性能开销,开销的大小和pinning的host memory大小有关,越大就开销越大。我们可以把host memory分配到pre pinned memory中减少这种开销。

4.WC(write combined operation)

WC是cpu写固定地址时的一个特性,通过把邻接的写操作绑定到一个cacheline,然后发一个写请求,实现了批量写操作。[Gpu内部也有相似的地址合并操作]

5.uncached access

一些内存区域被配置为uncache access,cpu访问比较慢,但是有利于向device memory传输数据,比如前篇日志提到device visible host memory。

6.USWC(无cache的写绑定)

gpu访问uncached的host memory不会产生cache一致性问题,速度会比较快,cpu写因为WC也比较快,相对来说cpu读会变慢。在APU上,这个操作会提供一个快速的cpu写,gpu读的path。

下面看看buffer的分配及使用:

1.normal buffer

用CL_MEM_READ_ONLY/CL_MEM_WRITE_ONLY/CL_MEM_READ_WRITE标志创建的buffer位于device memory中,GPU能够以很高的bandwidth访问这些它,例如对一些高端的显卡,超过100GB/s,host要访问这些内存,只能通过peak interconntect bandwith(PCIE)。

2. zero copy buffer

这种buffer并不做实际的copy工作(除非特殊指定执行copy操作,比如clEnqueueCopyBuffer)。根据创建buffer的type参数,它可能位于host memory也可能位于device memory。

如果device及操作系统支持zero copy,则下面buffer类型可以使用:

• The CL_MEM_ALLOC_HOST_PTR buffer
– zero copy buffer驻留在host。
– host能够以全带宽访问它。
– device通过interconnect bandwidth访问它。
– 这块buffer被分配在prepinned的host memory中。

• The CL_MEM_USE_PERSISTENT_MEM_AMD buffer is
– zero copy buffer 驻留在GPU device中。
– GPU能全带宽访问它。
– host能够以interconnect带宽访问它 (例如streamed写带宽host->device,低的读带宽,因为没有cache利用)。

– 在host和device之间通过interconnect带宽传输数据。

注意:创建buffer的大小是平台dependience的,比如在某个平台上一个buffer不能超过64M,总的buffer不能超过128M等。

zero copy内存在APU上可以得到很好的效果,cpu可以高速的写,gpu能够高速的读,但因为无cache,cpu读会比较慢。

1. buffer = clCreateBuffer(CL_MEM_ALLOC_HOST_PTR | CL_MEM_READ_ONLY)
2. address = clMapBuffer( buffer )
3. memset( address ) or memcpy( address ) (if possible, using multiple CPU
cores)
4. clEnqueueUnmapMemObject( buffer )
5. clEnqueueNDRangeKernel( buffer  )

对于数据量小的传输,zero copy时延(map,unmap等)通常低于相应的DMA引擎时延。

3. prepinned buffer

pinned buffer类型是CL_MEM_ALLOC_HOST_PTR/CL_MEM_USE_HOST_PTR, buffer初始就被创建在prepinned内存中。 EnqueueCopyBuffer以interconnect带宽在host和device之间传输数据(没有pinned和unpinned开销)。

注意:CL_MEM_USE_HOST_PTR能够把已经存在的host buffer转化到pinned memory中去,但是为了保证传输速度,host buffer必须保证256字节对齐。如果只是用来传输数据的话,CL_MEM_USE_HOST_PTR 类型memory对象会一直为prepinned内存,但是它不能作为kernel参数。如果buffer要在kernel中使用的话,runtime会在device创建一个该buffer cache copy,接下来的copy操作不会通过fast path(要保持cache一致性)。

下面的一些函数支持prepinned memory,注意:读取memory可以使用offset:
• clEnqueueRead/WriteBuffer
• clEnqueueRead/WriteImage
• clEnqueueRead/WriteBufferRect (Windows only)

分类: OpenCL
绿色通道:好文要顶关注我收藏该文与我联系
迈克老狼2012
关注 - 7
粉丝 - 127
+加关注

1
0
(请您对文章做出评价)

« 上一篇:OpenCL memory object 之 Global memory (2)
» 下一篇:OpenCL memory object 之选择传输path

posted on 2011-12-18 13:52 迈克老狼2012 阅读(841) 评论(1) 编辑 收藏

评论

#1楼

老狼,最近一直在你的博客上学习,学到了很多东西,这篇文章有点东西不太明白,帮忙解答下呗
1、在某个平台上一个buffer不能超过64M,总的buffer不能超过128M等
总的buffer是指CPU+GPU的zero-copy buffer吗 , 分别64M?
2、clMapBuffer( buffer ) 是必须的吗 它和clEnqueueMapBuffer有什么区别?用clEnqueueMapBuffer可以代替clmMapBuffer吗

OpenCL memory object 之 传输优化相关推荐

  1. OpenCL memory object 之 Global memory (1)

    这篇日志是学习AMD OpenCL文档时候的总结. OpenCL用memory object在host和device之间传输数据,memory object由runtime(运行库,driver的一部 ...

  2. OpenCL memory object 之 Global memory (2)

    当我们用clCreateBuffer, clCreateImage创建OpenCL memory object时候,我们需要输入一个flag参数,这个参数决定memory object的位置. cl_ ...

  3. OpenCL memory object 之选择传输path

    对应用程序来说,选择合适的memory object传输path可以有效提高程序性能. 下面先看一写buffer bandwidth的例子: 1.  clEnqueueWriteBuffer()以及c ...

  4. 2021-7 论文阅读 [PatchScope: Memory Object Centric Patch Diffing]

    0.前言 这应该是七月份阅读的最后一篇论文了,这篇论文所讲的东西我之前几乎没有接触过,因此我会尽己所能的去读懂它,介绍他. 首先,这是一篇关于补丁(patch)分析的文章,补丁包含了很大的信息量,对于 ...

  5. PatchScope: Memory Object Centric Patch Diffing

    PatchScope: Memory Object Centric Patch Diffing 介绍 分析目的是为了定位补丁,通过丰富的语意解释为什么要添加补丁.分析补丁的根源,理解补丁细节. 定位补 ...

  6. WSE3.0构建Web服务安全(4):MTOM消息传输优化和文件上传、下载

    MTOM消息优化传输机制主要应用于大量数据的传输,很多文章中也直接得出结论:使用MTOM文件传输效率高.为什么MTOM的数据传输效率会比别的方式要高?MTOM真的如此完美吗,它有什么不足?什么情况下使 ...

  7. Wi-Fi弱网传输优化不成功有感

    总之,就是失败了. 我曾建议不要针对Wi-Fi弱网做传输优化,因为很难有大收益.本质原因: Wi-Fi网络通过RTT变化识别拥塞不靠谱. Wi-Fi网络通过丢包识别拥塞不靠谱. RTT变化和丢包是端到 ...

  8. 如何构建全球实时音视频云及其海外网络传输优化

    点击上方"LiveVideoStack"关注我们 全球不同国家和地区的网络基建水平参差不齐,如何利用有限的网络资源提供更高质量的音视频通话体验是音视频服务商必须面对的挑战.在此次L ...

  9. IDC网络传输优化随想录

    在IDC内部,如果你还遵循传统为广域网而生的拥塞控制逻辑做事,那就错了.当然,我下面说的也不一定都对. 正确的做法就好像我之前说的一种情况的反例,那种情况是,让你优化长肥链路传输,你却在优化spinl ...

最新文章

  1. 数学界的隐士:世界上最奇怪的数学天才,被奖励100万却拒领
  2. rsync 常见错误与解决方法整理
  3. arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf的区别
  4. java程序员高薪持续的原因有哪些
  5. Doxygen学习小记
  6. MTK 驱动开发(28)--6797平台 TP 移植
  7. java获取微信的通讯录,java微信开发API第三步 微信获取以及保存接口调用凭证
  8. abap中读取excel中不同的sheet数据_Python 如何将数据写入Excel的不同或同一个工作簿中...
  9. 分享两个必应壁纸接口,可用来获取高质量壁纸和故事
  10. 可视化编程语言是什么意思
  11. Chrome历史版本以及ChromeDriver下载地址对应的版本
  12. 显示地区名称用城市代码查询城市天气
  13. 【数学】嵌入式开发中涉及到的对数公式
  14. 游戏开发入门系列(目录)
  15. 递推DP(至少和至多之间的转换
  16. ErrMsg:server is DOWN now, please try again later!
  17. mysql5.7.17 32_mysql—MySQL 5.7.17安装及基本SQL语句(第七章)
  18. 移动端Swiper的一些尝试(中间完整,两边有内容,循环展示)
  19. sort -k 参数详细总结(转)
  20. windows64位系统完全卸载winpcap的方式

热门文章

  1. 【转】刨根究底字符编码【2.0版】(1):开篇
  2. 【转】Postman系列三:Postman中post接口实战(上传文件、json请求)
  3. 使用开源工具ELK可视化 Azure NSG日志
  4. .NET平台下开源框架
  5. ELK学习总结(1-1)ELK是什么
  6. SharePoint Pages(1)之SharePoint页面体系架构
  7. PWN-PRACTICE-BUUCTF-17
  8. 计算机文化基础论述题,计算机文化基础复习题六
  9. 三星sec.android.soagent,3.0降级2.5教程
  10. 聚类分析在用户行为中的实例_看完这篇,你还敢说不懂聚类分析?