CUDA中的内存效率

GPU内存结构

  • 片外存储

    • 常量内存(读取速度较快)
    • 纹理内存
    • 全局内存
  • 片内存储

    • 每个SP中的32位寄存器组(以线程为单位)
    • 共享存储(与cache速度类似)(以线程块为单位)
    • 只读的常量内存缓存(以网格为单位)
    • 只读的纹理内存缓存
  • 不同存储类型的访问时间

    存储类型 寄存器 共享内存 常量内存 全局内存
    带宽 8TB/s 1.5TB/s 200MB/s 200MB/s
    延迟 一个周期 1—32个周期 400—600周期 400—600周期
  • 数据存储的位置

    • 使用cudaMemcpy从主机拷贝到GPU的数据存储在全局内存,常量内存或纹理内存
    • 将数据放置到共享内存需要程序员手工定义共享内存区域,并将数据从全局内存放到共享内存
    • 绝大多数的线程内部分配的变量在寄存器中

全局内存

尽量在同一时刻让线程组请求连续的内存地址,从而提高全局内存的访问效率

  • CUDA常用的编程策略
    • 将要处理的数据划分为小块数据,使其刚好存储在共享内存中
    • 将小块数从全局内存送入共享内存,使用多线程读取可以有效利用内存级的并行
    • 线程块中的线程对位于共享内存中的小块数据进行计算
    • 将计算结果从共享内存传回到全局内存

共享内存

  • 共享内存是基于存储体切换的架构(如果没有存储体冲突,共享内存的访问速度与寄存器相同)

猜你喜欢

转载自blog.csdn.net/qq_42573343/article/details/105295513