博客
关于我
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/

    你可能感兴趣的文章
    pm2通过配置文件部署nodejs代码到服务器
    查看>>
    PML调用PDMS内核命令研究
    查看>>
    PMM安装-第一篇
    查看>>
    PMP知识要点(第九章)
    查看>>
    POCO库中文编程参考指南(4)Poco::Net::IPAddress
    查看>>
    Quartz基本使用(二)
    查看>>
    POC项目安装与使用指南
    查看>>
    Podman核心技术详解
    查看>>
    pods 终端安装 第三方框架的一些命令
    查看>>
    Podzielno
    查看>>
    PoE、PoE+、PoE++ 三款交换机如何选择?一文带你了解
    查看>>
    PoE三种标准:标准 PoE、PoE+、PoE++,网络工程师必知!
    查看>>
    POI 的使用
    查看>>
    poi 读取单元格为null者空字符串
    查看>>
    poi-tl简介与文本/表格和图片渲染
    查看>>
    pointnet分割自己的点云数据_PointNet解析
    查看>>
    POI实现Excel导入Cannot get a text value from a numeric cell
    查看>>
    POI实现Excel导入时提示NoSuchMethodError: org.apache.poi.util.POILogger.log
    查看>>
    POI实现Excel导出时常用方法说明
    查看>>
    POI导出Excel2003
    查看>>