【CUDA】(七)调整指令级原语
(七)调整指令级原语
本篇笔记参考如下:
https://blog.csdn.net/gao_zhennan/article/details/120717424?ops_request_misc=elastic_search_misc&request_id=8a12ee6315cc5ba5c95b4dc10ccb3baf&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-120717424-null-null.142
本章重点介绍计算密集型应用。处理器的计算吞吐量可以用它在一段时间内执行操作的数量来衡量。因为GPU有很多SIMT指令和计算核心,所以其峰值计算吞吐量通常比其他的处理器要高。但并不是所有的指令都是平等的。如果结果不能正确收敛或没有获得预期的结果,那么程序运行速度再快也没有用。对应用程序的吞吐量和正确性进行优化时,理解不同低级原语的性能、数值精确度和线程安全性方面的优缺点是很重要的。
对于以下代码段
1double v ...
GEMM优化实战
本篇参考:
https://zhuanlan.zhihu.com/p/1910636263666610461
https://zhuanlan.zhihu.com/p/703256080
https://zhuanlan.zhihu.com/p/441146275
GEMM 算子详解
1 概念
从数学上讲,GEMM 描述的是一个非常基础的线性代数运算:
C=αA×B+βCC = \alpha A \times B + \beta C
C=αA×B+βC
其中:
AAA 是 M×KM \times KM×K 的矩阵。
BBB 是 K×NK \times NK×N 的矩阵。
CCC 是 M×NM \times NM×N 的结果矩阵。
α\alphaα 和 β\betaβ 是常数标量(通常 α=1,β=0\alpha=1, \beta=0α=1,β=0)。
深度学习中 90% 以上的计算量都来自矩阵乘法:
全连接层(Linear/FC):本质就是 GEMM。
卷积层(Conv2d):通过一种叫 im2col 的技术,卷积运算会被转化为 GEMM 运行,以利用 GPU 的极致算力。
...
【CUDA】(六)流和并发
(六)流和并发
本篇笔记参考如下:
https://blog.csdn.net/DevPath/article/details/155607318
在本章前,我们的关注点可能仅限于内核级的并发,在此级别的并发中,单一的任务或内核被GPU的多个线程并行执行。本章将研究网格级的并发。在网格级并发中,多个内核在同一设备上同时执行,这往往会让设备利用率更好。
6.1 流和事件概述
CUDA流是一系列异步的CUDA操作,这些操作按照主机代码确定的顺序在设备上执行。流能封装这些操作,保持操作的顺序,允许操作在流中排队,并使它们在先前的所有操作之后执行,并且可以查询排队操作的状态。
因为所有在CUDA流中排队的操作都是异步的,所以在主机与设备系统中可以重叠执行其他操作。在同一时间内将流中排队的操作与其他有用的操作一起执行,可以隐藏执行那些操作的开销。
CUDA编程的一个典型模式是以下形式:
1.将输入数据从主机移到设备上。
2.在设备上执行一个内核。
3.将结果从设备移回主机中。
在这些情况下,可
以完全隐藏CPU和GPU之间的通信延迟。通过将内核执行和数据传输调度到不同的流中,这些操作可以重叠 ...
【CUDA】(五)共享内存和常量内存
(五)共享内存和常量内存
本篇笔记参考如下:
https://blog.csdn.net/D1557329860/article/details/143813183?ops_request_misc=&request_id=&biz_id=102&utm_term=共享内存&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-2-143813183.142
通过安排全局内存访问模式,我们学会了如何实现良好的性能并且避免了浪费事务。未对齐的内存访问是没有问题的,因为现代的GPU硬件都有一级缓存,但在跨全局内存的非合并内存访问,仍然会导致带宽利用率不会达到最佳标准。根据算法性质和相应的访问模式,非合并访问可能是无法避免的。然而,在许多情况下,使用共享内存来提高全局内存合并访问是有可能的。
5.1 CUDA共享内存概述
GPU中有两种类型的内存:
板载内存
片上内存
全局内存是较大的板载内存,具有相对较高的延迟。共享内存是较小的片上内存,具有相对较 ...
【CUDA】(四)全局内存
(四)全局内存
本篇笔记参考如下:
https://blog.csdn.net/weixin_33298352/article/details/156397919?ops_request_misc=&request_id=&biz_id=102&utm_term=统一内存&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-156397919.142
https://face2ai.com/CUDA-F-4-5-使用统一内存的向量加法/
在本章,我们将剖析核函数与全局内存的联系及其对性能的影响。通过分析不同的全局内存访问模式来实现通过核函数高效地利用全局内存。
4.1 CUDA内存模型概述
内存的访问和管理是所有编程语言的重要部分。因为多数工作负载被加载和存储数据的速度所限制,所以有大量低延迟、高带宽的内存对性能是十分有利的。
4.1.1 内存层次结构的优点
应用程序不会在某一时间点访问任意数据或运行任意代码。应用程序往往遵循局部性原则,这 ...
论文分享:Adaptive Auto-Tuning Framework for Global Exploration of Stencil Optimization on GPUs
论文分享:Adaptive-Auto-Tuning-Framework-for-Global-Exploration-of-Stencil-Optimization-on-GPUs
1 概述
GSTuner:自适应自动调优框架,可以高效地确定模板计算在GPU上的全局优化空间的最佳参数设置。
实现步骤如下:
程序生成 (Generation):首先生成满足对称邻域访问模式的随机模板程序,为后续训练提供多样化的样本。
模型训练 (Training):通过特征提取和数据预处理,统一不同优化组合(OC)的特征向量长度,训练用于预测性能的回归模型。
空间采样 (Sampling):不再盲目搜索,而是利用预测模型指导采样。根据“配额奖励政策”动态调整不同优化组合的采样比例,优先探索潜力区域 。
演化搜索 (Search):在缩小后的空间内,利用定制的遗传算法进行最终搜索。该算法以“子群相似度”作为终止条件,从而降低计算开销。
核心贡献:
全局探索能力:不同于以往仅针对特定优化组合(OC)的工具,GSTuner 分析了不同优化选择对性能的综合影响,并验证了参数设置对网格尺寸的自适应性 。
特 ...
论文分享:Moirae Generating High-Performance Composite Stencil Programs with Global Optimizations
论文分享:Moirae: Generating High-Performance Composite Stencil Programs with Global Optimizations
1 概述
模板计算:
7点模板(3D):在三维空间中,访问中心点及其上下、左右、前后的6个邻居。
27点模板(3D):访问一个 3×3×33\times3\times33×3×3 立方体内的所有点。
由于物理模型越来越复杂,现在的计算不再是跑一个简单的公式,而是由一系列相互依赖的模板操作构成的有向无环图(DAG),这就是所谓的复合模板(Composite Stencil)
Moirae框架:将图优化(如算子融合)与内核优化(如分块、流处理)结合在一起,处理由多个相互依赖的模板构成的有向无环图(DAG),认识到图优化和内核优化之间存在复杂的相互影响,因此通过搜索全局优化空间来寻找最优组合,避免陷入局部最优。该框架能够生成具有最优全局优化的复合模板高性能代码。
论文将复合模板的性能优化分为两类:图优化和核函数优化。图优化将多个模板融合到单一GPU内核中,利用模板间局部性,而内核优化则高效地将融合后的 ...
论文分享:Constraint-Driven Auto-Tuning of GEMM-like Operators for MT-3000 Many-core Processor
论文分享:Constraint-Driven-Auto-Tuning-of-GEMM-like-Operators-for-MT-3000-Many-core-Processor
1 概况
1.1 工作内容
针对新一代天河超级计算机所使用的核心芯片——MT-3000 众核处理器,进行“类 GEMM”算子优化的工作。
文中提出了一种 DynaChain 的深度学习(DL)算子编译优化框架,专门针对 MT-3000 这样的异构众核架构。
核心设计原则:计算与访存分离
1. 计算与访存解耦 (Decoupling Computation and Data Movement)
原理: 它将算子的“计算逻辑”与“数据搬运逻辑”分开处理。
作用: 这样可以独立优化这两者,从而在整个算子调度过程中最大限度地实现数据的全局复用,减少昂贵的内存访问开销。
2. 约束依赖链 (Constraint Dependency Chains)
原理: 在算子调度的搜索空间中,存在大量无效或次优的选项。DynaChain 通过引入“约束依赖链”来动态排除这些无效路径。
作用: 大幅缩小了优化算法的搜索空 ...
【CUDA】(三)CUDA执行模型
(三)CUDA执行模型
本篇笔记参考如下:
https://face2ai.com/program-blog/#GPU编程(CUDA)
本章内容概览:本章内容:
·通过配置文件驱动的方法优化内核
·理解线程束执行的本质
·增大GPU的并行性
·掌握网格和线程块的启发式配置
·学习多种CUDA的性能指标和事件
·了解动态并行与嵌套执行
3.1 CUDA执行模型概述
CUDA执行模型揭示了GPU并行架构的抽象视图,使我们能够据此分析线程的并发。
3.1.1 GPU架构概述
Fermi SM的关键组件:
·CUDA核心
·共享内存/一级缓存
·寄存器文件
·加载/存储单元
·特殊功能单元
·线程束调度器
示例图如下:
Blackwell的关键组件
CUDA 核心:
第五代张量核心:
新增/关键组件:这是 Blackwell 的核心进化点。
寄存器文件 :
用于存储线程状态和操作数。
Blackwell 维持了极大的寄存器规模,以支撑高并发的线程执行(尽管具体的 GB206 每个 SM 寄存器总量通常延续自上一代的 64K 或更高规格)。
共享内存/一级数据缓存:
采用 ...
【CUDA】(二)CUDA编程模型
(二)CUDA编程模型
本篇笔记参考如下:
https://zhuanlan.zhihu.com/p/681568740
https://blog.csdn.net/xierhacker/article/details/52744251?ops_request_misc=%257B%2522request%255Fid%2522%253A%25225a3632d0547e40669409db935762a62a%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=5a3632d0547e40669409db935762a62a&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-52744251-null-null.142
内容概览:
写一个CUDA程序
执行一个核函数
用网格和线程块组织线程
GPU性能测试
2.1 CUDA编程模型 ...





