通过编译器与大语言模型协作进行智能体代码优化(arXiv 2026)

原题:Agentic Code Optimization via Compiler-LLM Cooperation

一句话总结:ACCLAIM 让引导智能体在 C 源码、LLVM 中间表示和 x86 汇编三层选择模型改写或编译器 pass,并用自动生成测试筛掉错误候选;在 100 个 CodeNet 程序上相对 clang -O3 几何平均加速 1.25 倍,优于单层与等预算组合基线,但收益集中在少数程序,正确性仍只是有限测试而非翻译验证。

问题与动机

编译器擅长通用、确定且保语义的局部变换,却可能看不到需要理解算法意图的改写;大语言模型可以做高层算法变化,却在低层语言中频繁生成错误代码。已有工作通常只在一个抽象层优化,因此无法让模型改写与后续编译器优化相互启发。

ACCLAIM 将编译流水线本身变成智能体可调用的工具图,目标是在固定模型预算下寻找“模型改写—编译器降级或重写”的组合顺序。

关键观察 / 隐含假设

  • 观察 1:不同抽象层暴露不同优化机会。 模型可在源码或 LLVM 中间表示识别算法和 intrinsic,编译器再完成向量化等可靠变换(§2,图 2)。
    • 依赖假设:跨层改写存在协同,而非绝大多数收益都能在源码层获得。
  • 观察 2:低层生成的主要瓶颈是正确率。 每批至少一个正确候选的比例在源码层为 85%,LLVM 中间表示为 41%,汇编为 57%(§4.4,表 3)。
    • 依赖假设:编译、有限测试和参考输出足以剔除有害改写。
  • 观察 3:反馈循环比同预算平行采样更有效。 把更多预算用于根据失败测试继续修正,优于只扩大一次采样;总预算从 6 个层级调用提高到 18 个时,平均加速由 1.19 倍升到 1.25 倍(§4.5)。
  • 假设 1:竞赛程序代表值得优化的基础设施代码。 论文从 CodeNet 选取存在至少 10% 解法性能差的程序,这主动富集了优化机会。
    • 证据强度:弱。数据不含大型服务、并发、I/O、未定义行为和长期维护约束。

核心方法

引导智能体可调用 LLVM 前端、中端、后端,以及源码、LLVM 中间表示、x86 汇编三个专用优化智能体。编译器调用不计模型预算;专用智能体调用消耗一单位预算,允许重复调用和回退。预算耗尽时,系统把当前最佳高层程序交给常规编译器完成降级(§3.2–3.4,图 3)。

每个层级智能体并行生成候选,测试后保留最快的正确版本,再把编译错误或失败用例反馈给下一轮。测试智能体先根据原程序生成确定性输入脚本,每次产生 10 个边界正确性输入和 5 个跨数量级性能输入;候选输出与原程序比较(§3.5)。

设计取舍

  • 自由跨层编排:能够发现相位排序协同,但搜索空间大、模型成本高且难解释单层贡献。
  • 测试而非等价证明:通用且能提供具体反馈,却会漏掉稀有输入、未定义行为和数值差异。
  • 模型负责调度模型:减少手写启发式,但较弱模型常因工具调用格式错误而失败。
  • 边界条件:适合纯函数式、可快速执行并有参考实现的 CPU 程序;不直接适合外部状态、并发、实时或安全关键代码。

实验与结果

  • 从 CodeNet 清洗出 5,640 个有可测优化空间的 C 程序,主比较随机取 100 个;使用 LLVM 18.1.3、96 核 Xeon、Claude 3.7 Sonnet,每次最多一小时(§4.1–4.2)。
  • 相对 clang -O3,ACCLAIM 几何平均加速 1.25 倍;源码、LLVM 中间表示、汇编和单层组合基线分别为 1.18、1.04、1.03 和 1.02 倍(表 2)。
  • 中位数仅 1.10 倍,第 75 百分位 1.16 倍,第 99 百分位 16.97 倍;一个网格搜索程序因算法和内存分配改写达到 1,384 倍,显示均值受少数长尾胜例影响(§4.3,图 4–5)。
  • 引导智能体会回到更高层重新开始;源码、LLVM 中间表示和汇编智能体被重复调用的比例分别为 42%、9% 和 38%(§4.4)。

论断—证据表

论断证据评测边界置信度
跨层协作优于单层优化表 2:1.25 倍,最佳单层 1.18 倍100 个经过机会富集的 CodeNet C 程序中到强
低层生成受正确率限制表 3:正确批次比例 41%–57%,源码为 85%Claude 3.7 Sonnet、固定采样设置
更多反馈预算继续改善结果§4.5:1.19 倍→1.25 倍预算只测两个主要点,成本未统一换算
输出程序保持语义§3.5:自动输入脚本与参考输出比较每轮 15 个输入;无完整等价证明

批判性分析

论证链条

同预算单层和组合基线能隔离“跨层编排”收益,分析也承认源码层贡献最大。论文最脆弱的跳步是把“测试通过”视作约束满足:引导智能体能反复适应测试生成器,仍可能留下未测行为差异。

假设压力测试

CodeNet 程序短、接口封闭且参考实现可运行。系统代码中的线程交错、文件系统状态、系统调用副作用、浮点误差与长期 ABI 兼容无法用 15 个输入覆盖。若源码优化已吃掉大部分机会,跨层智能体的额外成本可能不值 7 个百分点的几何平均增益。

实验可信度

统一预算和 clang -O3 强基线较公平;随机取样只来自预筛的“有性能差异”集合,会高估普通代码库命中率。最强 1,384 倍案例反映原程序明显低效,不代表常见编译器缺口。

系统性缺陷

每个程序需要大量模型调用,成本随源码长度增长。没有处理沙箱逃逸、资源耗尽、编译器未定义行为、跨平台重现和生成补丁的可维护性。模型与编译器版本变化也会改变搜索轨迹。

局限与后续工作

  • 局限 1:只有 CPU、C、LLVM 和 x86;数据集是竞赛程序而非生产服务。
  • 局限 2:正确性依赖测试,论文自己建议用 Alive2 等翻译验证替换测试智能体。
  • 后续工作 1:在大型开源系统的热点函数上,以隐藏模糊测试、翻译验证、跨编译器与跨架构重放共同检查语义。
  • 后续工作 2:报告每个成功加速的模型调用成本和盈亏平衡执行次数,判断离线搜索是否值得。

相关