想象一座国际化大都市的机场:东京来的旅客讲日语,巴黎来的讲法语,内罗毕来的讲斯瓦希里语。他们目的地相同——城市交通调度中心,但语言五花八门。航站楼里那位金牌翻译官,能把所有语言统一成普通话,再交给调度中心。AI 编译的世界里,PyTorch、TensorFlow、JAX 就是不同国家的旅客,XLA 是精准高效的调度中心,而 StableHLO 就是那位金牌翻译官——一个中立、稳定、标准化的中间表示层。这篇文章将带你从“为什么需要翻译官”讲起,一步步看清它怎么把每种框架的“方言”翻译成 XLA 听得懂的普通话,又如何在工程中帮你真正省下真金白银的算力成本。
对 AI 从业者而言,理解 StableHLO 意味着你不再被单一框架绑死——模型换框架、换硬件、换编译后端时,你都能看懂“翻译”从哪里发生、优化在哪里生效,这几乎是进入编译器、训练平台、推理引擎岗位的必备地图。
可视化演示
动态展示XLA HLO到StableHLO的语义等价映射、操作类兼容性覆盖(计算类100%)、跨平台部署路径(TPU→GPU/CPU)、以及OpenXLA生态整合四个核心视角。
本节配有交互动效(进入视口后自动加载,约 3KB)。
初识 XLA 生态
设想你站在国际机场的到达大厅:出口 A 是东京航班,出口 B 是巴黎航班,出口 C 来自内罗毕。旅客们讲着三种不同语言,却都要去同一个城市交通调度中心。大厅中央那位穿紫色马甲的金牌翻译官,能把日语、法语、斯瓦希里语都译成普通话,调度中心只需要听懂一种语言就能高效派车。StableHLO 在 AI 编译中的角色,和这位翻译官如出一辙。
AI 世界里的“旅客”是 PyTorch、TensorFlow、JAX 等深度学习框架,它们各自定义计算图——PyTorch 喜欢命令式即时执行,TensorFlow 偏好静态图会话,JAX 则围绕函数式变换构建。XLA(Accelerated Linear Algebra)作为“城市交通调度中心”,只负责高效地把计算调度到 GPU、TPU 上运行。问题来了:调度中心没法为每位旅客单独学一种语言,它需要一种统一的交流协议。
StableHLO(Stable High Level Operations)正是这个协议。它把各框架描述的计算图,解析成一组稳定、公开、带版本的中级算子,XLA 拿到这份标准翻译稿后,再做融合、布局优化和代码生成。换句话说,框架作者不需要理解 XLA 的每个内部细节,编译器后端也不需要关心模型是用什么框架写出来的。
有了翻译官,旅客不必学普通话也能抵达城市;同理,框架作者只需对接 StableHLO 一个窗口,就能把模型送进 XLA 生态,享受全套的后端优化。这就是“XLA 兼容”最初的样子——多语言世界里的一个统一插座。
- 前端解析各框架把自己定义的计算图翻译成 StableHLO 算子,这是“旅客到翻译台”的过程。
- 编优化XLA 编译器在 HLO 层实施算子融合与内存布局优化,这是“调度中心规划路线”。
- 代码生成优化后的 HLO 被生成为目标硬件的机器指令,这是“车辆真正出发”。
StableHLO 演进之路
早期的机场可没有翻译官。调度中心自己整理了一本“内部暗语手册”,只有机场员工看得懂——航班号、停机位、行李编码混在一起。这套暗语就是 XLA 内部的 HLO(High Level Operations)。HLO 功能强大,但从未承诺对外稳定:今天叫 add,明天可能改叫 add_v2,第三方接入方苦不堪言。
随着接入的框架和硬件越来越多,暗语手册越来越厚,维护成本直线飙升。OpenXLA 社区决定做一次“手册公开化”改革:把 HLO 中久经生产考验的算子抽取出来,重新定义、逐一编号、诚恳地给出语义规范,并用语义化版本号承诺兼容。这场改革的结果,就是 StableHLO 的诞生。
StableHLO 并不是另起炉灶,而是“HLO 方言的规范化扩展”。它明确了算子集合的边界:哪些算子属于核心稳定子集,哪些是带包装的复杂算子(CHLO),哪些仍在实验期。社区还建立了 conformance test 体系,任何实现都可以用一套公开测试来验证自己是否“真的兼容”。
如今,新框架想接入这个“机场联盟”,不用再费劲学内部暗语,直接对照公开的 StableHLO 规范交出计算图即可。版本的稳定承诺,让“兼容”从一句口号变成了可追溯、可测试的契约。
- 算子集合StableHLO 定义的是一个有边界的算子集合。
- 来自 HLO每个算子都源自 XLA 的 HLO 方言,而不是凭空发明。
- 稳定且公开算子必须在生产中验证过、且语义被写成公开规范,才能入选。
MLIR 多级中间表示
机场不是只有一个柜台。旅客要经过值机、安检、行李分拣、登机口等多个环节,每一级设施使用的“工作语言”完全不同——值机员看证件编号,安检看扫描信号,行李员看条形码。它们靠一张标准流转单衔接彼此。StableHLO 恰好生活在 MLIR 这个“多级机场”当中。
MLIR(Multi-Level Intermediate Representation)是 LLVM 社区打造的编译器基础设施,核心思想是“方言”(Dialect)。每种方言都有自己的算子、类型和规则,却在同一个模块里和平共处。TensorFlow 方言描述框架层语义,Tensor 方言描述张量操作,LLVM 方言描述机器层指令——他们像机场各环节的工牌,各说各话但彼此衔接。
StableHLO 就是 MLIR 中一种举足轻重的方言。编译器使用 pass 管线在方言之间做转换:先把框架级方言“convert“到 StableHLO 方言,再做”legalize“落到 XLA 专用的 HLO 方言,最后逐级下降到机器码。因为所有方言共用同一套基础设施,已经为某个方言写好的优化 pass 可以轻松复用到相邻层级,避免”每接入一个框架就重写一遍编译器”的悲剧。
多级设施的最大红利是“前端只对接一层”:值机柜台不必关心行李系统如何运转,只要把标准流转单塞给安检口,就能服务所有航空公司。这正是 MLIR 架构对 StableHLO 的赋能——兼容不是硬编码,而是基础设施级别的设计。
- 方言入口TensorFlow 等框架的方言带着自身语义进入管线。
- 统一转换convert pass 把框架方言语义对齐到中立的 StableHLO。
- 合法性化StableHLO 再被 legalize 到 XLA 私有的 HLO 方言。
- 逐级下降后续 pass 一路降到 LLVM 级,交给后端生成机器码。
兼容原理与机制
翻译官最重要的职业操守是“不改原意”。法语里的冷幽默翻成中文必须让听众笑出来,不能变成尴尬的沉默。StableHLO 与 HLO 之间的兼容,也建立在一条铁律上:语义等价——一段程序在 StableHLO 里怎么写,到 HLO 里执行,结果必须一模一样。
语义等价不是嘴上说说,它由一套精密的机制托底。第一是类型系统对齐:StableHLO 明确标注每个张量的形状(shape)与数据类型(dtype),HLO 侧的类型推导必须完全吻合;第二是统一的 SSA 形式:MLIR 要求每个值只被赋值一次,控制流用显式区域表达,杜绝含糊的重复赋值;第三是动态 shape 的支持:StableHLO 通过专门的边界和动态尺寸算子表达“运行时才知道的维度”,而不是一棍子打死。
这就像翻译官佩戴着一副“精准词典眼镜”:每个词条都对应唯一释义,每种语法结构都有标准译法。XLA 优化器在 HLO 层面大胆融合、重排布局时,之所以敢放开手脚,是因为它知道语义等价条约已经由 StableHLO 把关——所有可能的“语义漂移”在翻译阶段就被拦截了。
同声传译有“译员誓言”,StableHLO 的每个算子也签过“语义条约”。优化器再怎么大胆地融合、重排、向量化,都不能违反这条条约——这正是 XLA 兼容最坚固的地基。
- 语义解释双括号是“语义取值”的数学记号,理解为“这段程序的真实含义”。
- 左侧程序表达式在 StableHLO 环境下的执行结果。
- 等价条件它在 HLO 环境下的执行结果必须与左侧相等。
关键算法特性
一位国际旅客转机,要过入境、取行李、安检、登机四道关口,每一道门都排队。某天机场推出“一单到底”服务:行李直达目的地,旅客在联程通道只过一次安检。中转时间瞬间缩短——这就是算子融合在计算图里做的事。
StableHLO 接入 XLA 后,编译器开始施展四招关键算法。第一招算子融合:把连续逐个执行的元素级算子(加法、乘法、激活函数)绑进同一个 kernel,中间结果不再写回显存;第二招布局优化:调整张量的维度顺序与内存对齐方式,让访存模式贴合硬件偏好;第三招常量折叠:把编译期就能算完的表达式直接算成常数,运行时不再重复劳动;第四招代数化简:用交换律、结合律、“乘以 0 得 0”等规则剪除无效计算分支。
在 GPU 上,访存带宽往往比算力更稀缺。算子融合把“每算子一读一写”降为“一条链只读一次、只写一次”,省下的中间张量内存常常能让 kernel 数量减少五到十倍,端到端提速显著。
柜台合并后,中转存取的延迟被大幅削平。在真实模型中,融合往往比算术层面的微优化带来更直观的加速——这就是“少排队,比跑得更快”的编译哲学。
- 优化前内存原图中每个算子都要独占一个临时缓冲。
- 融合节约被融合的链式算子不再产生独立中间张量。
- 优化后内存只剩关键输入输出,缓存命中率随之提升。
性能优化策略
繁忙的机场有多条跑道,调度中心不会让所有航班挤同一条跑道排队。它会按目的地分配跑道、优化起降顺序、错开高峰。XLA 拿到 StableHLO 计算图后,也扮演着同样的空中交警角色。
性能优化的四个抓手:内存规划、并行调度、向量化、缓存亲和。内存规划采用 arena 风格复用缓冲区——“张量 A 用完了,它的显存立刻让给张量 B”,避免频繁申请释放;并行调度把图上相互独立的子图分派到不同设备或多条 GPU 流上并行执行;向量化让计算走 SIMD 通道,一次指令处理多个数据;缓存亲和则通过 tiling 把计算分块,让数据块在 cache 中保持热度,不反复到主存“取外卖”。
这些策略组合起来,效果用阿姆达尔定律可以看得更清楚:假设模型有 80% 的计算可并行,无论把并行核数加到多少,最终加速比都不可能超过 5 倍。
调度再聪明,也得先找到“串行瓶颈”在哪。StableHLO 把计算图梳理得清清爽爽,瓶颈在哪个算子、哪种 shape 上一目了然——这正是后续工程实践能够精准发力的前提。
- 串行耗时单设备、单流执行整个模型的耗时。
- 并行耗时使用多设备或多流并行后的耗时。
- 加速比上限当核数 n 趋近无穷大时,加速比逼近 1/(1-p)。
工程实践案例
某航班大面积延误,调度中心没有拍脑袋猜测,而是拉出每个节点的耗时数据,发现卡在行李转运环节四十分钟。性能优化同理:先测量,再动手,别让玄学领路。
接入 StableHLO/XLA 的工程实践通常按四步循环:性能分析用 Xprof 等工具定位热点算子;算子调优针对瓶颈做融合或替换;稳定性保障用 conformance test 与 golden result 校验输出一致;问题排查从编译日志、HLO dump 一层层向下追根因。
一个典型实战:某 transformer 模型的 GELU 激活链包含 12 个独立 kernel,每个 kernel 都在显存里读写中间张量。接入 StableHLO 后,XLA 自动把整条链融合进 2 个 kernel,中间张量全部保留在寄存器与共享内存中。端到端推理耗时降低约 23%,而模型代码一行未改——优化的功劳全部来自“翻译官”背后的编译管线。
就像航司处理延误有标准操作流程,StableHLO 生态也沉淀了“分析—调优—验证—复盘”的闭环。有了这套流程,性能优化不再是老师傅的经验玄学,而是每个工程师都能习得的方法论。
- 加速比调优前耗时与调优后耗时之比,衡量优化收益。
- 瓶颈定位分析器把“卡在哪”精确映射到算子名、shape 和设备。
未来趋势
这座机场正从“区域枢纽”升格为“全球联盟”:更多航空公司——JAX、MindSpore、PaddlePaddle——递交入驻申请,更多机型——CPU、GPU、TPU、NPU——等待适配。翻译官的价值,正在从“服务一家”走向“连接一切”。
OpenXLA 社区的治理模式让 StableHLO 以“事实标准”的姿态演进。语义化版本号、bytecode 序列化、跨框架的一致性测试套件,每一项都在把兼容性推向更深的水位。新框架接入的成本从“重写整个编译器”降为“写一个前端转换器”;新硬件厂商只要实现 StableHLO 后端,就能立刻享受 PyTorch、TensorFlow、JAX 整个生态的模型。
未来最有想象力的图景是:StableHLO 成为整个 ML 编译生态的通用交换语言。训练与推理、云端与端侧、GPU 与专用芯片,都围绕这一种中间表示对话。翻译官最终兑现的承诺,是“一次翻译,处处抵达”。
当“翻译”成为公共基础设施,创新就只发生在两端:框架侧专注表达力,硬件侧专注算力释放。这正是 StableHLO 对整个 AI 编译生态最浪漫也最务实的期许。
- 前端集合每个框架提供一个转换函数,把自身计算图映射到 StableHLO。
- 后端集合每个硬件提供一个实现函数,从 StableHLO 出发生成代码。
- 组合兼容任意前端和任意后端可以自由配对,构成完整编译链。
AI 应用场景
大模型预训练的跨框架迁移
阶段:训练编译优化
解决的问题:传统方式下,从 TensorFlow 切换到 PyTorch 意味着重写模型代码、重新适配分布式策略;而 XLA 的优化能力原本主要绑定在 TensorFlow 生态内。StableHLO 把“模型表达”与“后端优化”解耦,迁移成本从数周降到几天。
具体案例:某团队使用 PyTorch/XLA 桥接层训练 BERT 大规模模型,PyTorch 代码生成的图经 StableHLO 转交给 XLA,在 TPU 上完成分布式训练。后续把同一份模型切回 TensorFlow Serving,计算图仍能复用同一套 StableHLO 中间表示,几乎无需改动模型逻辑。
云推理服务多硬件适配
阶段:推理部署
解决的问题:推理服务上线时,常面临“换一块新 GPU 就要重写一遍推理引擎”的困境,传统方式为每个硬件单独维护算子库,成本高且易出错。借助 StableHLO 统一 IR,一个 ONNX 导出的模型可以无缝运行在 T4、A100 乃至 TPU v4 上。
具体案例:某云厂商的 Triton 推理服务器接入 OpenXLA 推理栈,将 ONNX 模型先转换为 StableHLO,再由不同后端的编译器分别生成目标硬件代码。客户提交一次模型,就能在多种规格的实例上获得一致的推理结果,部署周期从两周缩短到两天。
编译器团队接入自研算子
阶段:编译器开发
解决的问题:算法团队研发的新型算子(如高效注意力变体)无法直接享受 XLA 的融合优化,传统做法是绕过编译器手写 CUDA kernel,既费时又难维护。把自定义算子注册为 StableHLO 方言中的 custom call,就能进入整套优化管线。
具体案例:某编译器团队把自研的 FlashAttention 算子注册为 StableHLO custom call,随后 XLA 的融合 pass 自动将它和相邻的激活、归一化算子合并进同一个 kernel,显存占用降低约 35%,训练吞吐提升 18%。
Python 演示
class OpSign: def __init__(self, name, inputs, attrs=None): self.name = name self.inputs = inputs self.attrs = attrs or {} def __repr__(self): return "{}({})".format(self.name, ",".join(self.inputs)) def tf_dialect(node): mapping = {"AddV2": "stablehlo.add", "Mul": "stablehlo.multiply"} return OpSign(mapping[node["type"]], node["inputs"], {"device": node["device"]}) def torch_dialect(node): mapping = {"aten::add": "stablehlo.add", "aten::mul": "stablehlo.multiply"} return OpSign(mapping[node["type"]], node["inputs"]) def jax_dialect(node): return OpSign("stablehlo." + node["type"].lower(), node["inputs"]) def fold_constants(ops, env): out = [] for op in ops: if all(inp in env for inp in op.inputs): value = sum(env[i] for i in op.inputs) out.append(OpSign("constant", ["folded"], {"value": value})) else: out.append(op) return out def fusion_plan(ops): plan = [] chain = [] for op in ops: if op.name in ("stablehlo.add", "stablehlo.multiply"): chain.append(op) else: if chain: plan.append(OpSign("fused.elementwise", [chain[0].inputs[0]], {})) chain = [] plan.append(op) if chain: plan.append(OpSign("fused.elementwise", [chain[0].inputs[0]], {})) return plan def main(): tf_ops = [tf_dialect({"type": "AddV2", "inputs": ["a", "b"], "device": "/GPU:0"}), tf_dialect({"type": "Mul", "inputs": ["c", "d"], "device": "/GPU:0"})] torch_ops = [torch_dialect({"type": "aten::add", "inputs": ["x", "y"]})] unified = tf_ops + torch_ops print("统一翻译结果:", fusion_plan(fold_constants(unified, {"a": 1, "b": 2}))) if __name__ == "__main__": main()
mapping = {"AddV2": "stablehlo.add", "Mul": "stablehlo.multiply"}建立方言到 StableHLO 标准名的映射表,是“翻译官词典”的雏形。return OpSign(mapping[node["type"]], node["inputs"], ...)把异构输入统一成标准签名,之后所有优化只认这一种格式。if all(inp in env for inp in op.inputs)判断一个算子是否所有输入都是编译期常量,决定能否折叠。out.append(OpSign("constant", ["folded"], {"value": value}))常量折叠把可预计算的算子替换为常数节点,运行时不再重复计算。chain.append(op)把连续的 element-wise 算子累积到融合链中,模拟 XLA 的算子融合决策。OpSign("fused.elementwise", [chain[0].inputs[0]], {})输出融合标记:整条链只保留第一个输入,暗示中间张量可全部消除。fusion_plan(fold_constants(unified, {"a": 1, "b": 2}))主入口组合两道优化:先折叠常量,再规划融合,一步到位。
常见误区
误区很多人认为 StableHLO 就是把 HLO 改了个更响亮的名字,两者完全可以混用。毕竟名字里都有 HLO,接口也差不多,为什么要区分?
正解StableHLO 是独立于 XLA 的标准化方言。HLO 是 XLA 内部实现细节,没有对外兼容承诺;StableHLO 有语义化版本、公开规范和一致性测试。可以把 HLO 比作“员工的私人笔记”,StableHLO 是“对外公布的正式手册”——内容有关联,但定位和承诺完全不同。
为何常见:因为 StableHLO 的算子确实大量继承自 HLO,且早期文档常混用两者术语,初学者看到相似签名很容易误以为是重命名。
误区许多工程师以为只要把模型图转成 StableHLO,XLA 的所有融合、布局优化就自动开启了,不需要任何额外配置或版本匹配。
正解接入 StableHLO 只是拿到“进机场的登机牌”,飞机能否准点起飞还取决于航路规划——即 pass 管线是否完整、目标后端是否适配。你需要确保版本匹配、legalize 步骤正确、后端目标显式声明,优化收益才会出现。翻译官只负责翻译,不负责替你决定坐哪趟航班。
为何常见:因为 StableHLO 的卖点是“标准统一”,容易让人误以为标准本身就是优化引擎。实际上它只是优化的入口,不是优化的全部。
误区一些人认为 StableHLO 要求所有张量形状在编译期完全确定,动态 shape 模型(如变长输入的自然语言处理任务)根本无法接入 XLA。
正解StableHLO 明确支持动态 shape,通过 dynamic-slice、dynamic-gather 等算子表达“运行时才知道的维度”,并在 MLIR 层用边界与符号符号标识管理不确定性。XLA 会为动态 shape 生成带运行时检查的代码,只是优化空间比静态 shape 小。这相当于机场为“临时变更登机口”的旅客准备了专门的引导通道,而不是禁止他们登机。
为何常见:早期 XLA 确实偏好静态 shape,许多教程也以静态 shape 演示,导致“StableHLO 必须静态”的刻板印象被不断强化。
误区有经验的编译器工程师看到 MLIR 的多层方言后觉得多此一举,认为框架图直接降到 LLVM 级别的 IR,绕开 StableHLO 会更高效。
正解直接降级会导致“方言爆炸”:每一种框架和硬件的组合都需要独立的降级逻辑,且高层语义在降级后永久丢失,融合等优化无从下手。StableHLO 作为公共中间层,把 M×N 的适配问题压缩成 M+N 的问题。多级设施看似多走一段路,但换来的是每个环节只与相邻层级打交道,整体复杂度指数级下降。
为何常见:程序员天然偏好“最短路径”,认为减少中间层就能减少开销,却忽略了编译优化中“高层语义信息”比编译器本身更值钱。
面试题
Q1. StableHLO 在 MLIR 生态中扮演的角色是?
- A.一种新的深度学习模型格式
- B.连接框架与编译后端的统一 IR← 正确答案
- C.一个面向用户的推理框架
- D.一种 GPU 驱动编程语言
答案:B。StableHLO 是连接前端框架与 XLA 后端的统一中间表示,就像机场翻译官连接旅客与调度中心。A 描述的是模型权重文件,C 是推理服务,D 是硬件编程手段,均与 StableHLO 定位不符。
Q2. StableHLO 的算子主要来源于哪里?
- A.从 HLO 中选取并标准化← 正确答案
- B.从 OpenGL 着色器中衍生
- C.从 LLVM 指令集映射
- D.从 SQL 引擎中抽取
答案:A。StableHLO 是从 XLA 内部 HLO 方言中抽取的稳定算子子集,再经过公开化、版本化和一致性测试。它不是为了兼容图形 API、LLVM 或数据库而设计的。
Q3. MLIR 中“方言”的概念最接近下列哪一项?
- A.不同地区的外语口语
- B.编译器的命令行参数
- C.一组算子、类型和规则的集合← 正确答案
- D.硬件的指令缓存层次
答案:C。方言是 MLIR 中一组自洽的算子、类型与语义规则的集合,就像机场各环节不同的工作语言。命令行参数是配置,指令缓存是硬件细节,外语口语是类比而非准确定义。
Q4. SSA 形式的核心要求是什么?
- A.每个变量只被赋值一次← 正确答案
- B.所有变量都是全局变量
- C.变量必须全部动态分配
- D.允许变量重复赋值同名
答案:A。SSA(静态单赋值)要求每个值有且仅有一次定义,控制流通过显式选择表达,这让编译器容易追踪数据依赖。其他选项都不符合 SSA 的基本原则。
Q5. 算子融合带来的主要收益是什么?
- A.减少中间张量的内存搬运← 正确答案
- B.降低浮点计算精度
- C.增加可并行线程数
- D.减少模型参数量
答案:A。算子融合把多个连续算子合并成一个 kernel,中间结果不再写回显存,访存开销大幅下降。它不改变计算精度、不直接增加线程数,也不影响参数量。
Q6. 以下哪些属于 StableHLO 的核心特性?
- A.有公开且稳定的版本规范← 正确答案
- B.只能运行在英伟达 GPU
- C.是 MLIR 方言之一← 正确答案
- D.提供动态 shape 表达← 正确答案
答案:ACD。StableHLO 公开迭代、语义化版本化,是 MLIR 方言,且支持动态 shape。它面向多种硬件后端,绝不绑定英伟达 GPU,因此 B 错误。
Q7. XLA 兼容管线中正确的顺序是?
- A.前端图转 StableHLO 再转 HLO← 正确答案
- B.StableHLO 转前端图再转 HLO
- C.HLO 转 StableHLO 再转前端图
- D.codegen 转 HLO 再转 StableHLO
答案:A。兼容管线是“前端图 → StableHLO → HLO → codegen”,先统一语义、再 XLA 优化、最后生成代码。其余顺序颠倒了依赖方向,无法构成可执行的编译流程。
Q8. 哪些机制共同支撑 StableHLO 的语义等价?
- A.张量类型系统对齐← 正确答案
- B.统一使用 SSA 形式← 正确答案
- C.算子同时支持多种硬件
- D.明确的动态边界声明← 正确答案
答案:ABD。类型系统对齐保证 shape/dtype 一致,SSA 消除赋值歧义,动态边界声明约束不确定维度,三者共同保障语义等价。多硬件支持是生态收益,与语义等价无直接关系。
Q9. 阿姆达尔定律揭示的性能瓶颈是什么?
- A.串行部分占比决定并行上限← 正确答案
- B.并行核数越多收益越大
- C.内存大小决定加速比
- D.GPU 频率越高速度越快
答案:A。阿姆达尔定律说明加速比上限由不可并行的串行比例决定,核数再多也无法突破 1/(1-p)。其他选项都是对并行性能的片面直觉,不是定律内涵。
Q10. StableHLO 工程调优的合理步骤有哪些?
- A.先性能分析定位瓶颈← 正确答案
- B.直接重写所有算子
- C.对瓶颈算子做融合替换← 正确答案
- D.用一致性测试保障稳定← 正确答案
答案:ACD。正确路径是先分析定位热点,再有针对性地融合替换,最后用 conformance 测试守住正确性。“直接重写所有算子”是高风险反模式,违背了“先测量再动手”的工程原则。