ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

LLVM JIT 编译从入门到调优:3 个关键机制讲透

LLVM JIT 编译从入门到调优:3 个关键机制讲透 LLVM JIT 编译从入门到调优3 个关键机制讲透【免费下载链接】llvm-projectThe LLVM Project is a collection of modular and reusable compiler and toolchain technologies.项目地址: https://gitcode.com/GitHub_Trending/ll/llvm-project在 llvm-project 里JIT 编译Just-In-Time运行时才把代码编译成机器码不是单一组件而是一组可以各取所需的基础设施想交互式跑 C有基于 Clang 的 REPL想精细控制按需编译有 ORC 引擎想让已经编译好的二进制再快一截还有 BOLT 做二进制重排。下面挑三个新手最常问的问题逐个讲清楚。一、JIT 和 AOT 差在哪REPL 里的粘贴即运行怎么实现的传统 AOTAhead-Of-Time编译期就把代码编成可执行文件流程是写代码 → 编译 → 链接 → 运行。JIT 把编译 链接 执行挪到了程序运行过程中输入的是中间表示LLVM IR一种与硬件无关的中间码引擎当场把它译成目标架构的机器码直接放进内存执行。对使用者的最大差别是反馈速度。你可以在clang-repl里粘一行 C 表达式立刻拿到结果不用重新走整个编译链接流程。REPL 的数据流大致是八个阶段输入 → 增量解析 → 生成 AST → 可选的 AST 变换 → 降级为 LLVM IR → JIT 编译 → 执行 → 打印结果详见 ClangRepl 文档。这里值得注意两点。第一是增量REPL 不是每次重新编译全部输入底层用增量解析器只处理新输入的部分相关实现在 clang/lib/Interpreter/其中OrcIncrementalExecutor就是它和 ORC JIT 之间的桥梁。第二是多平台同一段 IRJIT 既可能落到 x86-64也可能通过 NVPTX 后端落到 GPUREPL 因此支持设备代码离载执行。跑起来很简单clone 仓库后构建一个 target 就行git clone https://gitcode.com/GitHub_Trending/ll/llvm-project cmake -DLLVM_ENABLE_PROJECTSclang .. cmake --build . --target clang-repl -j8 ./bin/clang-repl # 进入交互式提示符二、ORC JIT 的按需编译到底怎么按需ORCOn-Request Compilation按需编译是 llvm-project 里最通用的 JIT 引擎源码在 compiler-rt/lib/orc/。它回答的核心问题是一个程序引用的符号可能成百上千难道要在第一次执行前全部编译好答案是要哪个编哪个。ORC 把每个待执行单元抽象成一个 MaterializationUnit物化单元符号解析采用惰性求值某个函数第一次被调用时才触发它所属单元的编译、链接与重定位没被调用到的代码路径机器码根本不会生成。这套机制带来两个直接好处——冷启动快不需要预热整个二进制内存省只保留实际用到的代码页。从目录结构也能看出它的分层思路几个关键文件值得知道compiler.h把 LLVM IR 编译器接进 JIT 的入口resolve.cpp符号解析惰性编译的调度核心elfnix_platform.cpp/macho_platform.cppELFLinux 等与 Mach-OmacOS平台的内存映射、重定位实现reoptimize.cpp运行一段时间后可以拿性能采样数据对热点函数重新编译调优相当于编译完还能再编译一次。如果你自己写 JIT 工具从LLVMJITcompiler.h里的现成组合起步最省事它把编译层、符号解析层、运行时层已经组装好了。三、已经编译好的二进制还能再优化吗能。这就是 BOLTBinary Optimization and Layout Tool的定位不碰源码直接对可执行文件做基于执行剖面的代码布局重排——把热函数、热基本块挪到一起让指令缓存命中率更高、分支预测更准。对已经上线、来不及重编译的服务特别实用。它的标准工作流分三步先用 perf 采样再转成 BOLT 格式最后重排perf record -e cycles:u -j any,u -o perf.data -- ./your_program perf2bolt -p perf.data -o perf.fdata ./your_program llvm-bolt ./your_program -o out.bolt -dataperf.fdata优化效果好不好肉眼就能看。BOLT 的 heatmap 工具把采样数据按每 64 字节代码块渲染成彩色字符网格热点越密颜色越深可以直接对比优化前后的布局差异见 BOLT 热图文档、BOLT 项目说明。实践里有两个容易踩的坑一是采样必须开分支记录-j any,u否则覆盖信息不全布局决策会偏二是重排后务必用真实负载回归验证BOLT 的收益高度依赖你的访问模式换个场景数据可能完全不一样。把这三块串起来看REPL 解决的是开发时想要即时反馈ORC 解决的是运行时只编译需要的部分BOLT 解决的是编译完之后还能不能更快。你可以先在 REPL 里感受 JIT 的工作流再到 ORC 目录里顺着符号解析读一遍惰性物化的实现最后拿一个自己的二进制试试 BOLT 加 heatmap基本就能把 llvm-project 这条 JIT 线摸清了。【免费下载链接】llvm-projectThe LLVM Project is a collection of modular and reusable compiler and toolchain technologies.项目地址: https://gitcode.com/GitHub_Trending/ll/llvm-project创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表