发表时间: 2025-11 · arXiv:2511.12638 (Stanford, Microsoft Research India, Google DeepMind)
原文: https://arxiv.org/abs/2511.12638
作者/机构: BENJAMIN DRISCOLL (Stanford University), KSHITIJ DUBEY (Microsoft Research), ANJIANG WEI (Stanford University), NEERAJ KAYAL (Microsoft Research), RAHUL SHARMA (Google DeepMind), ALEX AIKEN (Stanford University)
一句话结论 本文提出了首个针对机器学习GPU内核的等价性检查器Volta,通过带数据竞争检测的符号执行和实数域上的指数多项式判定算法,成功验证了由人工、大语言模型和编译器生成的高度优化内核与参考实现之间的数学等价性。
要解决什么问题 在大型语言模型推理和训练中,GPU计算内核(Kernel)是性能优化的核心目标。为了榨干硬件算力,工程师、编译器甚至大语言模型会生成极其复杂的优化内核(例如使用在线计算替代共享内存的FlashAttention)。然而,证明这些优化内核与朴素参考实现“完全等价”面临着三个难以逾越的机制卡点。首先,GPU编程依赖海量线程间的细粒度同步(如线程块级别的 `syncthreads` 和线程束级别的 `syncwarp`),极易引入隐蔽的数据竞争和死锁。其次,浮点数运算(IEEE-754标准)不满足结合律,优化过程中的指令重排必然导致微小的数值差异,严格的位级别比对会直接拒绝绝大多数合法的激进优化。最后,机器学习内核中广泛存在指数运算(如Softmax),当提取出内核的计算逻辑后,现有的SMT求解器(如Z3)在处理包含指数的符号表达式等式判定时会直接超时或失效。缺乏形式化的验证工具,导致企业在部署激进优化的内核时只能依赖不完备的单元测试,承担极大的正确性风险。
怎么做的 为了绕开上述卡点,作者将验证范围限定在“结构化CTA(协作线程阵列)”类别的内核上。这类内核的线程数、张量大小静态已知,且内存访问地址不依赖于运行时数据(符合高效机器学习内核的最佳实践)。在这个前提下,Volta的核心思路是:将浮点数建模为理想的实数以屏蔽舍入误差,通过符号执行将内核展开为无分支的直线型代码,提取出输出张量元素的符号表达式,最后用定制的决策程序在数学上判定两个表达式是否等价。
该方法由两个关键部件构成。第一个部件是带竞争检测的符号执行模拟器。模拟器直接在底层的PTX汇编指令上运行,以轮询方式调度线程。为了检测数据竞争,模拟器维护了一个上下文 $\chi$,记录每个内存地址的读写历史以及尚未同步的线程集合。在执行内存读写前,模拟器会严格检查当前线程是否与历史读写线程存在同步屏障。如果两个线程对同一地址的访问(至少一个是写入)没有被同步原语隔开,模拟器会立即中止并报告数据竞争。
第二个部件是实数域上的决策程序。当符号执行顺利完成且无死锁或竞争时,模拟器会输出张量元素的符号表达式。为了解决SMT求解器无法处理指数运算的问题,作者提出了一种新的代数判定算法。对于包含实数加法、乘法和指数运算的表达式,判定两个程序等价即证明它们的差值为零。作者在理论上证明了以下形式的指数多项式等式的可判定性: $$ \sum_{i=1}^{m} p_{i}(\bar{x}) e^{h_{i}(\bar{x})} = 0 $$ 其中 $p_i$ 和 $h_i$ 是多元多项式。决策程序通过随机代入将多变量转化为单变量,并利用极限推导证明:只要上述等式成立,必定所有的多项式系数 $p_i(\bar{x}) = 0$。在工程实现上,Volta通过急切的常量折叠、哈希共用(hash-consed)和缓存机制,将复杂的表达式规范化为多项式的比例,从而极大地加速了等价性判定过程。
效果如何 实验在配备128核AMD EPYC处理器和995GB内存的服务器上进行,验证对象为NVIDIA PTX ISA 9.1汇编代码。对比基线包括最先进的GPU数据竞争静态分析工具FaialAA,以及广泛使用的Z3 SMT求解器。测试任务涵盖了人工优化的归约和注意力机制、大语言模型生成的2D卷积、以及TileLang编译器生成的矩阵乘法。
量化结果显示,Volta成功证明了采用在线Softmax和张量核心的FlashAttention(包含FA1和FA2)与朴素注意力实现的等价性。在求解包含指数运算的验证条件时,Z3求解器在所有注意力基准测试中均超时(大于300秒)或返回未知,而Volta得益于定制的规范化过程,其单元素求解中位数时间极低(普通Attention仅需1.3毫秒,FlashAttention系列约90毫秒)。在数据竞争检测方面,FaialAA由于无法跟踪具体变量值,会产生大量假阳性误报,而Volta通过符号执行积极传播常量,实现了零假阳性,并成功检测出了OpenMM和Megatron-LM历史提交中真实存在的数据竞争。此外,Volta还在大语言模型优化的2D卷积内核中,捕获了一个连NVIDIA官方检测工具都未报错的硬件级越界读取行为。该方法的局限性在于,它无法支持控制流依赖于运行时数据的内核(如 top-$k$ 或 argsort),且目前的实现尚未支持异步CUDA内置函数(如 `pipeline` 和张量内存加速器 `tma`)。
随着深度学习和大型语言模型(LLMs)的快速发展,企业在执行GPU计算内核上花费了巨大的成本。因此,这些内核成为了激进优化的主要目标。近年来,越来越多的工作利用LLMs来生成GPU内核(例如NVIDIA使用DeepSeek-R1,Stanford研究人员使用OpenAI o3等),但这些方法对生成的内核没有提供任何形式化的正确性保证。给定两个GPU内核——一个参考实现和一个优化后的对应实现,本文的核心研究目标是证明它们的扩展等价性(extensional equivalence),即证明它们在所有有效输入上产生相同的输出,从而验证优化实现的正确性。
由于GPU编程引入了海量线程之间细粒度同步的独特挑战,且优化通常会重排浮点算术操作导致微小的数值差异,目前文献中尚未存在针对GPU程序的等价性检查器。本文提出了首个针对GPU内核的等价性检查器,并用它形式化验证了由人工、LLM和编译器优化的机器学习(ML)内核的正确性。
本文的创新点与主要贡献包括:
动机示例分析:为了说明问题,考虑大型语言模型(LLMs)推理中的主要性能瓶颈——注意力机制中的softmax计算。朴素的参考实现(如CUDA代码)通常需要使用共享内存(shared memory)来存储中间指数值,并依赖 syncthreads 屏障原语来同步所有线程,确保所有共享内存的写入在任何线程继续之前都是可见的。而FlashAttention 【21, FlashAttention: Fast and MemoryEfficient Exact Attention with IO-Awareness, 2022 NeurIPS】中使用的在线softmax计算则避免了使用共享内存,通过维护运行时的最大值和归一化因子来实现数值稳定和内存高效的流式处理。这两种实现由于浮点舍入差异在位级别(bit-wise)上并不完全相同,但都旨在计算相同的数学表达式。概念上,等价性分析将softmax内核展开为每线程程序的列表(如包含4个线程的CTA),每个线程执行不包含分支或循环的直线型代码,且所有内存访问的地址都是静态已知的。通过执行简单的轮询调度(round-robin scheduling),分析器记录每个线程读取或写入的共享内存位置,若缺少屏障同步则报告数据竞争。如果没有数据竞争或死锁,符号执行器会为朴素实现和优化实现分别生成输出张量元素的符号表达式(包含实数上的指数和多项式运算),最后通过决策过程验证这些符号等式是否成立,从而得出两个程序是否语义等价的结论。
GPU同步操作机制:NVIDIA GPU支持独立线程调度,在缺乏显式同步的情况下,每个线程独立执行。基础同步原语是 syncthreads,它是一个跨越协作线程阵列(CTA,即线程块)内所有线程的屏障。另一个同步原语是 syncwarp,它在单个warp(32个线程)内的用户指定子集上运行,常用于张量核心(tensor cores)编程(如 wmma::mma_sync)。大多数先前的GPU内核验证技术仅支持 syncthreads,无法推理依赖warp级别同步的ML内核。本文考虑的同步机制是阻塞可用线程子集的屏障,不包括异步的生产者-消费者风格原语。
为什么选择结构化CTA(Structured-CTAs):为了使等价性检查可行,本文假设被分析的程序是结构化CTA。程序约束条件:要检查等价性,程序必须在已知数量的CTA和每个CTA的线程数上运行;每个CTA必须在大小静态已知的张量块上运行;在每个CTA的每个线程中,给定线程ID(tid),所有分支目标和内存访问中使用的地址必须是静态已知的;由于是CTA对CTA进行比较,不支持混合CTA职责的优化等价性检查。假设的合理性:这些假设反映了实现高GPU性能的既定最佳实践。例如,JAX框架仅允许固定维度的张量;高效的ML内核通常不做出真正的数据依赖的运行时决策。在这些假设下,每个单独线程执行的代码可以表示为直线型(无动态分支或循环)。不适用的内核:诸如 top-$k$/argsort 等控制流依赖于数据的内核不属于结构化CTA类别。浮点数处理原则:由于IEEE-754标准甚至不满足结合律,严格基于浮点算术的等价性检查会拒绝许多激进优化的内核。因此,Volta遵循与现有优化器相同的约定,将张量元素建模为实数(reals)进行处理。
结构化CTA语言$\mathcal{L}$的定义:为了形式化分析,作者开发了一种简单的结构化CTA语言 $\mathcal{L}$,它捕获了PTX(NVIDIA GPU的底层汇编)的相关方面。$\mathcal{L}$ 程序的语法由寄存器 $r$、常量 $c$、共享内存地址 $g$ 以及线程ID集合 $I$ 组成。作者通过一对小步语义关系为 $\mathcal{L}$ 赋予了动态特性:顶层配置 $( \mathcal{G}, \mathcal{R}, P )$ 包含共享内存映射 $\mathcal{G}$、寄存器文件映射 $\mathcal{R}$ 以及当前程序 $P$。
调度与同步规则:Schd 规则允许任何未阻塞的线程推进,模拟机器的非确定性执行。Sync 规则推进阻塞在同步屏障 $I$ 处的线程,前提是 $I$ 中的所有线程都处于 sync I 或 return 状态。当 $I = {1, \ldots, N}$ 时,它模拟 syncthreads;当 $I$ 是warp子集时,它模拟 syncwarp 或 mma.sync。如果两个线程在不同的集合上同步且存在交集,程序将陷入死锁(stuck)。
线程级执行规则:线程级小步关系定义了 Const、BinOp、RdReg、RdMem 和 WrMem,用于更新内存 $\mathcal{G}$ 和寄存器 $R$。算术运算符 $\oplus$ 被建模为黑盒纯函数,隐藏了内部可能的控制流。
数据竞争定义与上下文扩展:当两个内存访问中至少有一个是写入,且存在两种执行轨迹使得这两个访问的顺序可以互换时,就会发生数据竞争。为了在符号执行中检测竞争,作者将 $\mathcal{L}$ 的动态特性扩展为在发生竞争时返回错误值 $\perp$。具体而言,引入了一个额外的上下文 $\chi$,用于跟踪每个地址 $g$ 的内存事件(MemEvs):包括每个读取该地址的线程及其尚未同步的线程集合,以及最后写入该地址的线程及其尚未同步的线程集合。
竞争检测谓词:定义了谓词 noRacingRd(检查当前写入线程是否与所有先前的读取线程同步)和 noRacingWr(检查当前读取/写入线程是否与最后的写入线程同步)。
规则的细化:线程级读取规则 RdMem' 和写入规则 WrMem' 被修改为在执行内存操作前检查上述谓词,并相应更新上下文 $\chi$。Sync' 规则被修改为在同步发生时清除 $\chi$ 中对应的未同步记录。如果谓词检查失败,则通过 RdMemBad 或 WrMemBad 规则直接转移到错误状态 $\perp$。
合流性(Confluence)证明:等价性检查的健全性依赖于处理符号执行中调度引入的非确定性。作者在Agda证明助手中验证了核心引理(Lemma 1):对于所有程序,所有可能的调度要么产生相同的输出状态,要么报告数据竞争($\perp$),要么陷入死锁。这是通过证明自反闭包满足单步菱形属性(diamond property)来实现的,其中大部分情况归结为不同同步操作的交换律。
数据竞争与死锁检测的理论保证:
等价性检查的健全性与完备性:
支持的数学运算:决策程序支持包含实数加法、乘法和指数运算的表达式等式判定。虽然未形式化给出 max 和 min 的说明,但实现中通过规范化处理了这些操作(例如在softmax的最大值减法中)。
指数多项式等式的可判定性:作者证明了形式为 $f_1(x_1, \ldots, x_n) = f_2(x_1, \ldots, x_n)$ 的等式是可判定的,这等价于证明 $f_1 - f_2 \equiv 0$。
Volta架构与工作流:Volta是用Rust编写的概念验证工具。它接受PTX ISA 9.1编写的CTA代码,以及网格维度、张量位置和大小等参数。它由两个主要组件构成:执行符号执行生成验证条件(VCs)的模拟器,以及解析这些条件的决策程序。
符号执行的实现细节:
决策程序的实现细节:
bar.sync、bar.warp.sync、shfl.sync、activemask、ldmatrix、mma.sync 和 wmma。符号化支持加、乘、除、倒数、融合乘加、指数、最大值/最小值、浮点宽度转换、饱和和ReLU截断。不支持平方根或三角函数。人工生成的内核验证
LLM生成的内核验证
编译器生成的内核验证
数据竞争检测基线对比
M[tid]=tid; x=M[tid]; M[x]=... 的代码误报为数据竞争。Volta通过符号执行积极传播常量,避免了此类假阳性。此外,Volta成功检测出了OpenMM和Megatron-LM历史提交中真实存在的数据竞争,并证明了修复后代码的竞争自由。等价性检查基线对比
syncwarp。Weft 【67, Verification of Producer-Consumer Synchronization in GPU Programs, 2015 PLDI】处理了本文范围之外的生产者-消费者同步。Volta的数据竞争检查器优势在于其简单性和效率,它在线运行且只增加与指令数成正比的时间。本文提出了Volta,这是首个针对机器学习GPU内核的等价性检查器。Volta直接在底层PTX汇编上操作,利用已知的张量大小和线程ID来简化必须支持的表达式空间。Volta通过解释内核以获得每个输出张量元素的符号表达式,并使用专门的规范化过程检查隐含的验证条件。其健全性和完备性由本文给出的语义以及在Agda中验证的合流性定理保证。此外,本文还证明了实数上带有指数的多项式之间恒等式的可判定性。未来的工作方向包括支持异步CUDA内置函数,如 pipeline 和 tma。