146、MLIR的Bfloat16与FP8等低精度格式支持
MLIR的Bfloat16与FP8等低精度格式支持从一次诡异的精度损失调试说起去年做AI推理引擎时,遇到一个让人抓狂的bug:模型在GPU上跑得好好的,换到某款AI加速芯片上,精度直接崩了。排查了三天,最后发现是MLIR的TypeConverter在把F32转成Bfloat16时,悄悄把某些中间结果的精度截断了——但编译器优化日志里完全没提示。那个下午我盯着LLVM的Bfloat16实现代码,第一次意识到低精度格式在MLIR里的支持远没有想象中那么简单。Bfloat16在MLIR里的“半残”状态很多人以为MLIR原生支持Bfloat16,实际上它只是“能用”,但远没到“好用”的程度。MLIR的BuiltinTypes里确实定义了bf16,但你去翻LLVM的代码生成后端,会发现Bfloat16的算术指令支持是残缺的——很多架构根本没有原生Bfloat16的加法器,编译器只能通过F32模拟。// 看起来正常的Bfloat16操作 func.func @test_bf16(%a: bf16, %b: bf16) - bf16 { %c = arith.addf %a, %b : bf16 // 这里踩过坑:实际可能被提升到f32运算 return %c : bf16 }别被这个表面语法骗了。当MLIR把这个IR往下转换时,如果目标架构不支持原生bf16,arith.addf会被降级