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拷贝数据能够并行执行

 

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
相关文章
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 ...
1369 0
|
openCL 异构计算 Linux
OpenCL memory object 之 Global memory (2)
当我们用clCreateBuffer, clCreateImage创建OpenCL memory object时候,我们需要输入一个flag参数,这个参数决定memory object的位置。 cl_mem clCreateBuffer (cl_context context,...
1202 0
|
openCL 异构计算 Windows
OpenCL memory object 之 传输优化
首先我们了解一些优化时候的术语及其定义:   1、deferred allocation(延迟分配),      在第一次使用memory object传输数据时,runtime才对memory object真正分配空间。
1226 0
|
异构计算 openCL Go
OpenCL memory object 之选择传输path
对应用程序来说,选择合适的memory object传输path可以有效提高程序性能。   下面先看一写buffer bandwidth的例子:   1.  clEnqueueWriteBuffer()以及clEnqueueReadBuffer()         如果应用程序已经通过malloc 或者mmap分配内存,CL_MEM_USE_HOST_PTR是个理想的选择。
1245 0
|
安全 IDE Java
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
385 1
课时78:Object类的基本概念
Object类的主要特点是可以解决参数的统一问题,使用object类可以接受所有的数据类型。 1. Object类简介 2. 观察Object类接收所有子类对象 3. 使用Object类接收数组
236 0
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
222 8
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
573 4