Open JunningWu opened 6 years ago
谷歌的TPU中最主要的计算单元就是伸缩阵列-Systolic Array。而伸缩阵列中的每一个计算单元,也就是乘累加器,则是其核心部件。
每一个cell单元包括六个组成部分,三个寄存器单元,分别是Activation寄存器,Weight寄存器和Sum In寄存器,分别存放激活值,权值以及部分累加和;还有两个完成计算的逻辑单元,乘法电路和加法电路,完成激活值和权值的乘法操作,以及部分和的累加操作;还有一个Weigth Path寄存器,作为多次重用的权值暂存单元,可事先存储在该寄存器中。
Activation寄存器和Weght寄存器,其输入和输出都有两条数据通路,对于Activation寄存器来说,其输入接口既可以由左侧(对于某一种实现方式来说)的Cell提供,也可以由UnifiedBuffer通过ValueLoader送进来;输出接口既可以送入乘法电路,也可以送给其右侧的Cell。类似的,Weight寄存器,则既可以从DynamicMemory获得输入,也可以由上侧的Cell提供,其输出既可以送给乘法电路,也可以送给下侧的Cell。
SumIn寄存器则保存由上侧Cell传入的部分累加和,其与乘法电路获得的结果共同送入加法电路中,完成累加操作,累加的结果送入下侧的Cell以供使用。
所有以上的操作,均由一个控制逻辑负责,哪些数据进行Cell间的传输,哪个权值需要在寄存器中暂存,暂存的周期数,甚至乘法电路是否工作,都由该控制逻辑负责。而该控制逻辑对于程序元来说,则就是一条执行的指令。
乘法电路和加法电路以及各个寄存器的位宽,与具体的数据类型有关,比如Int8和Int16,以及Float等。