038、Complex Dialect:复数运算支持

038、Complex Dialect:复数运算支持 038 Complex Dialect:复数运算支持一次让我熬夜到凌晨三点的复数乘法去年做雷达信号处理加速器项目,遇到一个诡异的bug:同样的复数乘法,在x86上跑得好好的,切到RISC-V向量扩展上,结果就全乱了。调试到凌晨三点,最后发现是编译器把(a+bi)*(c+di)优化成了(a*c - b*d) + (a*d + b*c)i,但中间结果的精度截断方式跟硬件单元的实现不一致。这个坑让我意识到:复数运算在传统编译器里就是个二等公民——要么被拆成实部虚部各自处理,要么依赖外部库。MLIR的Complex Dialect就是为了解决这个问题而生的。Complex Dialect到底解决了什么传统做法里,复数运算的中间表示要么是:%real = mul %a_real, %c_real %real2 = mul %b_imag, %d_imag %result_real = sub %real, %real2要么是调用__muldc3这样的运行时库函数。前者丢失了“这是一个复数运算”的语义信息,后者又太黑盒,没法做细粒度的优化。Complex Dialect把复数当作一等公民。在MLIR IR里,你可以直接写:%z = complex.mul %a, %b : complexf32