已关闭
[Requirement|需求建议]: 卷积算子小kernel模板新增mte2 preload优化性能 #4831
ray-shaw创建于  8月17日关闭于  8月17日
ray-shaw
ray-shaw成员
8月17日 创建

Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.

Backgroud(背景信息)

性能优化需求,通过mte2提前载入提高L1和L0流水并行度以达到性能优化的目的。

Origin(信息来源)

conv卷积算子团队

Benefit / Necessity (价值/作用)

性能优化,整体性能提升约3%,配合tiling切分优化可进一步扩大性能优化幅度

Design(设计方案)

对 Conv2dSmallKernelParallelism 模板类中 cin 分块循环的一次性能优化,通过引入 MTE2 预加载(双缓冲/Ping-Pong)机制,将原本串行的"加载→消费"流程重构为"预加载下一个 cin 块 + 消费当前 cin 块"的流水线模式,使数据加载与计算得以重叠,从而降低 MTE 等待延迟、提升整体吞吐量。

主要改动:
循环体三段式重构:将原先每个 kl1 迭代中串行执行的 WaitFlag → LoadFmapL1Chunk → LoadWeightL1Block → SetFlag 流程拆分为三个独立段(Segment 1/2/3),分别处理首迭代加载、预加载下一块、以及消费当前块。

  • 首迭代特殊处理(Segment 1):仅在 kl1 == 0 时执行当前 L1 缓冲区(PING)的加载操作,包括 LoadFmapL1Chunk 和条件性的 LoadWeightL1Block,然后设置 MTE2_MTE1 标志。
  • 预加载下一 cin 块(Segment 2):除最后一个 cin 块外(通过 kl1 + 1 < cinL1Blocks_ 边界保护),提前调用 PrepareCinBlock(kl1 + 1, ...) 获取下一块的参数与事件,并执行对应的 LoadFmapL1Chunk 和 LoadWeightL1Block,将其加载到备用 L1 缓冲区(PONG),最后通过 SetFlagHardEvent::MTE2_MTE1 通知消费端。
  • 消费当前块统一处理(Segment 3):所有迭代(包括首迭代)在 Segment 3 中统一执行 WaitFlagHardEvent::MTE2_MTE1 等待当前块就绪后,进入后续的 SetupLoad3DForChunk 计算流程,与 Segment 2 的预加载形成流水线重叠。
likedislike
ray-shawray-shaw成员
8月17日 添加了label:requirement
CANN-robotCANN-robot成员
8月17日 关闭了 issue
CANN-robotCANN-robot成员
8月17日 添加了label:resolved