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

    你可能感兴趣的文章
    Nginx的Rewrite正则表达式,匹配非某单词
    查看>>
    Nginx的使用总结(一)
    查看>>
    Nginx的是什么?干什么用的?
    查看>>
    Nginx访问控制_登陆权限的控制(http_auth_basic_module)
    查看>>
    nginx负载均衡的五种算法
    查看>>
    Nginx配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    Nginx配置参数中文说明
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    NI笔试——大数加法
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    NMAP网络扫描工具的安装与使用
    查看>>
    NN&DL4.3 Getting your matrix dimensions right
    查看>>
    NN&DL4.8 What does this have to do with the brain?
    查看>>
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    查看>>
    No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
    查看>>
    No module named cv2
    查看>>