OpenCL memory object 之 Global memory (1)

简介: 这篇日志是学习AMD OpenCL文档时候的总结。      OpenCL用memory object在host和device之间传输数据,memory object由runtime(运行库,driver的一部分)来管理。

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

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

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

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

image

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。

image

下面我们看下如何在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拷贝数据能够并行执行

 

相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
相关文章
This error might indicate a memory leak if setState() is being called because another object is reta
This error might indicate a memory leak if setState() is being called because another object is reta
|
Oracle 关系型数据库 数据库
【问题处理】Memory Notification: Library Cache Object loaded into SGA
1.问题现象数据库日常巡检过程中,在alert日志中发现如下警告信息……省略……Thu Apr 15 22:06:31 2010Memory Notification: Library Cache Object loaded into SGAHeap size ...
1090 0
|
openCL 异构计算 Linux
OpenCL memory object 之 Global memory (2)
当我们用clCreateBuffer, clCreateImage创建OpenCL memory object时候,我们需要输入一个flag参数,这个参数决定memory object的位置。 cl_mem clCreateBuffer (cl_context context,...
1030 0
|
openCL 异构计算 Windows
OpenCL memory object 之 传输优化
首先我们了解一些优化时候的术语及其定义:   1、deferred allocation(延迟分配),      在第一次使用memory object传输数据时,runtime才对memory object真正分配空间。
1043 0
|
异构计算 openCL Go
OpenCL memory object 之选择传输path
对应用程序来说,选择合适的memory object传输path可以有效提高程序性能。   下面先看一写buffer bandwidth的例子:   1.  clEnqueueWriteBuffer()以及clEnqueueReadBuffer()         如果应用程序已经通过malloc 或者mmap分配内存,CL_MEM_USE_HOST_PTR是个理想的选择。
1066 0
|
5月前
|
Java
java判断Object对象是否为空demo
java判断Object对象是否为空demo
|
5天前
|
JavaScript
js 字符串String转对象Object
该代码示例展示了如何将一个以逗号分隔的字符串(`'1.2,2,3,4,5'`)转换为对象数组。通过使用`split(',')`分割字符串并`map(parseFloat)`处理每个元素,将字符串转换成浮点数数组,最终得到一个对象数组,其类型为`object`。
|
1月前
|
存储 设计模式 Python
Python中的类(Class)和对象(Object)
Python中的类(Class)和对象(Object)
27 0
|
1月前
|
存储 JavaScript
JS中Map对象与object的区别
JS中Map对象与object的区别