与ABI兼容性)
MLIR的Versioning(版本管理)与ABI兼容性一个让我熬夜到凌晨三点的bug去年秋天,我在调试一个跨团队合作的AI推理引擎时,遇到了一个诡异的段错误。模型在开发机上跑得好好的,部署到客户服务器上就崩,而且崩的位置每次都不一样。更邪门的是,同样的二进制文件,换一台同型号的服务器就正常了。折腾了两天,最后发现是MLIR生成的动态库版本不匹配——开发机上的libMLIR.so是15.0.0,客户服务器上残留着14.0.3的旧版本。两个版本之间,某个Pass的接口签名变了,但符号表里名字一模一样,链接器静悄悄地绑错了函数地址。这个bug让我深刻理解了MLIR的Versioning机制不是文档里的装饰品,而是实打实的保命符。MLIR的版本号到底在管什么MLIR的版本号遵循语义化版本(SemVer),但它的含义比普通库要复杂得多。普通库的版本号主要管API接口,MLIR的版本号还要管IR的二进制表示、Pass的注册机制、Dialect的扩展点,甚至包括中间表示中某些属性的序列化格式。版本号格式是MAJOR.MINOR.PATCH。Major版本变化意味着IR格式可能不兼容,旧版本生成的.mlir文件可能读不了;Minor版本变化表示新增了功能但向后兼容;Patch版本就是修bug,不影响任何接口。但这里有个坑:MLIR的“向后兼容”是有条件的。它保证的是“同一个Major版本内,旧版本生成的IR能被新版本读取”,反过来不成立——新版本生成的IR可能包含旧版本不认识的Dial