Skip to main content
AI加速芯片上的2D单元
- 卷积天然的数据复用度是Dot的9倍,对于芯片的压力更小
- 算力缩放是一个非常重要的问题,涉及架构各代之间的稳定性,保护客户的价值
- L1/L2/L0 怎么支持reshape或者swizzel
- 不同的layout (NHWC等) 以及BPI BPK FF
- 不同数据精度的支持和混合计算
- L0 L1 Fusion的支持
- 存储的mapping 利于运算和fusion
- feature*weight vs weightT*featueT
大2D Dot计算的表达
- 指令表达为小尺寸,对不同的计算需求(1D、2D)的fusion比较友好
- 但是小尺寸,需要每个单元的L0进行broadcast来复用给其他单元,节省L1的带宽需求,增加了2D的复杂度
- 小尺寸对load/store的要求也比较高
- 需要2D的计算表达有一个好的抽象,同时配合非常精密的同步,解决上述问题
- 为了在各代的代码不发生变化,需要硬件/编译器有自动合并/优化的能力
- cuda因为需要兼容simt的编程,复用warp内thread的寄存器,同时为了拼接更多的硬件做一个更大的2D(为了PPA好)
- 整体上单个thread表达的数据计算尺寸比较小
- 硬件自动进行合并成大的2D指令
- 硬件自动处理同步
- 硬件自动处理数据搬运
- 因为需要协调多个sm subcore,甚至是block group,灵活性一样是个大问题
- GCU4.0利用多个thread之间的手动给的 footprint order信息来组织多个thread的数据共享
- 左数每次都从L1load重复load,右数缓存在L0,并且各个subcore复用
- 2D-1D-2D的Fusion
- 涉及到多次计算后结果的数据精度(位宽)不匹配的问题,需要合并和拆封来保持操作数的宽度一致
- 8bit int8 需要 64个组成 512bit,而32bit只要16个
- 不同的操作的输入输出,可能需要有装置的操作
- layout的区别:NCHW NHWC
- 卷积的stride不等1
- 预测:2D算力会无限的膨胀下去,1D和2D的比例会比较固定
- 精细化控做到L1,则所有的抗latency的容量就会开在L1,消耗:L1_base x latency,如果是在L0,则L0_base比L1_base小很多。节省很多面积
- swizzle和renaming都可以解决L0的bank conflict,renaming会消耗大量的面积
物理限制
- 算力和存储器(SRAM)都不能做到单体很大
- 很大的单体有利于软件使用方便
- 多个小的存储器实例(bank)组成一个大的抽象存储器
- 物理单元之间很难方便做到cycle by cycle的同步,必须使用额外的同步逻辑
- 硬件电路虽然可以并行,理论算力很高,但是latency是必然存在的