浅谈Opencl四大模型之Memory Model

运行模型(execution model)讲述了一个kernel怎么样在opencl平台运行,host喝kernel如何交互的,kernel代码如何编译的等等,但是没有涉及到opencl内存的管理方式, opencl的内存模型(memory model)主要讲述了opencl 内存组织架构,device和host内存分别是如何管理的,以及device与host之间数据如何交互的。Opencl的内存组织分配如下:

浅谈Opencl四大模型之Memory Model_第1张图片

 如上图所示,opencl内存分为host端和device端,host端的内存在host是直接可见的,在device端是不可见的,一般操作系统都是跑在host端,所以在在host端申请的opencl内存,其是可以直接访问读写的。在device端申请的内存,host端是不可见的,不可以直接进行读写。

Host memory:是直接在host上申请 的,内存驻留在host端,只能在host端可见的。

Global memory: 是 kernel端的申请全局内存,所有的work-item都是可以直接访问读写的。一般Global memory是分配在device端,但是有时device端内存不足够,有些芯片会在host端划出一片内存直接给device端使用,但是此时work-item读写性能较慢。

Constant memory:常量内存,一般驻留在device端,由host端调用相应API在device端申请,所有的work-item只可读不可写,访问速度快, 当devic内存不足够时,有些芯片会在host端申请,这是访问速度较慢。

Local memory:局部内存,分配在device端,在同一个work-group下的work-item能够共享进行访问,不同的work-group下的work-item不能够共享,访问速度较快

Private memory:为同一个work-item下的局部变量保存,不同的work-item不能够访问,它是work-item下的私有数据,其形式一般为寄存器,访问速度较快,数量较少,需要节约使用。

按照kernel访问速度如下:

Privare memory > Locak memory >  Constan memory和 Global memory (device端) > Constan memory和 Global memory (host端)

使用原则:

1:当本级别的内存不足够时,会向上一级申请。比如当 work-item变量 申请private memory时 内存不够时,会在local memory划出一片内存给private memory使用。 当local memory内存不够时,会在Global memory中划出一片区域给 local memory, 当然上述场景 访问内存速度也是逐渐下降

2:各个级别的内存相关独立,不受影响。

3: host端不可以直接访问device端内存,device端同样不可以直接访问host端内存。

4:当有数据需要从host端传递到device端, 需要调用相应的opencl API进行copy;同样当有数据需要从device端传递到host端,也需要相应API进行copy。

5:第二种host端和device端传递数据,是可以使用mapping映射功能,即在host端划出一片区域与device端内存做映射,将device端的内存映射到host端的地址空间,这样在host端就可以直接访问到device端内存。

6:由于kernel代码执行时存在并行运行,所以kernel对内存访问要考虑到内存一致性(memory conistency), 防止因内存一致性问题导致出现不同的计算结果,针对全局变量 尽量根据work-item Global ID为索引访问内存,可以有效防止内存一致性问题。

7: barrier也是一种保证local和global memory 一致性方法

8: relaxed consistency: opencl定义了内存松散一致性,由于kernel执行时是并行运行的,任何work-item在任何时候都有可能改变内存value.

9:内存一致性也可以通过 command-queue提交命令顺序,按照顺序执行才保证某时刻的值是一致的。

参考资料

《OpenCL programming Guide》

 

 

你可能感兴趣的:(Opencl,#,浅谈OpenCL)