跳转至

02 Tiling 切分策略与静态 SRAM 内存复用规划

1. 多级循环切块 (Loop Tiling) 空间约束模型

对于大矩阵乘法 \(C(M, N) = A(M, K) \times B(K, N)\),设片上 Scratchpad SRAM 总容量为 \(C_{SRAM}\)(如 2MB):

graph TD
    GlobalMat["全局 DRAM 大矩阵: A(4096, 4096), B(4096, 4096)"]
    GlobalMat -->|Loop Tiling 切分| Tiles["片上 Micro-Tiles: A_tile(Tm, Tk), B_tile(Tk, Tn)"]
    Tiles --> DoubleBuf["Ping-Pong 双缓冲分配 (SRAM 物理偏移)"]
    DoubleBuf --> ArrayCompute["2D 脉动阵列分块连续累加"]

1. 双缓冲容量不等式

\[\text{Memory Required} = 2 \times (T_m \times T_k + T_k \times T_n + T_m \times T_n) \times \text{Bytes\_per\_Elem} \le C_{SRAM}\]

2. 算力与搬运平衡约束方程

为了实现完全无气泡重叠,Tile 切分必须满足: $\(T_{DMA}(T_m, T_n, T_k) \le T_{Compute}(T_m, T_n, T_k)\)$ $\(\frac{(T_m \times T_k + T_k \times T_n) \times \text{Bytes\_per\_Elem}}{\text{DRAM Bandwidth}} \le \frac{2 \times T_m \times T_n \times T_k}{\text{Array Peak FLOPS}}\)$


2. 静态内存区间图着色算法 (Interval Graph Coloring)

graph LR
    subgraph TensorLifetimes["张量生命周期区间 (Time Interval)"]
        T0["Tensor 0: [Cycle 0 -> 120]"]
        T1["Tensor 1: [Cycle 50 -> 200] (与 T0 重叠)"]
        T2["Tensor 2: [Cycle 130 -> 300] (与 T0 不重叠)"]
    end

    subgraph SRAM_Reuse["SRAM 物理内存复用"]
        BankA["SRAM 偏移 0x0000 -> 赋予 Tensor 0,随后原地复用给 Tensor 2"]
        BankB["SRAM 偏移 0x8000 -> 赋予 Tensor 1"]
    end

    T0 & T2 --> BankA
    T1 --> BankB

通过在编译期执行区间图着色,NPU 软件栈实现了 100% 静态分配与 0 内存碎片,消除了任何运行期 malloc/free 开销。