逸翎清晗🌈
后端Pass简介——MachineCSE
MachineCSE MachineCSE 是 LLVM 后端用于在 SSA 机器指令级别进行 公共子表达式消除(CSE) 的优化 Pass,旨在通过识别重复的计算并替换为已有结果,从而减少指令数、降低寄存器/内存压力。 这个 Pass 的概念也非常简单,对应到中端,就是普通CSE。 该 Pass 将近 1000 行,可以使用 -aggressive-machine-cse 强制忽略收益判断,直接执行 CSE 操作。 该 Pass 依赖: MachineDominatorTreeAnalysis MachineBlockFrequencyAnalysis 主处理函数为: bool MachineCSEImpl::run(MachineFunction &MF) { TII = MF.getSubtarget().getInstrInfo(); TRI = MF.getSubtarget().getRegisterInfo(); MRI = &MF.getRegInfo(); LookAheadLimit = TII->get ...
后端Pass简介——MachineCopyPropagation
MachineCopyPropagation MachineCopyPropagation 是一个 LLVM 后端优化 Pass,用于删除冗余的寄存器 COPY 指令并尝试用原始源寄存器替换目标寄存器,从而提升机器码质量和执行效率。 COPY 指令:即 %r1 = COPY %r0,表示将一个寄存器的值复制到另一个寄存器,常由寄存器分配后插入。 还有一些概念如下: 冗余 COPY:当一个 COPY 的目的寄存器没被改变,可以直接使用源寄存器替代。 前向传播(forward propagation):用 COPY 的源替换其目的的使用点。 后向传播(backward propagation):将使用者的定义替换为 COPY 中的目的。 下面来举个例子(前向传播): %r1 = COPY %r0 ... %r2 = ADD %r1, %r3 直接优化为: %r2 = ADD %r0, %r3 例子 2(冗余 copy 删除) %r1 = COPY %r0 ... %r0 = COPY %r1 ; 冗余的 COPY 在保证 %r0 ...
后端Pass简介——MachineCombiner
MachineCombiner 一个基于机器级 trace 度量,将多条指令合并为更高效指令序列的 LLVM 机器指令合并优化 Pass。对应的中端 Pass 就是 InstCombiner。但是该 Pass 的逻辑比较简单,只有六百多行。 基本概念如下: 目标:在不延长关键路径、不增加资源压力(或优化代码体积)的前提下,将可组合的指令序列(如 MUL+ADD)替换为单条复合指令(如 MADD),以提高生成代码的执行效率或减小代码体积。 依赖分析:利用 MachineTraceMetrics 提供的“深度(Depth)”、“延迟(Latency)”和“Slack”信息,评估新旧指令序列对关键路径的影响。 资源分析:基于调度模型(TSchedModel)和硬件资源模型,比较合并前后资源使用长度(Resource Length)。 启发式:优先尝试减少关键路径深度,再尝试减少资源长度;在代码大小优化模式下,只要新序列短即替换;在循环中若检测到吞吐模式也可替换。 最简单的例子就是一个 FMA 指令: ; 原始序列 MUL r1, r2, r3 ; 乘法 ADD r4, ...
后端Pass简介——LiveDebugVariables
LiveDebugVariables 该文件比较重要(2000 行),是 LLVM 后端中用于 调试信息维护与更新 的重要组件。它实现了 LiveDebugVariables 分析器,主要用于在 寄存器分配过程中追踪用户变量的位置,确保最终生成的调试信息是准确的。 背景 在现代编译器后端,为了支持源级调试,需要在目标机器指令中准确地描述“用户级变量(user variable)”在程序执行过程中所处的位置(寄存器或内存)。LLVM 在中间阶段使用 DBG_VALUE 指令来标记变量 “此时保存在虚拟寄存器” 的位置,但在寄存器分配(Register Allocation)之后,虚拟寄存器通常被映射到物理寄存器或被“溢出”(spill)到栈槽(stack slots)。如果不做额外处理,原有的 DBG_VALUE 信息将不再准确,导致调试器无法正确地定位变量。 核心概念 DBG_VALUE 指令 LLVM Machine IR 中的一种伪指令,用于描述“用户变量此刻存储在哪个寄存器或栈槽中”。 形如 DBG_VALUE <loc>, <var metadata> ...
Optimization Techniques for GPU Programming
【综述解析·III】Optimization Techniques for GPU Programming(推荐)(上) 本文是一篇 CSUR长文,80 页,≈450文献整理而成。作者来自阿姆斯特丹自由大学,QS209. 本文前四章营养较少,可以从第五章看起,核心是第六章,涉及的干货也很多,是我读过的 GPU 相关的最全的综述。 本文分两部分(正文+附录),这篇只放正文。 摘要: 在过去十年中,图形处理器(GPU)在高性能计算领域中发挥了重要作用,并持续推动物联网、自动驾驶和百亿亿次计算等新兴领域的发展。因此,深入理解如何高效地挖掘这些处理器的性能具有重要意义,而这并非易事。本文综述了过去14年中发表的450篇相关文献,系统梳理了其中提出的各类优化技术。我们从多个视角对这些优化策略进行了分析,结果表明各类优化手段之间存在高度关联性,这也凸显了诸如自动调优等技术的必要性。 一、引言 图形处理器(GPU)在过去数十年间彻底改变了高性能计算(HPC)的格局,并被认为是近年来人工智能(AI)领域取得诸多进展的重要推动因素。GPU 最初作为游戏图形处理的专用处理器而诞生,随后被适配为高性能计 ...
后端Pass简介——LazyMachineBlockFrequencyInfo
LazyMachineBlockFrequencyInfo 该文件定义了一个懒惰(Lazy)地计算 Machine Block Frequency(机器块频率) 的分析 pass,等到有客户端明确请求该信息时进行计算。 注意该文件不是计算 MBB Freq,而是封装 Lazy 的逻辑,具体文件逻辑在MachineBlockFrequencyInfo.cpp,将在之后叙述。
后端Pass简介——KCFI
KCFI 这个 Pass 就一百多行,含义就是:在内核代码的间接调用前插入控制流完整性检查(Control-Flow Integrity, CFI)指令,以提高安全性。 实现 Kernel Control-Flow Integrity (KCFI) 的功能 —— 在执行间接函数调用(如通过函数指针调用)之前插入一个检查指令,验证被调用目标是否匹配预期的类型。 背景 控制流完整性是一种编译器和运行时技术,旨在防止攻击者通过劫持程序的控制流(比如通过函数指针、虚函数表、返回地址等)来执行恶意代码。 攻击者通常利用内存漏洞(如缓冲区溢出、Use-after-free 等)修改代码中用于间接跳转的数据(如函数指针),从而劫持控制流,达到执行任意代码的目的。 KCFI(Kernel Control-Flow Integrity) 是 LLVM 项目为 Linux 内核引入的一种轻量级、可部署的控制流完整性机制。它专注于防护 内核中的间接函数调用,如: void (*handler)(void) = some_func; handler(); // 间接调用 攻击者若能修改 handler 指针, ...
后端Pass简介——JMCInstrumenter
JMCInstrumenter JMCInstrumenter Pass 会在每个有调试信息的函数入口处插入一次对 __CheckForDebuggerJustMyCode 的调用,并自动生成默认实现和标志全局变量,以支持“Just My Code”调试。 背景:当我们在 IDE(如 Visual Studio)或调试器里调试本地 C/C++ 代码时,经常只关心“自己写的业务逻辑”——而不想单步进入运行时库、编译器插桩或 STL 之类的实现细节。微软在 MSVC 下把这个功能叫作 “Just My Code” (JMC);LLVM 也支持类似的体验。为此,需要在编译产出的机器码里“打标签”,告诉调试器「这些指令是用户代码/这些不是」,于是就有了 JMCInstrumenter 这个 Pass:它在每个函数入口插入一次钩子调用,runtime/debugger 就据此区分用户与非用户代码。 Just My Code (JMC):调试特性,用来区分“用户自己写的代码”与运行时/库代码。 假设有个用户函数放在 src/foo.c: ; 原始函数 define i32 @foo(i32 ...
Optimizing Deep Learning Inference Efficiency  through Block Dependency Analysis
【AI 编译·II】Optimizing Deep Learning Inference Efficiency through Block Dependency Analysis 本文选自 ASPLOS’25,来自计算所谭光明研究员和孙凝晖院士。领域为 AI 编译→算子优化→算子融合→线程块级算子优化 摘要: 深度神经网络(DNN)中的算子间优化依赖于精确的数据依赖关系分析。传统的机器学习编译器(MLC)通常在元素级或算子级执行静态数据依赖分析,然而这种方式存在两大关键局限性:其一,复杂的依赖关系阻碍了高效的跨算子优化;其二,可并行计算部分未被识别,导致 GPU 资源未被充分利用。为解决上述问题,我们提出了 BlockDepend,一种全新的机器学习编译框架,通过 块级(block-level)依赖分析打破现有瓶颈。BlockDepend 通过分析编译流程中的低层阶段,提取关键的块级依赖信息,从而简化算子之间的复杂关系,发掘被隐藏的并行计算机会。这一机制使得编译器能够采用更具针对性的优化策略,提升内存访问效率,并增强 GPU 的利用率。实验结果表明,BlockDepend 在多个工 ...
后端Pass简介——InterleavedLoadCombine
InterleavedLoadCombine 该 Pass将同一基本块中访问连续内存的多个 interleaved load(交错加载)合并成一次宽度更大的 load,再通过 shufflevector 提取原始值,提高性能。 其中: Interleaved Load(交错加载):多个 load 访问同一 base pointer 的不同偏移(例如 A[i], A[i+2], A[i+4])。 ShuffleVectorInst:从一个向量中重排元素(或从两个向量选择元素)的指令。 Polynomial 表示法:将 GEP 等指针偏移表达为多项式形式,以推理它们之间的等价性或相对偏移。 InterleavedAccessPass:后续的 pass 会识别 load + shufflevector 组合进行向量化。 也就是说,如果一组离散的 load 拥有同一个基址,则把他们 shuffle 合并起来。 例子也很简单,优化前: %a = load <4 x float>, ptr %p %b = load <4 x float>, ptr %p+16 %c = shu ...
Mosaic: Exploiting Instruction-Level Parallelism on Deep Learning Accelerators with iTex Tessellation
【AI 编译·I】Mosaic: Exploiting Instruction-Level Parallelism on Deep Learning Accelerators with iTex Tessellation 本文选自 ASPLOS’25,计算所国重实验室郭崎组的论文。作者单位包括腾讯,寒武纪。元信息见最后。 概述 这篇论文提出了 Mosaic,一种面向深度学习加速器(DLA)的 自底向上、基于镶嵌(tessellation)的编译器框架。论文的动机在于当前主流深度学习编译器大多采用自顶向下的平铺(tiling)方法,只能生成同构指令映射,难以充分挖掘指令级并行性(ILP),尤其在 CUDA Core 与 Tensor Core 协同场景中表现受限。 Mosaic 的核心创新包括: 提出 iTex 抽象,形式化描述单条指令的计算语义; 构建派生与变换 iTex,从而实现任务空间与指令空间之间的灵活映射; 提出启发式镶嵌算法,结合 independent 与 reduction tessellation 实现异构指令映射; 在代码生成与调度阶段,通过 zig-zag 执 ...
后端Pass简介——InterleavedAccessPass
InterleavedAccessPass 这个 Pass(Interleaved Access Pass)的主要作用是在 LLVM 的中间表示(IR)层面识别“交错”内存访问模式(interleaved accesses),并把它们转成目标平台(例如 AArch64、ARM、X86 等)所能高效实现的向量化内置函数(intrinsics)。 所涉及的概念如下: 交错内存访问(Interleaved Access) Interleaved Load:一次宽向量 load 后,通过多次 shuffle(shufflevector)将“偶数位/奇数位”或多路子向量分离。 Interleaved Store:先将多条子向量通过 shuffle 重排成交错格式,再 store 回内存。 向量重排指令(ShuffleVector)与掩码(Mask) De-interleave Mask:例如 <0,2,4,6>、<1,3,5,7>,用于从宽向量中提取交错后的每一路。 Re-interleave Mask:例如 <0,4,1,5,2,6,3,7>,用于 ...
avatar
💦非常忙碌!
逸翎清晗🌈
Talk is cheap, show me the code.💎
GitHub
公告栏
--- 主域名 ---
www.yangzi.world | yangzi.world
推荐实用资料工具目录
yangzi.world/pages/opensources.html
--- 旅游分享 ---
🍧yangzi.world/iternery/index.html
--- 安卓APP ---
🍧点此下载🍧

最新文章
公开数据
文章数目 :
222
本站总字数 :
46.4w
本站访客数 :
本站总访问量 :
最后更新时间 :
空降评论复制本文地址
随便逛逛昼夜切换关于博客美化设置切换全屏打印页面