博客
关于我
CUDA编程第五章: 共享内存&常量内存
阅读量:289 次
发布时间:2019-02-27

本文共 913 字,大约阅读时间需要 3 分钟。

CUDA共享内存优化指南

5.1 CUDA共享内存概述

GPU中的内存可分为两类:板载内存和片上内存。全局内存属于板载内存,具有较高的延迟,但带宽较高。共享内存则属于片上内存,具有较低的延迟和更高的带宽,通常用作可编程管理的缓存。

共享内存的特点包括:

  • 每个SM都有独立的共享内存,作用仿佛L1和L2缓存。
  • 所有由该SM执行的线程共享该内存,常用于线程间通信。
  • 需要程序显式管理。
  • 带宽比全局内存高10倍,延迟低20倍以上。
  • Kepler架构的SM存储顺序可见,如图所示。共享内存访问事物与全局内存相同,但当多个线程访问同一存储体时,会引发存储体冲突。

    5.2 共享内存的数据布局

    共享内存可以分为行主序和列主序访问。行主序访问适合多个线程同时访问不同的存储体,减少存储体冲突。而列主序访问则容易导致大量存储体冲突。

    通过使用填充技术,可以避免存储体冲突。填充技术通过添加额外数据,将同一存储体中的数据分散到不同存储体中,减少冲突发生的概率。

    5.3 减少全局内存访问

    使用共享内存可以缓存片上数据,减少核函数对全局内存的访问频率。在本节中,通过并行归约核函数,结合共享内存优化,全局内存访问的有效带宽得到了显著提升。

    5.4 合并的全局内存访问

    通过将共享内存作为缓存,优化全局内存访问模式,可以避免非合并访问带来的性能损失。在矩阵转置的例子中,通过合并读写操作,显著提高了内存带宽利用率。

    5.5 常量内存

    常量内存是一种只读内存,位于设备DRAM上,且有专用片上缓存。其优点包括:

  • 数据可广播到所有线程。
  • 主机可直接访问。
  • 数据缓存效果优于全局内存。
  • 常量内存适用于需要多线程同时读取相同数据的场景。

    5.6 线程束洗牌指令

    从Kepler架构开始,洗牌指令被引入,为线程束内的数据交换提供了高效的机制。洗牌指令支持整型和浮点型变量的交换,具备广播、复制、交叉交换等功能,可显著提高内核性能。

    5.7 总结

    共享内存、常量内存、只读缓存和线程束洗牌指令是优化GPU内存访问性能的关键手段。通过合理使用这些资源,可以显著提升应用程序的性能,减少内存延迟并提高带宽利用率。在实际应用中,应根据具体需求选择最优的内存访问模式。

    转载地址:http://obkb.baihongyu.com/

    你可能感兴趣的文章
    PHP函数方法
    查看>>
    PHP删除指定目录下的所有文件和文件夹 | 删除指定文件
    查看>>
    php判断ip黑名单程序代码
    查看>>
    php判断复选框是否被选中的方法
    查看>>
    PHP判断指定目录下是否存在文件
    查看>>
    php判断数组是否为空
    查看>>
    PHP判断数组是否有重复值、获取重复值
    查看>>
    PHP利用正则表达式实现手机号码中间4位用星号(*)替换显示
    查看>>
    PHP加密与安全的最佳实践
    查看>>
    PHP区分 企业微信浏览器 | 普通微信浏览器 | 其他浏览器
    查看>>
    php原生代码怎么连表查询,PHP tp5中使用原生sql查询代码实例
    查看>>
    PHP去掉转义符
    查看>>
    php反射api
    查看>>
    PHP反射ReflectionClass、ReflectionMethod 入门教程
    查看>>
    PHP反射机制
    查看>>
    php取当天的最后一秒_Docker快速搭建PHP开发环境详细教程
    查看>>
    php取绝对值
    查看>>
    php各种常用的算法
    查看>>
    php各种缓存策略对比
    查看>>
    php后台“爬虫”模拟登录第三方系统
    查看>>