GPU内存结构
-
片外存储
- 常量内存(读取速度较快)
- 纹理内存
- 全局内存
-
片内存储
- 每个SP中的32位寄存器组(以线程为单位)
- 共享存储(与cache速度类似)(以线程块为单位)
- 只读的常量内存缓存(以网格为单位)
- 只读的纹理内存缓存
-
不同存储类型的访问时间
存储类型 寄存器 共享内存 常量内存 全局内存 带宽 8TB/s 1.5TB/s 200MB/s 200MB/s 延迟 一个周期 1—32个周期 400—600周期 400—600周期 -
数据存储的位置
- 使用cudaMemcpy从主机拷贝到GPU的数据存储在全局内存,常量内存或纹理内存
- 将数据放置到共享内存需要程序员手工定义共享内存区域,并将数据从全局内存放到共享内存
- 绝大多数的线程内部分配的变量在寄存器中
全局内存
尽量在同一时刻让线程组请求连续的内存地址,从而提高全局内存的访问效率
- CUDA常用的编程策略
- 将要处理的数据划分为小块数据,使其刚好存储在共享内存中
- 将小块数从全局内存送入共享内存,使用多线程读取可以有效利用内存级的并行
- 线程块中的线程对位于共享内存中的小块数据进行计算
- 将计算结果从共享内存传回到全局内存
共享内存
- 共享内存是基于存储体切换的架构(如果没有存储体冲突,共享内存的访问速度与寄存器相同)