MLIR的IEEE 754浮点异常处理与舍入模式一个让我熬夜三天的bug去年做AI加速器编译器的时候,遇到一个诡异的精度问题。模型在x86上跑得好好的,转到我们自研的NPU上,某些层的输出就开始“飘”。不是完全错,就是小数点后几位对不上。团队里的小伙子查了两天,怀疑是量化参数不对,我让他先停手。我直接dump了中间表示,盯着MLIR的arith dialect看了半小时。发现一个细节:x86后端默认用了FTZ(Flush To Zero)和DAZ(Denormals Are Zero),而我们NPU的硬件fma单元在处理非规格化数时,行为完全不一样。更坑的是,MLIR的lowering pass里,浮点舍入模式被悄悄改成了round-to-nearest-even,而硬件默认是round-toward-zero。这个bug让我意识到,IEEE 754的异常处理和舍入模式,在MLIR的IR层面几乎是个“透明人”——大多数开发者根本不会注意到它,直到精度对不上。MLIR里的浮点类型到底藏了什么先看一个最简单的例子。你在MLIR里写:%0 = arith.addf %a, %b : f32这个f32,在LLVM后端会被映射成float。但MLIR的FloatType本身,其实携带了比LLVM更丰富的语义信息。你可以通过
