本文来介绍CUDA的memory和变量存放,分为以下章节:
(一)、CPU Memory 结构
(二)、GPU Memory结构
(三)、CUDA Context
(四)、kernel设计
(五)、变量 & Memory
5.1 global arrays
5.2 global variables
5.3 Constant variables
5.4 Register
5.5 Local Array
5.6 Shared Memory
5.7 Texture Memory
5.8 总结
(一)、CPU Memory 结构
CPU提速主要依靠局部性原理,即时间局部性和空间局部性。我们先看一下CPU的内存结构:
Data Access
先复习一下数据在这几级存储中的传输。作为数据transfer的基本单位,cache line的典型大小为8*8(8个变量,每个8bytes)=64bytes. 当一个cache想要load数据到寄存器时,检查cache中的line,如果hit了就get到数据,否则将整条line从主存中去出来,(通常通过LRU)替换cache中一条line。寄存器传数据到cache也一样的过程。
Importance of Locality
上图中可见在CPU中memory<--->L3 Cache传输带宽为20GB/s, 除以64bytes/line得到传输记录速度约300M line/s,约为300M*8= 2.4G double/s. 一般地,浮点数操作需要两个输入+1个输出,那么loading 3个数(3 lines)的代价为 100Mflops。如果一个line中的全部8个variables都被用到,那么每秒浮点操作可以达到800Mflops。而CPU工作站典型为10 Gflops。这就要靠时间局部性来重用数据了。
(二)、GPU Memory结构
Data Access
- Kepler GPU的cache line通常为128bytes(32个float or 16个double)。
- 数据传输带宽最高250GB/s
- SMX的L2 cache统一1.5MB,L1 cache / shared memory有64KB
- 没有CPU中的全局缓存一致性,所以几乎没有两块block更新相同的全局数组元素。
Importance of Locality
GPU对浮点数的操作速度可达1Tflops。和上面CPU的计算类似,GPU中memory<--->L2Cache传输带宽为250GB/s, 除以128bytes/line得到传输记录速度约2G line/s,约为2G*16= 32G double/s. 一般地,浮点数操作需要两个输入+1个输出,那么loading 3个数(3 lines)的代价为 670Mflops。如果一个line中的全部16个variables都被用到,那么每秒