计算单元是AI Core中提供强大算力的核心单元,相当于AI Core的主力军。AI Core计算单元主要包含矩阵计算单元、向量计算单元、标量计算单元和累加器,矩阵计算单元和累加器主要完成与矩阵相关的运算,向量计算单元负责执行向量运算,标量计算单元主要负责各类型的标量数据运算和程序的流程控制。
矩阵计算单元
上图表示一个矩阵A和另一个矩阵B之间的乘法运算C=A*B,其中M表示矩阵A的行数,K表示矩阵A的列数以及矩阵B的行数,N表示矩阵B的列数。这个矩阵乘法在CPU如何实现?
for (m=0; m<M, m++) for (n=0; n<N, n++) for (k=0; k<K, k++) C[m][n] += A[m][k]*B[k][n]
该程序需要用到3个循环进行一次完整的矩阵相乘计算,如果在一个单发射的CPU上执行至少需要MKN个时钟周期才能完成,当矩阵非常庞大时执行过程极为耗时。
由于常见的深度神经网络算法中大量的使用了矩阵计算,达芬奇架构中特意对矩阵计算进行了深度的优化并定制了相应的矩阵计算单元来支持高吞吐量的矩阵处理。通过精巧设计的定制电路和极致的后端优化手段,矩阵计算单元可以用一条指令完成两个16*16矩阵的相乘运算(标记为16^3,也是Cube这一名称的来历),等同于在极短时间内进行了16^3=4096个乘加运算,并且可以实现FP16的运算精度。如图3-7所示,矩阵计算单元在完成AB=C的矩阵运算时,会事先将矩阵A按行存放在输入缓冲区中,同时将矩阵B按列存放在输入缓冲区中,通过矩阵计算单元计算后得到的结果矩阵C按行存放在输出缓冲区中。在矩阵相乘运算中,如图3-7所示,矩阵C的第一元素由矩阵A的第一行的16个元素和矩阵B的第一列的16个元素由矩阵计算单元子电路进行16次乘法和15次加法运算得出。矩阵计算单元中存在256个矩阵计算子电路组成,可以由一条指令并行完成矩阵C的256个元素计算。
向量计算单元
AI Core中的向量计算单元主要负责完成和向量相关的运算,能够实现向量和标量,或双向量之间的计算,功能覆盖各种基本和多种定制的计算类型,主要包括FP32、FP16、INT32和INT8等数据类型的计算。
如上图所示,向量计算单元可以快速完成两个FP16类型的向量相加或者相乘。向量计算单元的源操作数和目的操作数通常都保存在输出缓冲器中。对向量计算单元而言,输入的数据可以不连续,这取决于输入数据的寻址模式。
向量计算单元可以作为矩阵计算单元和输出缓冲区之间的数据通路和桥梁。矩阵运算完成后的结果在向输出缓冲区传递的过程中,向量计算单元可以顺便完成在深度神经网络尤其是卷积神经网络计算中常用的ReLU激活函数、池化等功能并实现数据格式的转换。经过向量计算单元处理后的数据可以被写回到输出缓冲区或者矩阵计算单元中,以等待下一次运算。所有的这些操作都可以通过软件配合相应的向量单元指令来实现。向量计算单元提供了丰富的计算功能,也可以实现很多特殊的计算函数,从而和矩阵计算单元形成功能互补,全面完善了AI Core对非矩阵类型数据计算的能力。
标量计算单元
标量计算单元负责完成AI Core中与标量相关的运算。它相当于一个微型CPU,控制整个AI Core的运行。标量计算单元可以对程序中的循环进行控制,可以实现分支判断,其结果可以通过在事件同步模块中插入同步符的方式来控制AI Core中其它功能性单元的执行流水。它还为矩阵计算单元或向量计算单元提供数据地址和相关参数的计算,并且能够实现基本的算术运算。其它复杂度较高的标量运算则由专门的AI CPU通过算子完成。
在标量计算单元周围配备了多个通用寄存器(General Purpose Register,GPR)和专用寄存器(Special Purpose Register,SPR)。这些通用寄存器可以用于变量或地址的寄存,为算术逻辑运算提供源操作数和存储中间计算结果。专用寄存器的设计是为了支持指令集中一些指令的特殊功能,一般不可以直接访问,只有部分可以通过指令读写。
AI Core中具有代表性的专用寄存器包括Core ID(用于标识不同的AI Core),VA(向量地址寄存器)以及STATUS(AI Core运行状态寄存器)等。软件可以通过监视这些专用寄存器来控制和改变AI Core的运行状态和模式。
更多内容,请关注昇腾开发者社区
作者:Torrenza