Altifigence Academy

18 / 24 · 概念

分块、重叠边缘与部分和

Th=Tw=2、Tc=1、Tm=2,使用 3×3 卷积核、步幅二、膨胀率一时,计算单缓冲输入/权重/32 位和/偏置字节数。

划分张量以适应存储

为一个分块选择输出高度 Th、宽度 Tw、输入通道数 Tc 和输出通道数 Tm。输入重叠边缘延伸到输出分块之外。步幅 S、膨胀率 D、卷积核 R 时,所需输入高度为 (Th−1)S+(R−1)D+1;宽度使用对应水平参数。边界填充可直接生成,不必读取。

拆分输入通道后,需要在所有通道分块之间保留每个输出部分和。提前对每个分块舍入会改变运算。只在第一个通道分块加入一次偏置,随后继续累加同一个和。改变输出通道分块也会改变权重和偏置。

存储预算示例

对于 3×3、单位步幅、单位膨胀率运算,设 Th=Tw=2、Tc=2、Tm=2。重叠边缘区域为 4×4,需要 32 字节 int8 输入。权重占 2×2×3×3=36 字节。八个 32 位部分和占 32 字节,两个 32 位偏置占八字节。总计 108 字节。比例因子、地址、有效性和控制存储未包含,需要单独预留。

输入和权重双缓冲需要 2×(32+36)+32+8=176 字节,超出 128 字节预算。将 Tc 降为一,输入为十六字节,权重为十八字节。双缓冲存储变为 2×34+32+8=108 字节。应跨两个输入通道分块保留部分和。缓冲能放下,并不能证明传送可以与计算重叠;应另外检查调度。

步幅二使同一个 2×2 输出分块的输入跨度扩大到 5×5。相邻分块可能共享边缘值,但独立重新加载仍会重复流量。应区分唯一张量字节数这一最低界限,与实际分块传送量。

M=5、Tm=2 时,最后一个分块只有一个有效输出通道。应屏蔽额外的权重和输出访问。对最后空间分块和输入通道分块应用相同原则。NVIDIA CUTLASS 文档描述了无需完整展开矩阵就能生成分块的实际隐式 GEMM 方法。本课程计算存储和部分和,不执行该 CUDA 实现。

自己试试

Th=Tw=2、Tc=1、Tm=2,使用 3×3 卷积核、步幅二、膨胀率一时,计算单缓冲输入/权重/32 位和/偏置字节数。

阅读解释

5×5 输入占 25 字节。再加十八字节权重、32 字节和、八字节偏置:共 83 字节,不含控制和比例因子。

你的选择适用于此浏览器,可随时在页脚更改。