欢送关注我的公众号 [极智视界],获取我的更多笔记分享

O_o>_<   o_OO_o~_~o_O

  本文具体解释了昇腾达芬奇架构中计算单元的架构与计算原理。

1、达芬奇架构概览

  达芬奇架构是一种 “特定域架构” (Domin Specific Architecture,DSA) 芯片。

  昇腾AI处理器的计算外围次要由 AI Core 形成,蕴含三种根底计算资源:矩阵计算单元(Cube Unit)、向量计算单元(Vector Unit)和标量计算单元(Scalar Unit),负责执行张量、矢量、标量计算。AI Core 中的矩阵计算单元反对 Int8 和 fp16 的计算,向量计算单元反对 fp16 和 fp32 的计算。AI Core 根本构造如下:

  这里次要解说 AI Core 中的计算单元,也就是上图中的黄色局部(矩阵计算单元、向量计算单元、标量计算单元及累加器模块),其余模块在这里就不开展说了。

2、矩阵计算单元

2.1 矩阵相乘

  因为古代的CNN网络算法中应用了大量的矩阵计算,达芬奇架构中也针对矩阵计算进行了深度优化,而矩阵计算单元就是反对高吞吐量矩阵计算的硬件单元。

  举个例子,下图示意两个矩阵 A、B 乘法,即 C = A x B,其中 A 的维度为 (M, K),B 的维度为 (K, N)。

  在 CPU 上能够用如下代码示意上述计算过程:

for(int m = 0; m < M; m++)    for(int n = 0; n < N; n++)        for(int k = 0; k < K; k++)            C[m][n] += A[m][k] * B[k][n]

  上述代码在单发射的CPU上至多须要 M K N 个时钟周期能力实现。在 CPU 的计算过程中,咱们冀望矩阵 A 需按行扫描,矩阵 B 需按列扫描,思考到典型的矩阵存储形式,无论矩阵 A 还是矩阵 B 都会依照行的形式进行寄存,也就是 Row-Major。在读取内存数据时,会关上内存中相应的一整行并把同一行中的所有数都读取进去,这种内存读取形式对矩阵 A 是非常敌对的,但对矩阵 B 却很鸡肋。如果能让矩阵 B 按列存储该多好,就像这样:

  所以在矩阵乘计算中往往通过扭转某个矩阵的存储形式来晋升矩阵计算的效率。

2.2 矩阵计算单元的计算形式

  个别在矩阵较大时,因为芯片上计算和存储的资源无限,须要对矩阵分块平铺解决 (Tiling),如下图。

  受限缓存资源,将矩阵 B 切分为 B0、B1、B2、B3 子矩阵,每个子矩阵的大小都适宜一次性存储到芯片上的缓存中并与矩阵 A 进行计算,从而失去后果子矩阵。矩阵分块的长处是充分利用了缓存的容量,并最大水平利用了数据计算过程中的局部性特色,能够高效的实现大规模的矩阵乘法计算,这是一种常见的优化形式。

  在 CNN 网络中,常见的卷积减速是将卷积运算转换为矩阵运算。GPU 采纳 GEMM 来实现矩阵运算的减速,如要实现一个 16 x 16 的矩阵乘法,需启 256 个并行线程,每个线程独立计算输入后果矩阵中的一个点,假如每个线程在一个时钟周期内能够实现一次乘加运算,则 GPU 实现整个矩阵乘运算须要 16 个时钟周期,这个延时是传统 GPU 无奈防止的瓶颈(没提 tensorcore 感觉不太偏心)。昇腾达芬奇架构针对这个问题做了深度优化,矩阵计算单元能够用一条指令实现两个 16 x 16 矩阵的相乘估算(也就是16的立方,这也是 Cube 名称的由来),相当于在极短时间内做了 4096 次乘加运算。

  同样是下面的矩阵乘例子,达芬奇矩阵计算单元在进行 A x B 矩阵乘运算时,会将 A 按行存入输出缓冲区,将 B 按列存入输出缓冲区,失去的后果矩阵 C 按行存入输入缓冲区。其中,C 的第一个元素由 A 的第一行的 16 个元素与 B 的第一列的 16 个元素通过矩阵计算单元子电路进行 16 次乘和 15 次加运算失去。达芬奇矩阵计算单元中共有 256 个矩阵计算子电路,能够由一条指令并行实现 C 的 256 个元素的计算。在达芬奇架构概览中能够看到矩阵计算单元前面跟了一组累加器,这是为了通常矩阵运算前面后加偏置的场景。

  矩阵计算单元能够疾速实现 16 x 16 的矩阵乘法,但当输出超过 16 x 16 的矩阵相运算时,须要进行分块解决,如下图。

  矩阵 A 的 Layout 为 大Z小Z(大Z的意思是 A 的各个分块之间按行排序,小Z的意思是每个块外部按行排序),矩阵 B 的 Layout 为 大 Z 小 N,失去的后果矩阵 C 的 Layout 为 大N小Z。

  除了反对 fp16精度,矩阵计算单元还能够反对 Int8 精度,对于 Int8 精度,矩阵计算单元能够一次实现一个 16 x 32 矩阵与一个 32 x 16 矩阵相乘的运算,能够依据神经网络对于精度要求来适当调整矩阵计算单元的运算精度,以取得更加杰出的性能。

2.3 向量计算单元的计算形式

  AI Core 中的向量计算单元次要负责实现和向量相干的运算,可能实现向量和标量 / 向量与向量之间的计算,包含 fp32、fp16、int32、int8 精度的计算。向量计算单元可能疾速实现两个 fp16 类型的向量计算,如下图。

  向量计算单元的输出和输入都保留在输入缓冲区中,对于向量计算单元来说,输出的数据能够不间断,这取决于输出数据的寻址模式。向量计算单元反对的寻址模型包含向量间断寻址和固定距离寻址,非凡的状况下,针对地址不法则的向量,也提供了向量地址寄存器寻址来实现向量的不规则寻址。在后面的达芬奇架构总览中能够看到,向量计算单元能够作为矩阵计算单元和输入缓冲区之间的数据通路。矩阵计算实现后的后果在向输入缓冲区传输的过程中,向量计算单元能够顺便实现 Relu、池化等层的格局转换。通过向量计算单元解决后的数据能够被写回到输入缓冲区或矩阵计算单元中,以备下次计算,与矩阵计算单元造成性能互补,欠缺了 AI Core 对非矩阵类型数据计算的能力。

2.4 标量计算单元的计算形式

  标量计算单元负责实现 AI Core 中与标量相干的运算,相当于一个微型 CPU,管制整个 AI Core 的生命流动。标量计算单元能够对程序中的循环进行管制,能够实现分支判断,其后果能够通过在事件同步模块中插入同步符的形式来管制 AI Core 中其余单元的执行。它还为矩阵计算单元和向量计算单元提供数据地址和相干参数的计算,且可能实现根本的算术运算。其余复杂度较高的标量运算则由专门的 AI CPU 实现。

  在标量计算单元四周装备了多个通用寄存器 (General Purpose Register, GPR) 和专用寄存器 (Special Purpose Register, spr),通用寄存器能够用于变量或地址的存放,为算术逻辑运算提供输出操作数和存储两头计算结果;专用寄存器能够反对指令集中一些指令的非凡性能,个别不能够间接拜访,只有局部能够通过指令读写。

  对于昇腾达芬奇架构的讲解就到这里了,咱们下篇再见~