这篇日志是学习AMD OpenCL文档时候的总结。

OpenCL用memory object在host和device之间传输数据,memory object由runtime(运行库,driver的一部分)来管理。

OpenCL中的内存对象包括buffer以及image,buffer是一维数据元素的集合。image主要用来存储一维、二维、三维图像、纹理或者framebuffer。[对image对象,gpu会有优化,比如使用L1 cache,使用tile mode地址等等]

我们先画一张图,然后再来学习各种内存概念:

Host memory:

是指系统内存,cpu能够以全速带宽访问系统内存,但是GPU不能直接访问它。

Pinned host memory(page locked):

是host内存的一部分,由操作系统确定它的驻留位置,它的物理地址是固定的,不能改变。runtime会限制opencl memory object使用的pinned memory数量。注:pinned memory如同名字所言,不能被交换出内存,是page locked。cpu能够以全速带宽访问pinned内存,且需保持cpu cache一致性,GPU通过PCIE访问pinned memory,也要保持cache一致性。

Device visible host memory:

是pinned memory一部分,GPU访问时可以不必保持cpu cache一致性,这样可以加快GPU访问速度,但由于没有cache一致性,cpu读这些memory就变慢了,由于可以combined write(就是通过一次内存访问,邻接的很多地址进行写操作),cpu写操作速度并不慢。

Device memory:

dGPU有自己的device memory,gpu可以以高带宽进行访问,但cpu不能直接访问。

Host visible device memroy:

dGPU的一部分,GPU能够以全速带宽访问它,该内存被映射到cpu地址空间,做为无cache内存,cpu可以通过PCIE直接访问它,当然速度和system memory比,要慢好多,但是由于可以combined write(scatter write),所以写速度取决于PCIE带宽。

对于APU而言,没有单独的global memory,它用device visible memory 做为global memory。

下面我们看下如何在system memory和device memory之间传输数据:

当system memory中的数据要拷贝到device memory中去的时候,OpenCL runtime执行下面的操作:

1、当传输数据小于32K时,cpu把数据拷贝到runtime能够访问的pinned memory buffer中,然后DMA engine执行相应的传输,相反的过程也一样,数据从device memory传输到pinned memory buffer,然后copy到指定的系统内存块中。

2、传输数据大于32K,小于16M时,数据的物理内存页首先被pinned(lock page),然后DMA engine执行传输操作,最后内存块被unpinned。

3、当传输数据大于16M时,host pinned memory的staging buffer被使用,数据分批次被拷贝到staging buffer,然后传输到device memory。注:会使用双缓冲,以便DMA向device拷贝数据、cpu向stage buffer拷贝数据能够并行执行。

OpenCL memory object 之 Global memory (1)相关推荐

  1. OpenCL memory object 之 Global memory (2)

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

  2. OpenCL memory object 之 传输优化

    首先我们了解一些优化时候的术语及其定义: 1.deferred allocation(延迟分配), 在第一次使用memory object传输数据时,runtime才对memory object真正分 ...

  3. OpenCL memory object 之选择传输path

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

  4. Cuda中Global memory中coalescing例程解释

    Global memory是cuda中最常见的存储类型,又叫做Device memory,位于Host主机区域上,它的生命周期是在整个Grid里面,大约具有500个cycle latency.在cud ...

  5. cuda的global memory介绍

    CUDA Memory Model 对于程序员来说,memory可以分为下面两类: Programmable:我们可以灵活操作的部分. Non-programmable:不能操作,由一套自动机制来达到 ...

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

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

  7. PatchScope: Memory Object Centric Patch Diffing

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

  8. PaddleOCR——申请显存不足【Allocate too much memory for the GPU memory pool, assigned 8000 MB】解决方案

    问题描述 E0724 02:41:05.436789 3160 analysis_predictor.cc:515] Allocate too much memory for the GPU memo ...

  9. virtual memory exhausted: Cannot allocate memory Linux虚拟内存不足,扩展虚拟内存的解决办法

    Linux虚拟内存不足,扩展虚拟内存的解决办法 virtual memory exhausted: Cannot allocate memory 在编译软件的时候,出现了这个错误: virtual m ...

最新文章

  1. Oracle ASM 翻译系列第十二弹:ASM Internal amdu - ASM Metadata Dump Utility
  2. Python矩阵处理库—Numpy库的基本使用
  3. 我与无影的初体验:使用无影云桌面进行一个开源 Angular 项目的端到端测试
  4. 关于SAP Spartacus Routing 页面上下文切换机制的实现
  5. 集合的定义与并查操作(C语言)
  6. Micrium/UCOS官网账号密码重新改问题
  7. [ BZOJ 4668 ] 冷战
  8. Java中文件的创建
  9. mysql执行语句后回退_MySQL命令学习笔记(八)
  10. 蓝色营销型中央空调设备系统类网站源码 大型制冷设备网站织梦模板
  11. 矩阵论思维导图_全新思维导图
  12. 理解 Linux/Unix 登录脚本
  13. CSS样式表书写位置
  14. wxpython日期控件_使用wxpython控件在面板中的位置
  15. Innodb 的事物隔离级别实现原理(一)
  16. sql服务器显示空白,sql服务器空白
  17. 小程序源码:全新独立后台修复登录在线答题-多玩法安装简单
  18. Flume-三大核心组件
  19. SecureCRT通过SSH服务登录ubuntu出错:Password authentication failed, Please verify that the username and passw
  20. mysql关系图查看

热门文章

  1. 【转】Microsoft Teams快速上手系列-01Teams的前世今生
  2. SharePoint学习札记[6] — WebPart之基础
  3. 第九节:JWT简介和以JS+WebApi为例基于JWT的安全校验
  4. 正则表达式:日期格式的校验(日期+时间)
  5. cas引出的ABA问题?如何解决?- 理解原子引用、时间戳(版本号)原子引用
  6. PWN-PRACTICE-BUUCTF-21
  7. 【HDU - 5875】Function(线段树,区间第一个小于某个数的数 或 RMQ二分)
  8. 【CodeForces - 545 ABCDE套题训练题解】贪心, 构造,模拟,dp,最短路树(Dijkstra+变形)
  9. php测试插入,php – 使用Symfony测试数据库插入
  10. angularjs 开发流程_超级棒的30款web前端开发工具汇总,一定要收藏!