逸翎清晗🌈
CINM (Cinnamon): A Compilation Infrastructure for  Heterogeneous Compute In-Memory and Compute  Near-Memory Paradigms
【存算一体编译·I】CINM (Cinnamon): A Compilation Infrastructure for Heterogeneous Compute In-Memory and Compute Near-Memory Paradigms 本文来源于 ASPLOS2024,德国德累斯顿大学发表的存算一体编译论文。(QS 173) 摘要:数据密集型应用的兴起暴露了传统以处理器为中心的冯·诺依曼架构在满足片外内存带宽需求方面的局限性。因此,近来计算机体系结构领域提出了计算-内存融合(compute-in-memory, CIM) 和近内存计算(compute-near-memory, CNM) 等非冯·诺依曼范式,在性能和能耗方面均实现了数量级的提升。尽管过去几年中取得了显著的技术突破,这些系统的可编程性依然是一大挑战——其编程模型过于低级,且高度依赖特定系统实现。鉴于未来此类架构预计将呈现高度异构的特征,开发新型编译器抽象和框架势在必行。为此,我们提出了 CINM(Cinnamon),这是首个端到端的编译流程,它通过分层抽象对不同的 CIM 与 CNM 设备进行统一建模, ...
后端Pass简介——InterferenceCache
InterferenceCache 这个 Pass(InterferenceCache)的主要功能是为寄存器分配阶段 缓存每个基本块(MachineBasicBlock)中“活跃区间”(LiveIntervalUnion)对某个物理寄存器的干扰信息,以便后续多次查询时能快速返回结果,而不必每次都从头遍历整个区间。 首先澄清一下,这依然是 LLVM 寄存器分配的辅助文件,这个 Cache 指的是各个寄存器生命周期的干涉情况,即生命周期有重叠。通过维护这个数据结构来避免每次都要分析干扰图。
Compiler Technologies in Deep Learning Co-Design: A Survey
【综述解析·II】Compiler Technologies in Deep Learning Co-Design: A Survey 领域:计算机科学→软硬件协同→编译器 本文涉及的资源: https://buddycompiler.com/ https://github.com/buddy-compiler/buddy-mlir https://github.com/buddy-compiler 摘要: 随着深度学习应用的快速发展,通用处理器已难以满足深度学习工作负载的需求,摩尔定律的消退加剧了这一趋势。因此,面向领域的设计迎来了计算机体系结构创新的黄金时代,同时也催生了对新型编译技术日益增长的需求,以促进跨层次优化。从历史上看,硬件与软件一直以来都是协同设计的。时至今日,这种协同设计理念仍然在深度学习领域的学术界与工业界发挥着重要作用,且其涵盖的范围不断扩展并深化多个维度和层次。在本研究中,我们详尽阐述了过去与近期在深度学习编译器与协同设计方面的相关工作,重点探讨两者结合的方法——我们认为,这正是新一代深度学习时代的主流趋势。在总结现有编译技术与协同设计方案后,我们提出了 ...
后端Pass简介——InlineSpiller
InlineSpiller 这算是后端一个较为大型的 Pass 了,有 1700 多行。但是严格来说它只是一个辅助文件,隶属于寄存器分配模块。 这个 Pass 一看又是涉及了一大堆概念,它是 LLVM 寄存器分配阶段中的一个专门化 Spiller,它绕过 VirtRegMap 默认的 spill/restore 逻辑,直接在 MachineFunction 中插入 spill 和 reload 指令,以便后续的“内联”内存操作折叠(memory operand folding)和 spill 提升(hoisting)等优化能够生效。 如果没有深入研究过后端的话,不妨先看一下如下一些概念: 寄存器分配(Register Allocation) 编译器后端要把“无限”的虚拟寄存器映射到“稀缺”的物理寄存器上。分配失败时,需要把某些值暂存到栈上(spill)再在用到时 reload 回来。 LiveInterval / LiveRange 描述某个虚拟寄存器在程序中存活(“活跃”)的区间。LiveIntervals 管理所有虚拟寄存器的活跃区间,用来指导寄存器分配和 spill ...
Automated Program Repair: Emerging Trends Pose and Expose Problems for Benchmarks
【综述解析·I】Automated Program Repair: Emerging Trends Pose and Expose Problems for Benchmarks 领域:计算机科学→软件工程→程序分析与程序维护、APR、Benchmarking、Evaluating 摘要: 机器学习(ML)已经渗透到自动程序修复(APR)领域。各类算法使用神经机器翻译和大型语言模型(LLM)来生成软件补丁等。但这些 ML 应用与早期工作存在重要差异,使得确保其结果有效且具备泛化能力变得更加复杂。一个挑战在于,现行最流行的 APR 评测基准并非为 ML 技术设计,尤其是对于 LLM,其庞大且往往未公开披露的训练数据集可能包含了评测中使用的问题实例。 本文回顾了自 2018 年以来在该领域五大顶级会议上发表的 APR 相关工作,重点关注包括 LLM 在内的 ML 模型的显著崛起等新兴趋势。我们从结构和功能两个维度对基于 ML 的文章进行了分类,并指出了这些新方法引发的多种问题。值得注意的是,由于现有评测基准在 ML 技术兴起之前设计,使用它们来验证基于 ML 的 APR 方案时,可能会 ...
后端Pass简介——InitUndef
InitUndef InitUndef 这个 MachineFunctionPass 的主要目的,是在寄存器分配阶段之前,把“undef” 或者 “NoReg” (表示隐含定义被故意绕过 MachineCSE 优化的占位符)这些“未初始化”或“占位”寄存器操作,转成真正的伪指令(INIT_UNDEF/IMPLICIT_DEF)来初始化,然后再把路径中可能只定义了部分子寄存器的情况,用插入子寄存器伪初始化的方式补全。这样做可以防止在遇到“early-clobber”(早占用)约束或者子寄存器活跃性分析时,寄存器分配器因输入是 undef 而分配到非法重叠寄存器导致崩溃或非法指令。 这段话涉及的知识盲区有点多,下面来讲解分析一下: 为什么要伪指令? 因为 undef 或 NoReg 并不是真正的定义,直接让寄存器分配器看到会导致它把未初始化的值当作有效源操作数,插入伪指令(INIT_UNDEF/IMPLICIT_DEF)就能在分配前显式地“初始化”这些虚拟寄存器,避免错误分配。 什么是 “early-clobber”(早占用)? 在指令定义操作数上打上 early-clobber 标记表 ...
后端Pass简介——IndirectBrExpandPass
IndirectBrExpandPass 此 Pass 将近 300 行。 这个 Pass主要用来将 LLVM IR 中的 indirectbr 指令展开成等价的 switch 指令,方便那些目标架构不直接支持间接跳转(indirect branch)或希望通过内建的 switch lowering 来生成代码时使用。 我们知道,indirectbr 用于 LLVM IR 中的间接跳转,目标不是固定的标签,而是一个运行时计算得到的地址。 那么可以看一下如下的例子,假设有这样一段伪 IR: ; 原始 IR:两个基本块 A 和 B,各自都有一个 indirectbr entry: %addr = ; 某种方式得到要跳转到 A 或 B 的地址 indirectbr %addr, [label %A, label %B] foo: ; 又一处间接跳转 %addr2 = … indirectbr %addr2, [label %A, label %B] 经过 IndirectBrExpandPass 处理后,大致会变成: ; 为 A 分配编号 1,为 B 分配编号 2 ...
后端Pass简介——ImplicitNullChecks
ImplicitNullChecks 800 多行的 Pass 这个 LLVM 后端 MachineFunctionPass —— ImplicitNullChecks,是一个非常经典的优化 Pass:**将显式空指针检查转换为隐式的 faulting load/store,从而减少分支指令、提升执行效率。将显式的“test ptr, ptr → je throw → load(ptr)”模式折叠成一个带故障跳转的内存访问指令,利用页面保护在发生空指针访问时隐式触发异常处理,从而消除多余的 null check。 下面是涉及的概念: 显式 vs 隐式 Null Check: 可以先看一下汇编层面是怎么做显示 Null Check 的: test %r10, %r10 je throw_npe movl (%r10), %esi 在访问内存前先通过 test检查是否为 null,手动跳转。 隐式的 Null Check 如下: faulting_load_op("movl (%r10), %esi", throw_npe) 不判断,直接执行内存访问,若触发 page fau ...
后端Pass简介——GCRootLowering
GCRootLowering 这个代码实现的是 LLVM 中的垃圾回收 (GC) 支持的一部分,主要围绕 gc.root 机制的 lowering(降层转换) 和 元数据分析,它分为两个核心 Pass。 涉及的概念有: GC Root:程序运行中存活对象的可达起点(如局部变量、参数、静态字段)。 Intrinsic 含义 llvm.gcroot 声明某个 alloca 是 GC 根(root) llvm.gcread 从 GC 管理对象中读取字段 llvm.gcwrite 向 GC 管理对象中写入字段 GCMachineCodeAnalysis ✅ 功能: 分析目标指令级别的函数,插入 safe point(用于 GC 暂停和扫描的安全位置); 确定所有 GC roots 的 栈上偏移量(stack offset),供后续生成精确 GC map; 设置整个函数的 frame size 元信息。 在 LLVM 的 GC 策略(GCStrategy)中,有些语言或运行时系统(如 Java、.NET)依赖于精确 GC 信息,这些 Pass 就是将抽 ...
后端Pass简介——IfConversion.cpp
If conversion 这是一个很重要的大型 pass,代码量达到了 2300 余行。 他实现的是 LLVM 后端 MachineInstr 级别的 If Conversion Pass(即 if-converter): 此 Pass 的主要目标是将条件分支(br)转换为带谓词或条件执行的指令,借助目标架构对条件执行(predication)或条件移动(e.g. ARM 的 IT 指令组、x86 的 CMOVcc)支持,减少分支指令,降低分支错判开销。 适用场景如下: Diamond 结构:针对以下基本块布局进行转换: [Entry] | Branch / \ TrueBB FalseBB \ / MergeBB 核心处理函数如下: bool IfConverter::runOnMachineFunction(MachineFunction &MF) { if (skipFunction(MF.getFunction()) || (PredicateFtor && ! ...
后端Pass简介——Hardware loops
Hardware loops 这个 pass 有 608 行 这个 HardwareLoops Pass 的主要作用,是在 LLVM 编译流程中把“普通的”软件循环转换成底层目标机器所支持的 硬件循环。 正好来区分一下软件循环和硬件循环: 软件循环例子: MOV R0, #0 ; i = 0 MOV R1, #n ; R1 保存 n loop_soft: CMP R0, R1 ; 比较 i 和 n BGE end_soft ; 若 i >= n,跳出 ; ——— 循环体 ——— ADD R0, R0, #1 ; i = i + 1 B loop_soft ; 跳回比较 end_soft: 硬件循环(hardware loop): 原理:利用处理器提供的==专门指令或内建硬件计数器来管理循环迭代次数==。编译器在循环外一次性设置好迭代次数,循环内部不用再做显式比较和计数器更新,硬件在每次迭代结束时自动递减并判断是否继续。 迭代逻辑放到专门的 ...
后端Pass简介——GlobalMergeFunctions
GlobalMergeFunctions 600 行 GlobalMergeFunc 是 LLVM 中的一个 ModulePass,旨在识别并合并在模块或跨模块范围内功能等价或高度相似的函数,从而去重并减小生成代码体积。它通过结构化哈希算法对函数进行比较,忽略可参数化的常量操作数,然后为差异化的常量生成额外参数,最终创建单一的合并函数并用 thunk 保持原始接口不变。该过程既支持本地合并,也能借助 CGData 在 LTO 阶段执行跨模块的乐观合并。 thunk:Thunk(有时也直译为“馅饼”或“跳板”)是一个轻量级的包装函数,它本身不做实际业务逻辑,而是把调用“转发”(forward)给另一个目标函数。 结构化 hash:结构化哈希是一种对函数(或指令序列)结构进行“指纹”提取的算法,它考虑==指令的种类、控制流、操作数==类型等结构信息,而不是简单地对字节码或源代码做哈希。 STATISTIC(NumMergedFunctions, "Number of functions that are actually merged using func ...
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
本站访客数 :
本站总访问量 :
最后更新时间 :
空降评论复制本文地址
随便逛逛昼夜切换关于博客美化设置切换全屏打印页面