博客
关于我
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 PSR规范
    查看>>
    php rand() 重复,array_rand()函数从另外一个数组中随机取得的一定数量的数组的元素是否会重复?...
    查看>>
    php redis(2)
    查看>>
    PHP Redis分布式锁
    查看>>
    PHP SOAP模块的使用方法:NON-WSDL模式
    查看>>
    PHP SPL标准库-迭代器
    查看>>
    PHP Static延迟静态绑定
    查看>>
    php zookeeper实现分布式锁
    查看>>
    PHP 使用 $_SERVER['PHP_SELF'] 获取当前页面地址及其安全性问题
    查看>>
    php 反射
    查看>>
    PHP 实现N阶矩阵相乘
    查看>>
    php 延迟静态绑定static关键字
    查看>>
    Redis入门
    查看>>
    PHP 截取字符串乱码的解决方案
    查看>>
    php 接口类与抽象类的实际作用
    查看>>
    PHP 插入排序 -- 折半查找
    查看>>
    PHP 支持8种基本的数据类型
    查看>>
    php 放大镜,放大镜放大图片效果
    查看>>
    php 数据库 表格数据,php数据库到excel表格-php怎么把数据库数据放到表格里
    查看>>
    PHP 数据库连接池实现
    查看>>