Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CUDA优化的冷知识14|local memory你可能不知道的好处

CUDA优化的冷知识14|local memory你可能不知道的好处

作者头像
GPUS Lady
发布于 2021-02-05 03:26:37
发布于 2021-02-05 03:26:37
1.4K0
举报
文章被收录于专栏:GPUS开发者GPUS开发者
这一系列文章面向CUDA开发者来解读《CUDA C Best Practices Guide》 (CUDA C最佳实践指南)

大家可以访问:

https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html 来阅读原文。

这是一本很经典的手册。

CUDA优化的冷知识 8 |GPU显存的特色

CUDA优化的冷知识9 |GPU显存的粒度

CUDA优化的冷知识10 | GPU卡和Jetson上显存优化的特色

CUDA优化的冷知识11 |一些规避的坑和优化的要点

CUDA优化的冷知识12 |一些规避的坑和优化的要点(续)

CUDA优化的冷知识13 |从Global memory到Shared memory

下面我们简单的再说一下local memory.

首先要注意的是local memory并不local, 它实际上依然是一段显存. 但可能会被各级相关的缓存所缓冲。

主要用途有两点:

一点是你(读者)使用,当你需要每个线程的一段缓冲区的时候,你并不需要单独的开一个全局的大的缓冲区,然后作为参数传递给kernel, 让kernel里的每个线程找到自己对应的一部分使用。你可以直接来一个局部的大数组(不能过大!), 享受类似以前的CPU上的C风格的, stack上的定义的数组, 或者类似CPU上的alloca()的分配风格, 能自动的每人一份, 而且能自动释放, 很是方便,而且不仅仅如此, 你如果传递进来一个大缓冲区这样用, 你需要为所有的一次启动的线程分配缓冲区. 而用local memory, 则只需要保证能真正同时上到SM里执行的那些线程的数量所需要的缓冲区,举个例子说, 前者你启动了1M个线程, 每个线程需要1KB, 则你需要1GB的显存提前手工分配了.而如果你使用后者, 某GPU device实际上只能同时执行10K个这样的线程, 其他的暂时没上的, 在其他block中的线程们, 会等待下次轮批次再上, 则硬件上只需要准备/分配出来100MB的显存, 即可应付, 因为这些线程不是真的"同时"在运行中的(具体参考我们之前的编程指南手册).这点不仅仅降低了手工管理的成本, 还降低了你花钱买一张更大显存的卡的成本.特别的是在Jetson设备上, 显存(内存)容量有限, 用户应当考虑这点.但是很遗憾的, 很多人就是喜欢传递过来一个额外的数组/指针这样使用, 原因我们还未知。

此外, 使用local memory还有一个好处, 就是虽然它像global一样, 被各级缓存缓冲, 但是它有更精细的缓存控制策略, 可以允许对local memory上特定位置的访问, 标记成discard, 或者说last use(PTX手册用语). 允许cache直接将对应的cache line内容, 就地丢弃掉, 而无需必须回写下一级缓存甚至到显存. 这点作为global memory是做不到的。

此外, 今天的实践手册没有说明的是, local memory还具有强制合并访问的特性.我们都说用了local memory, 但是几乎没人讨论"local memory是否是合并的", 既然我们今天已经知道了它也是用的显存模拟出来的, 为何不讨论这点?这是因为local memory有自动交错的特性. 例如我们定义了一个int dog[N]; 假设dog被编译器选择放置到了local memory上, warp中的每个线程都在访问同样下标的, 例如dog[K]的时候, 实际上来自32个线程的同样下标的访问会被合并成连续的地址空间上排布的一段128B的内容, 非常的合并.用户可以理解成local memory实际上总是按warp排布的, 任何int dog[N]都是内在的被存储为int _dog[N][32]这种自动交错.

从而总是自动形成了, 当下标一致的情况下, 自动合并的效果. (这点最早见于2013年的CUDA Handbook, 这是一本好书, 但是国内翻译的书质量不高,所以我们一直没推荐。也可以参考我们之前的CUDA编程指南中的内容),因为这种自动交错/合并的存在. 对local memory中, 来自同一个warp的杂乱的下标/指针访问这种, 应当避免. 因为默认是一致的. 杂乱的访问会导致访存被拆分成多次请求, 严重降低效率.这是local memory的用途一.用途二则是, 方便编译器安排一些无法有效的放入寄存器, 例如当前阶段寄存器资源用的太多了, 或者一些访存方式(例如对寄存器试图进行下标索引---N卡不支持这种), 不能放入.

