
MLIR与算子中间表示:从理论到实践034、GPU Dialect:GPU编程模型与并行计算抽象从一次诡异的kernel挂起说起上周调试一个自定义算子,在NVIDIA A100上跑,kernel莫名其妙地hang住。用nsys抓了一下,发现warp在执行到某条barrier指令后永远等不到伙伴。检查了三天,最后发现是MLIR生成的GPU dialect中,workgroup大小和shared memory分配对不上号——我明明在host端设置了blockDim为(256,1,1),但MLIR的gpu.launch op里写的是(128,1,1)。这种低级错误,在纯手写CUDA时几乎不会犯,但在MLIR的层层转换中,一个属性没传对,就炸了。这个教训让我意识到:GPU dialect不是简单的“把CUDA翻译成MLIR”,它是一整套关于并行计算模型的抽象。你如果只把它当语法糖,迟早被坑。GPU Dialect到底在抽象什么MLIR的GPU dialect,本质上是在描述一个分层并行执行模型。它不关心你用的是CUDA、ROCm还是OpenCL,它只关心三个层次:grid(全局)、workgroup(块)、thread(线程)。每个层次都有对应的操作和属性。看一个最简单的例子:gpu.launch blocks(%bx,