MLIR的Block Floating Point(块浮点)表示从一次定点数溢出说起上周调试一个AI加速器后端,模型跑在FPGA上,精度一直对不上。翻看中间表示,发现某个卷积层的权重被截断得面目全非——16位定点数,动态范围不够,小权重全被吞掉了。同事说“要不换FP32?”,但硬件资源吃紧,FP32乘法器面积翻倍,延迟也扛不住。这时候我想起MLIR里有个冷门但实用的东西:Block Floating Point(块浮点,简称BFP)。它不是IEEE754那种每个数带独立指数,也不是纯定点,而是把一组数共享一个指数,每个数只存尾数。听起来像定点数的变体,但动态范围能扩展好几个数量级。BFP在MLIR中的存在感MLIR的Dialect体系里,BFP没有像arith或linalg那样独立成派,而是藏在某些硬件后端Dialect的Type系统中。比如有些AI加速器Dialect会定义bfpe8m7, block_size=16这样的类型,意思是8位指数、7位尾数,每16个元素共享一个指数。为什么MLIR要支持这种“非标准”表示?因为硬件实现需要。纯定点数在层间传递时,如果激活值分布不均匀,要么溢出要么精度浪费。BFP相当于给每个小数据块配了一个“局部缩放因子”,比全局定点灵活,又比浮点省硬件。踩过的坑:共享指数的对齐问题第一次用BFP时,我天真地以为把一组数直接取最大指数就行。结果在MLIR的转换
