ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

161、MLIR的Double Buffering与Ping-Pong Buffer

161、MLIR的Double Buffering与Ping-Pong Buffer MLIR的Double Buffering与Ping-Pong Buffer:一次DMA死锁的现场还原从一次凌晨三点的崩溃说起去年做一款AI加速器芯片的编译器后端,跑ResNet-50的卷积层时,每跑到第17层就卡死。板子上的LED灯像心电图一样规律闪烁——DMA传输完成中断没来。我盯着逻辑分析仪抓到的总线波形,发现DMA的源地址和目标地址在某个时刻突然变成了同一个内存区域。这不是巧合,是double buffering的乒乓逻辑在MLIR的bufferization阶段被优化掉了。当时用的MLIR版本是14.0,手写的pass pipeline里插了一个自作聪明的“buffer forwarding”优化。它把两个独立的buffer识别成了“可复用”的临时存储,直接合并成一个。结果就是:当硬件还在读buffer A的时候,计算单元已经开始往buffer A写新数据了。数据竞争,死锁,板子挂掉。从那以后,我对MLIR里任何跟buffer相关的优化都保持警惕。今天这篇笔记,就聊聊double buffering和ping-pong buffer在MLIR里的正确打开方式——不是教科书式的概念复述,而是你写pass时真正会踩的坑。硬件视角下的乒乓:不是你想的那样先明确一个事实:double buffering在硬件层面不是“两个buffer轮流用”这么简单。它解决的是计算单元和DMA之间的流水线气泡问题。假设你有一个卷积加速器,它从DDR读输入特征图,算完写回DDR。如果只有一个buffe
返回列表