MLIR的HBM与GDDR优化:一次带宽踩坑实录
去年在调一个AI推理引擎的MLIR后端时,遇到一个诡异的性能问题:同样的计算图,在A100上跑出理论带宽的85%,换到H100上反而掉到60%。当时盯着nvidia-smi的带宽利用率,百思不得其解。后来扒开MLIR的affine loop tiling和memory space映射,才发现问题出在HBM的bank conflict和GDDR的page burst上。今天就把这些坑掰开揉碎,聊聊MLIR里怎么针对高带宽内存做优化。
从一次bank conflict说起
先看一个典型的MLIR片段,这是某个卷积算子的tiling后代码:
#map = affine_map<(d0, d1) -> (d0 * 64 + d1)> func.func @conv_tiled(%input: memref<1024x1024xf16, 3>, %output: memref<1024x1024xf16, 3>) { affine.for %i = 0 to 1024 step 64 { affine.for %j = 0 to 1024 step 64 { // 这里踩过坑:直接按行连续访问,HBM bank冲突爆炸 affine.for %ii = 0 to 64 { affine.for %jj = 0 to 64 { %val = affine.load %in