Memory分类和访问(Memory Layout and Access)
opencl将存储模型分为三种:Private Memory,Local Memory,Constant Memory和Global Memory。其中Private Memory只可以被work-item使用,也就是单个work-item私有的;Local Memory可以被同一个work-group内的work-item所使用;Global Memory可以被所有的work-item访问和修改;而Constant Memory是Global Memory的一种,区别在于它是不能被更改的。示意图如下[1]:
大致了解了opencl中存储类型后,就会发现opencl的memory model和cuda的极为类似,ok,这里就简单的列出opencl中集中memory类型在Nvidia的GPU、AMD的GPU和CPU中实际对应的数据类型:
| Opencl | Nvidia CUDA | ATI GPU | AMD CPU |
|---|---|---|---|
| Global Memory | Global Memory | global buffer (g[] in CAL/IL) | 系统内存(RAM) |
| Local Memory | Shared Memory | Local Data Share | CPU L1缓存 |
| Private Memory | Register | scratch memory (x[] in CAL/IL) | 系统内存RAM |
update@2009.11.30
Opencl中还有一种存储类型:Image,也就是cuda中的纹理内存,包含2D和3D image。与CUDA中纹理一样提供不同的插值(采样)方式,同时也提供一定cache(硬件支持的),个人感觉,这是一个GPU的遗留产物,在CPU和DSP等的Opencl实现极有可能不提供对其的支持。所以要注意在使用时,最好先查询一下是否支持。
如何使用(How to use these memory)
to be continued…