所以这是为何今天手册说, 对局部的数组的非编译时刻能确定的下标访问, 会被放入local的原因. 也就是动态的下标访问.所以我们其实是可以用数组的, 只要(1)数组别太大, 或者很大, 但是每段代码使用的热点明显. (2)下标是静态的, 编译时刻能确定的. 则往往数组也会整体或者其中的部分元素, 被编译器安排到寄存器中.寄存器和local memory中的内容的交换, 是一个动态的过程。某些时刻某个变量可能在寄存器中, 但下一时刻它可能在local中, 根据不同代码位置的寄存器压力, 或者其他因素所决定.好了.

到现在为止,我们已经说了shared memory和local的内容, 这些都是相比CPU迁移过来的代码来说,所具有特色和需要优化的时候注意的东西. 建议总是小心对待.代码这玩意, 你先写对为主, 然后再考虑优化.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GPUS开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
DAY32:阅读local Memory
我们正带领大家开始阅读英文的《CUDA C Programming Guide》,今天是第32天,我们正在讲解性能,希望在接下来的68天里,您可以学习到原汁原味的CUDA,同时能养成英文阅读的习惯。 本文共计489字,阅读时间20分钟 Two-Dimensional Arrays A common global memory access pattern is when each thread of index (tx,ty) uses the following address to access
GPUS Lady
2018/06/25
6490
CUDA优化冷知识23|如何执行配置优化以及对性能调优的影响
这一系列文章面向CUDA开发者来解读《CUDA C Best Practices Guide》 (CUDA C最佳实践指南) CUDA优化冷知识22|测量Occupancy的三种方式 我们今天主要进行<CUDA Best Practices Guide>的章节10的剩余内容https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html#occupancy, 也就是接上一篇的occupancy后面,继续说说寄存器的延迟掩盖,blocks
GPUS Lady
2022/08/31
1.4K0
CUDA优化冷知识23|如何执行配置优化以及对性能调优的影响
CUDA优化的冷知识19|constant和寄存器
https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html 来阅读原文。
GPUS Lady
2021/02/05
7020
CUDA优化的冷知识15|纹理存储优势(1)
https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html 来阅读原文。
GPUS Lady
2021/02/05
7940
DAY33:阅读Share Memory和Constant Memory
Shared Memory Because it is on-chip, shared memory has much higher bandwidth and much lower latency than local or global memory. To achieve high bandwidth, shared memory is divided into equally-sized memory modules, called banks, which can be accessed si
GPUS Lady
2018/06/22
5730
CUDA优化的冷知识16|纹理存储优势(2)
https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html 来阅读原文。
GPUS Lady
2021/02/05
5070
CUDA优化的冷知识 3 |男人跟女人的区别
https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html 来阅读原文。
GPUS Lady
2021/01/06
7910
CUDA优化的冷知识 3 |男人跟女人的区别
CUDA优化冷知识22|测量Occupancy的三种方式
这一系列文章面向CUDA开发者来解读《CUDA C Best Practices Guide》 (CUDA C最佳实践指南) CUDA优化冷知识21|occupancy越高越好么? CUDA优化冷知识20|不改变代码本身如何提升性能? 一般的来说, occupancy往往有个折中点, 过高了或者过低了性能都不好. (就如同你干得过少, 或者干得过累都不好一样). 好了, 我们有了occupancy的概念, 知道了无需一味的去追逐occupancy, 就已经是一个很大的胜利了. 我们下面将具体看一下, 如
GPUS Lady
2022/08/29
6580
CUDA优化冷知识22|测量Occupancy的三种方式
DAY37:阅读不同存储器的修饰符
我们正带领大家开始阅读英文的《CUDA C Programming Guide》,今天是第367天,我们正在讲解CUDA C语法,希望在接下来的63天里,您可以学习到原汁原味的CUDA,同时能养成英文阅读的习惯。 本文共计468字,阅读时间15分钟 B.2. Variable Memory Space Specifiers Variable memory space specifiers denote the memory location on the device of a variable. A
GPUS Lady
2018/06/25
7770
“暑”你当学霸|2022 CUDA线上训练营Day 2学员笔记分享
7月5日,2022 CUDA on Arm Platform线上训练营开始第二天的课程。 课程大纲: 1.     CUDA编程模型---CUDA存储单元的使用与错误检测(2.1+2.2实验课) Ÿ  设备初始化 Ÿ  GPU的存储单元 Ÿ  GPU存储单元的分配与释放 Ÿ  数据的传输 Ÿ  数据与线程之间的对应关系 Ÿ  CUDA应用程序运行时的错误检测 Ÿ  CUDA中的事件 Ÿ  利用事件进行计时 Ÿ  实验课内容:编写MatrixMul程序,体验线程和数据的对应关系 Ÿ  留课后作业 2. 
GPUS Lady
2022/07/06
6220
“暑”你当学霸|2022 CUDA线上训练营Day 2学员笔记分享
CUDA编程之存储模型
一般来说,应用程序不会在任何时间点访问任意数据或运行任意代码。程序获取资源是有规律的,也就是计算机体系结构经常提到的局部原则:时间局部性和空间局部性。
AI异构
2020/07/29
1.4K0
CUDA编程之存储模型
CUDA优化的冷知识13 |从Global memory到Shared memory
上一篇里我们说到目前我们能买到的新卡(例如RTX3070), 已经支持直接从global memory读取到shared memory了. 这是一个极好的特性. 是从友商AMD那里学来的特性。
GPUS Lady
2021/01/20
1.5K0
CUDA优化的冷知识13 |从Global memory到Shared memory
CUDA优化冷知识21|occupancy越高越好么?
这一系列文章面向CUDA开发者来解读《CUDA C Best Practices Guide》 (CUDA C最佳实践指南)
GPUS Lady
2021/03/12
1.7K0
DAY31:阅读global memory
我们正带领大家开始阅读英文的《CUDA C Programming Guide》,今天是第31天,我们正在讲解性能,希望在接下来的69天里,您可以学习到原汁原味的CUDA,同时能养成英文阅读的习惯。 本文共计652字,阅读时间20分钟 今天开始我们讲解GPU存储访问,需要花费2天。 今天我们的笔记内容是到目前为止最长的一次(可能后面会越来越长) 5.3.2. Device Memory Accesses An instruction that accesses addressable memor
GPUS Lady
2018/06/25
7860
CUDA优化的冷知识17|纹理存储优势(3)
https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html 来阅读原文。
GPUS Lady
2021/02/05
4630
旷视MegEngine TensorCore 卷积算子实现原理
2020年5月Nvidia发布了新一代的GPU架构安培(Ampere)。其中和深度学习关系最密切的莫过于性能强劲的第三代的TensorCore,新一代的TensorCore支持了更为丰富的DL(Deep Learning)数据类型,包括了新的TesorFloat-32(TF32),Bfloat16(BF16)计算单元以及INT8,INT4和INT1的计算单元,这些计算单元为DL推理提供了全面的支持。
Amusi
2021/06/09
2.3K0
旷视MegEngine TensorCore 卷积算子实现原理
DAY56:阅读Dynamic Global Memory Allocation and Operations
Dynamic global memory allocation and operations are only supported by devices of compute capability 2.x and higher.
GPUS Lady
2018/08/01
5730
DAY56:阅读Dynamic Global Memory Allocation and Operations
CUDA优化的冷知识 5 | 似是而非的计时方法
https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html 来阅读原文。
GPUS Lady
2021/01/06
1K0
CUDA优化的冷知识 5 | 似是而非的计时方法
【知识】详细介绍 CUDA Samples 示例工程
CUDA 是“Compute Unified Device Architecture (计算统一设备架构)”的首字母缩写。CUDA 是一种用于并行计算的 NVIDIA 架构。使用图形处理器也可以提高 PC 的计算能力。
小锋学长生活大爆炸
2024/06/28
2.2K0
【论文解读】基于MLIR生成矩阵乘法的高性能GPU代码,性能持平cuBLAS
本文是对 https://arxiv.org/abs/2108.13191 这篇论文进行解读,学习一下如何基于MLIR编译器基础设施生成高效的GPU代码。本文的阅读的先后顺序分别为:
BBuf
2022/04/06
2.7K0
【论文解读】基于MLIR生成矩阵乘法的高性能GPU代码,性能持平cuBLAS
相关推荐
DAY32:阅读local Memory
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档