掌桥专利:专业的专利平台
掌桥专利
首页

卷积运算电路、及具有该卷积运算电路的相关电路或设备

文献发布时间:2023-06-19 19:35:22


卷积运算电路、及具有该卷积运算电路的相关电路或设备

技术领域

本申请涉及处理器技术领域,具体而言,涉及一种卷积运算电路、及具有该卷积运算电路的相关电路或设备。

背景技术

AI(Artificial Intelligence,人工智能)算法中存在大量的卷积运算,根据精度的需求卷积运算需要支持不同类型的数据,例如需要支持诸如fp32/tf32/fp16/bf16/int8/uint8/int4/uint4等类型的数据。其中,fp32/tf32/fp16/bf16为浮点数据类型,而int8/uint8/int4/uint4为定点数据类型。而随着AI技术的不断发展,需要处理器能够同时支持定点数据的运算和浮点数据的运算。

目前,为实现处理器同时支持定点数据的卷积运算和浮点数据的运算,常规的实现方式是在处理器内同时设计单独的进行定点数运算的定点数卷积运算电路和进行浮点数运算的浮点数卷积运算电路,这就导致了处理器中的面积开销大。

发明内容

本申请实施例的目的在于提供一种卷积运算电路、及具有该卷积运算电路的相关电路或设备,用以解决相关技术存在着的会导致处理器内面积开销大的问题。

本申请实施例提供了一种卷积运算电路,包括:乘法器,用于接收操作数,以完成乘法中间结果计算,输出部分积;定点数累加计算电路,与所述乘法器连接,用于在所述操作数为定点数时,对所述乘法器输出的部分积进行压缩并对压缩后的部分积进行相加处理,得到定点卷积运算结果;浮点数累加计算电路,与所述乘法器连接,用于在所述操作数为浮点数时,根据所述操作数的指数部分进行指数计算得到浮点乘法指数结果,并根据所述乘法器输出的部分积进行尾数计算得到尾数计算结果。

在上述实现结构中,由于定点数累加计算电路和浮点数累加计算电路均与乘法器相连接,因此对于定点数的计算和对于浮点数的计算可以复用乘法器,从而相比于单独配置定点数卷积运算电路和浮点数卷积运算电路的方案而言,面积开销得以降低;同时,定点数的计算和浮点数的计算在累加计算时,分别通过定点数累加计算电路和浮点数累加计算电路实现,可以节省不同数据类型的卷积运算的功耗开销。

进一步地,所述操作数为按照所述乘法器的位宽对待运算数据和待运算权重的尾数进行拆分或填充后得到的数据和权重;

所述浮点数累加计算电路包括:尾数计算单元,与所述乘法器连接,用于对所述乘法器输出的针对同一待运算数据的部分积进行压缩并求和,得到对应该待运算数据的浮点尾数乘法结果;指数计算单元,用于对所述待运算数据和所述待运算数据对应的待运算权重的指数部分进行计算,得到针对该待运算数据的浮点乘法指数结果;累加单元,与所述尾数计算单元和所述指数计算单元连接,用于从多个待运算数据对应的浮点乘法指数结果中,选择出最大浮点乘法指数结果,以及用于对所述多个待运算数据对应的浮点尾数乘法结果进行压缩并求和得到所述尾数计算结果。

在上述实现方式中,通过尾数计算单元和指数计算单元分别实现了对于待运算数据的尾数部分和指数部分的计算。而通过累加单元的处理,就实现了多个浮点尾数乘法结果之间的累加,从而满足了针对浮点卷积计算的要求。

进一步地,所述指数计算单元还用于:对所述待运算数据和所述待运算权重中携带的异常标志位进行检查,在存在表征数据为denormal的异常标志位时,将具有该异常标志位的所述待运算数据或所述待运算权重的指数部分表示为1。

在上述实现方式中,通过待运算数据中携带的异常标志位实现对于待运算数据是否为denormal数据的确定,通过待运算权重中携带的异常标志位实现对于待运算权重是否为denormal数据的确定,从而不需要在对于指数部分的计算路径上引入浮点数denormal的判断逻辑,可以节省指数部分的计算开销。

进一步地,所述指数计算单元还用于:在用于计算的所述待运算数据和所述待运算权重的指数部分中,存在至少一个指数部分为0时,确定所述浮点乘法指数结果为0。

在上述实现方式中,通过将存在指数部分为0的指数计算情况中的浮点乘法指数结果确定为0,从而可以保证指数运算的正确,一方面可以提高指数部分运算效率(存在至少一个指数部分为0时,直接确定浮点乘法指数结果为0,无需再进行运算),而另一方面也可以避免按照正常累加后,造成运算出错。

进一步地,所述尾数计算单元包括:压缩电路,与所述乘法器连接,用于对所述乘法器输出的针对同一待运算数据的部分积进行压缩;第一加法器,与所述压缩电路的输出端连接,用于将所述压缩电路输出的部分积求和,得到对应该待运算数据的浮点尾数乘法结果。

在上述实现方式中,通过压缩电路进行乘法器中部分积的压缩运算,并通过第一加法器进行累加,即可实现对应于同一待运算数据的乘法运算,快速地得到对应该待运算数据的浮点尾数乘法结果。

进一步地,所述累加单元中包括:指数选择单元,用于从多个待运算数据对应的浮点乘法指数结果中,选择出最大浮点乘法指数结果;指数阶差计算单元,与所述指数选择单元连接,用于计算各所述待运算数据对应的浮点乘法指数结果与所述最大浮点乘法指数结果之间的指数阶差;累加器,与所述指数阶差计算单元连接,用于按照所述指数阶差对各所述待运算数据对应的浮点尾数乘法结果进行对阶移位,并对对阶移位后的浮点尾数乘法结果进行压缩并求和得到所述尾数计算结果。

在上述实现方式中,通过指数阶差计算单元计算出各待运算数据对应的浮点乘法指数结果与最大浮点乘法指数结果之间的指数阶差,进而对各待运算数据对应的浮点尾数乘法结果进行对阶移位,这样就可以保证对多个待运算数据对应的尾数部分进行计算时,浮点尾数乘法结果是对齐的,从而保证计算结果的准确。

进一步地,所述指数选择单元包括第一级指数选择单元和第二级指数选择单元;所述指数阶差计算单元包括第一级指数阶差计算单元和第二级指数阶差计算单元;所述累加器包括第一级累加器和第二级累加器;

所述第一级指数选择单元用于从多个待运算数据对应的浮点乘法指数结果中,选择出第一级最大浮点乘法指数结果,并传输给所述第一级指数阶差计算单元和所述第二级指数选择单元;

所述第一级指数阶差计算单元用于计算各所述待运算数据对应的浮点乘法指数结果与所述第一级最大浮点乘法指数结果之间的指数阶差;

所述第一级累加器用于按照所述指数阶差对各所述待运算数据对应的浮点尾数乘法结果进行对阶移位,并对对阶移位后的浮点尾数乘法结果进行压缩并求和得到第一级尾数计算结果,并输出给所述第二级累加器;

所述第二级指数选择单元用于从多个所述第一级最大浮点乘法指数结果中,选择出第二级最大浮点乘法指数结果;

所述第二级指数阶差计算单元用于计算多个所述第一级最大浮点乘法指数结果与第二级最大浮点乘法指数结果之间的指数阶差;

所述第二级累加器用于根据各所述指数阶差,对各所述第一级尾数计算结果进行对阶移位,并对对阶移位后的第一级尾数计算结果进行压缩并求和得到所述尾数计算结果。

在上述实现方式中,通过两级累加单元的设计(其中第一级指数选择单元、第一级指数阶差计算单元和第一级累加器可以看作第一级累加单元,第二级指数选择单元、第二级指数阶差计算单元和第二级累加器可以看作第二级累加单元),从而可以一次性实现更多数量的待运算数据的卷积计算,从而显著提高所能支持的浮点数卷积运算性能。例如,假设单个累加器仅能实现4个数据的压缩、求和处理,那么通过上述方式就可以实现8个数据的压缩、求和处理,从而显著提高所能支持的浮点数卷积运算性能。

进一步地,所述第一级累加器包括:对阶移位器,用于按照所述指数阶差对各所述待运算数据对应的浮点尾数乘法结果进行对阶移位;第一符号处理电路,与所述对阶移位器连接,用于对对阶移位后的浮点尾数乘法结果进行符号处理;两级CSA32电路,与所述第一符号处理电路连接,用于对符号处理后的数据进行压缩;第二加法器,与所述两级CSA32电路的输出端连接,用于将所述两级CSA32电路输出的数据相加得到所述第一级尾数计算结果。

在上述实现方式中,通过对阶移位器进行浮点尾数乘法结果的对阶移位操作,通过第一符号处理电路实现符号处理,并通过两级CSA32电路即可实现基于符号的数据压缩处理,并通过第二加法器实现对于两级CSA32电路输出的数据的累加,这就可以快速准确的实现第一级的尾数部分的卷积运算,电路实现简单、可靠。

进一步地,所述对阶移位器具体用于:在所述待运算数据和所述待运算权重的数据类型为fp16或bf16或tf32类型时,按照所述指数阶差对各所述待运算数据对应的浮点尾数乘法结果进行对阶移位;在所述待运算数据和所述待运算权重的数据类型为fp32类型时,将所述待运算数据对应的低位浮点尾数乘法结果右移12位;其中,所述低位浮点尾数乘法结果为b12_d_l×b12_w_l对应的浮点尾数乘法结果,所述b12_d_l为所述待运算数据中的第0位至11位尾数,所述b12_w_l为所述待运算权重中的第0位至11位尾数。

在上述实现方式中,针对fp32类型的待运算数据,由于其尾数乘法是b24×b24运算,在采用本申请实施例所提供的方案时,可以拆分成4个B12×B12乘法实现,也即可以拆分成b12_d_l×b12_w_l、b12_d_l×b12_w_h、b12_d_h×b12_w_l、以及b12_d_h×b12_w_h四个B12×B12乘法实现。其中,b12_d_l为待运算数据中的第0位至11位尾数,b12_d_h为待运算数据中的第12位至23位尾数,b12_w_l为待运算权重中的第0位至11位尾数,b12_w_h为待运算权重中的第12位至23位尾数。而在拆分成4个B12×B12乘法实现后,需要对拆分后的4个B12×B12乘法的浮点尾数乘法结果进行移位,以保证对4个B12×B12乘法的浮点尾数乘法结果的累加可以得到正确的b24×b24乘法运算的浮点尾数乘法结果。为此,在上述实现过程中,将b12_d_l×b12_w_l乘法对应的浮点尾数乘法结果右移12位,即可保证b12_d_l×b12_w_l、b12_d_l×b12_w_h、b12_d_h×b12_w_l三个B12×B12乘法的浮点尾数乘法结果的对齐,而对于b12_d_h×b12_w_h对应的浮点尾数乘法结果则可以通过后续运算时在尾部赋值12’b0实现与左移12位相同的效果,实现b12_d_h×b12_w_h的浮点尾数乘法结果与b12_d_l×b12_w_l、b12_d_l×b12_w_h、b12_d_h×b12_w_l三个B12×B12乘法的浮点尾数乘法结果的对齐。这样,对阶移位器则只需要右移的对阶移位器即可,无需额外增设左移的对阶移位器,可以节约面积。

进一步地,所述第一符号处理电路用于:若4个对阶移位后的浮点尾数乘法结果的符号同时为负,则将计算第一标志信息并传输到第二级累加器;所述两级CSA32电路中的第一级CSA32电路用于对4个对阶移位后的浮点尾数乘法结果中的3个浮点尾数乘法结果进行部分积压缩,输出2个部分积pp0,pp1;所述两级CSA32电路中的第二级CSA32电路用于对4个对阶移位后的浮点尾数乘法结果中剩余的1个浮点尾数乘法结果和所述pp0、所述pp1进行部分积压缩,最终输出两个部分积。

可以理解,CSA32电路自带1bit的进位,正常使用时,进位默认0,从而可以用于标识浮点尾数乘法结果的符号同时为负的情况,从而利用该特点,通过两级CSA32电路即可快速、可靠地对4个对阶移位后的浮点尾数乘法结果进行处理,从而可以得到准确、可靠的运算后的部分积,进而保证最终的运算结果的准确性。同时,在上述实现方式中,在4个对阶移位后的浮点尾数乘法结果的符号同时为负时,不进行取反操作,而是计算第一标志信息并传输到第二级累加器,从而可以在第二级累加器中统一进行取反操作,从而可以减少取反操作的次数(至少可以将4次取反操作减少至1次),从而降低运算开销,提高电路的运算效率。

进一步地,所述第一符号处理电路还用于:若4个对阶移位后的浮点尾数乘法结果的符号不同时为负,则根据所述4个对阶移位后的浮点尾数乘法结果中符号为负的个数,生成3bit的标志值Neg[2:0],并对符号为负的所述浮点尾数乘法结果取反;所述两级CSA32电路中的第一级CSA32电路还用于对符号处理后的4个所述浮点尾数乘法结果中的3个浮点尾数乘法结果和Neg[0]进行部分积压缩,输出2个部分积pp0,pp1;所述两级CSA32电路中的第二级CSA32电路还用于对4个对阶移位后的浮点尾数乘法结果中剩余的1个浮点尾数乘法结果和所述pp0、所述pp1、进行Neg[1]进行部分积压缩,最终输出两个部分积。所述第二加法器用于对所述最终输出两个部分积和Neg[2]进行累加。

在上述实现方式中,通过4个对阶移位后的浮点尾数乘法结果中符号为负的个数,生成3bit的标志值Neg[2:0],从而可以利用CSA32电路自带1bit的进位,实现4输入的部分积压缩运算,从而可以在不额外增加硬件开销的基础上,实现最多3个负数的取反操作,降低面积开销。

进一步地,所述乘法器为8×4乘法器;所述第二级累加器包括:对阶移位器,用于根据各所述指数阶差,对各所述第一级尾数计算结果进行对阶移位;第二符号处理电路,与所述对阶移位器连接,用于对对阶移位后的第一级尾数计算结果进行符号处理;CSA42电路,与所述第二符号处理电路连接,用于对符号处理后的数据进行压缩;第三加法器,与所述CSA42电路的输出端连接,用于将所述CSA42电路输出的两个部分积和neg_cout进行累加得到所述尾数计算结果;其中,所述neg_cout为所述第二符号处理电路进行取反操作的次数。

上述实现方式中,CSA42电路可以实现对第一级尾数计算结果的快速压缩处理,同时第二符号处理电路可以实现对于第一级符号处理电路中未取反处理的结果进行符号处理,避免了在第一级符号处理电路中对4个符号同时为负的浮点尾数乘法结果进行取反操作,减少面积开销和功耗。

进一步地,所述乘法器为12×4乘法器;所述第二级累加器包括:对阶移位器,用于根据各所述指数阶差,对各所述第一级尾数计算结果进行对阶移位;第二符号处理电路,与所述对阶移位器连接,用于对对阶移位后的第一级尾数计算结果进行符号处理;两级CSA42电路,与所述第一符号处理电路连接,用于对符号处理后的数据进行压缩;第四加法器,与所述两级CSA42电路的输出端连接,用于将所述两级CSA42电路输出的两个部分积和neg_cout进行累加得到所述尾数计算结果;其中,所述neg_cout为所述第二符号处理电路进行取反操作的次数。

上述实现方式中,通过两级CSA42电路输出可以实现8个第一级尾数计算结果的快速压缩处理,同时第二符号处理电路可以实现对于第一级符号处理电路中未取反处理的结果进行符号处理,避免了在第一级符号处理电路中对4个符号同时为负的浮点尾数乘法结果进行取反操作,减少面积开销和功耗。

进一步地,所述定点数累加计算电路包括:两条并行的华莱士树CSA_Tree_H和CSA_Tree_L;所述CSA_Tree_H用于与奇数序号的乘法器连接,以对奇数序号的所述乘法器输出的部分积进行压缩,并输入第五加法器中进行累加得到result_H;所述CSA_Tree_L用于与偶数序号的乘法器连接,以对偶数序号的所述乘法器输出的部分积进行压缩,并输入第六加法器中进行累加得到result_L;所述定点数累加计算电路还包括第七加法器,与所述第五加法器和所述第六加法器连接,用于对所述result_H和所述result_L进行累加,得到所述定点卷积运算结果。

在上述实现发方式中,通过两条并行的华莱士树CSA_Tree_H和CSA_Tree_L,可以满足对于int4/uint4/int8/uint8的卷积运算需求,且两路并行运算也可以提高运算效率。此外,对于int8/uint8类型的数据而言,CSA_Tree_H和CSA_Tree_L分奇数和偶数序号进行乘法器输出数据的处理,因此对于int8/uint8类型的数据进行移位对齐时,可以针对CSA_Tree_H的输出统一进行移位,从而可以有效降低移位操作的次数,提高运算效率,同时,相比于只设置一个华莱士树的情况,还可以降低华莱士树的宽度,降低功耗。

进一步地,所述操作数包括对int8或uint8类型的待运算数据进行拆分后得到的4bit数据;所述定点数累加计算电路还包括移位器,设置于所述第五加法器和所述第七加法器之间,以对所述result_H进行左移4位的操作。

int8或uint8类型的待运算数据为8bit,因此可以拆分为两个4bit的数据,拆分后为保证数据运算的准确性,对于高位部分的4bit数据需要左移4位。而上述实现方式中利用移位器对result_H进行左移4位的操作,可在保证运算结果准确的前提下,仅进行一次移位操作,从而有效降低移位操作的次数,提高运算效率。

进一步地,所述乘法器为无符号数乘法器;所述定点数累加计算电路还包括第三符号处理电路、第四符号处理电路、第一Neg count计算单元和第二Neg count计算单元;其中:所述第三符号处理电路设置于所述CSA_Tree_H和奇数序号的所述乘法器之间,并用于获取各奇数序号的所述乘法器处理的操作数的符号;所述第四符号处理电路设置于所述CSA_Tree_L和偶数序号的所述乘法器之间,并用于获取各偶数序号的所述乘法器处理的操作数的符号;所述第三符号处理电路和所述第四符号处理电路还用于:对所连接的每个所述乘法器输出的部分积进行符号处理,若任一乘法器的两操作数的符号值异或运算结果为真,则对该乘法器输出的部分积取反;所述第一Neg count计算单元用于计算所述第三符号处理电路进行的取反次数neg_count_H;所述第二Neg count计算单元用于计算所述第四符号处理电路进行的取反次数neg_count_L;所述第五加法器用于对所述CSA_Tree_H的输出数据和所述neg_count_H进行累加得到所述result_H;所述第六加法器用于对所述CSA_Tree_L的输出数据和所述neg_count_L进行累加得到所述result_L。

在上述实现方式中,为实现对于无符号数乘法器的复用,通过在定点数累加计算电路中设计符号处理电路进行符号处理,并计算取反次数,可以在华莱士树的处理结果的基础上,结合取反次数得到正确的定点卷积运算结果。将定点负数的处理从定点和浮点共享的乘法路径上移动到了定点数累加计算电路中,缩短了浮点数的尾数乘法路径(即对浮点数的尾数进行运算的路径)。

本申请实施例还提供了一种卷积计算单元,包括:权重传输子单元,用于接收待运算权重;数据传输单元,用于接收待运算数据;前述任一种的卷积运算电路,与所述权重传输子单元和所述数据传输单元连接,用于根据所述待运算数据和所述待运算权重进行卷积运算;其中,所述卷积运算电路中运算的操作数为对所述待运算数据和所述待运算权重处理后得到的数据。

进一步地,所述数据传输单元包括:数据传输子单元,用于接收待选数据;数据选择器,分别与所述数据传输子单元和所述权重传输子单元连接,用于根据所述权重传输子单元传来的权重掩码从所述待选数据中选择出待运算数据。

本申请实施例还提供了一种AI运算阵列,包括至少一个前述的卷积计算单元。

本申请实施例还提供了一种AI算法架构的实现装置,包括:存储单元,用于存储待运算数据和待运算权重;访存控制单元,用于从所述存储单元获取所述待运算权重和所述待运算数据;前述的AI运算阵列,所述AI运算阵列用于根据所述待运算权重和所述待运算数据进行卷积运算。

进一步地,所述AI算法架构的实现装置还包括:权重浮点异常处理单元,用于判断所述访存控制单元获取到的所述待运算权重是否为denormal数据,在所述待运算权重为denormal数据时,将所述待运算权重的指数部分表示为1;数据浮点异常处理单元,用于判断所述访存控制单元获取到的所述待运算数据是否为denormal数据,在所述待运算数据为denormal数据时,将所述待运算数据的指数部分表示为1。

在上述实现方式中,通过权重浮点异常处理单元和数据浮点异常处理单元,在待运算权重和待运算数据进入卷积计算单元之前,就对denormal数据进行异常处理(即将指数部分表示为1),从而只需分别对待运算权重和待运算数据进行一次浮点数的异常处理,无需在每个卷积计算单元中再分别进行异常处理,可以将浮点数的异常处理次数减少到1,减少了重复的异常处理开销,且无需在每个卷积运算电路中单独设置处理异常的浮点数的电路,节约了面积开销。

也即,本申请通过将每个卷积运算电路中都需要进行的denormal数据异常处理统一在顶层的权重浮点异常处理单元和数据浮点异常处理单元中进行处理,每个卷积运算电路中就可以不再需要引入异常判断逻辑,优化了面积,降低了每个卷积运算电路中浮点数卷积的计算复杂度,提高了卷积运算速度。

进一步地,所述AI算法架构的实现装置还包括:数据定点绝对值处理单元用于对访存控制单元取出的待运算数据进行符号位分离和绝对值处理,以将处理后的绝对值数据和符号位数据传给后续的卷积运算电路;权重定点绝对值处理单元用于对访存控制单元取出的待运算权重进行符号位分离和绝对值处理,以将处理后的绝对值权重数据和符号位权重数据传给后续的卷积运算电路。

通过上述实现方式,输入至乘法器进行运算的数据是绝对值处理后的绝对值数据和绝对值权重数据,这就使得乘法器不需要进行符号处理,从而可以使得乘法器本身的设计更简单,也缩短了浮点数的尾数乘法路径,使得功耗更低。

本申请实施例还提供了一种处理器,包括前文所述的AI算法架构的实现装置。

本申请实施例还提供了一种电子部件,包括前文所述的处理器。

本申请实施例中还提供了一种电子设备,包括前文所述的处理器,或包括前文所述的电子部件。

附图说明

为了更清楚地说明本申请实施例的技术方案,下面将对本申请实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1为本申请实施例提供的一种AI算法架构的实现装置的基本结构示意图;

图2为本申请实施例提供的一种AI运算阵列的结构示意图;

图3为本申请实施例提供的一种卷积计算单元的基本结构示意图;

图4为本申请实施例提供的一种可选的卷积计算单元的结构示意图;

图5为本申请实施例提供的另一种可选的卷积计算单元的结构示意图;

图6为本申请实施例提供的一种卷积运算电路的基本结构示意图;

图7为本申请实施例提供的一种更具体的卷积运算电路的基本结构示意图;

图8为本申请实施例提供的另一种更具体的卷积运算电路的基本结构示意图;

图9为本申请实施例提供的一种尾数计算单元的连接结构示意图;

图10为本申请实施例提供的一种具体的尾数计算单元的结构示意图;

图11为本申请实施例提供的另一种具体的尾数计算单元的结构示意图;

图12为本申请实施例提供的一种具体的AI算法架构的实现装置的结构示意图;

图13为本申请实施例在图8基础上提供的一种更具体的卷积运算电路的结构示意图;

图14为本申请实施例提供的一种第一累加器的结构示意图;

图15-1为本申请实施例提供的一种第二累加器的结构示意图;

图15-2为本申请实施例提供的另一种第二累加器的结构示意图;

图16为本申请实施例提供的又一种具体的卷积运算电路的结构示意图;

图17为本申请实施例提供的一种可选的华莱士树的结构示意图;

图18为本申请实施例在图16的基础上提供的一种更具体的卷积运算电路的结构示意图;

图19为本申请实施例针对复用无符号乘法器的方案提供的一种具体的卷积运算电路的结构示意图;

图20为本申请实施例提供的另一种具体的AI算法架构的实现装置的结构示意图;

图21为本申请实施例针对复用4×4乘法器的方案提供的一种具体的卷积运算电路的结构示意图;

图22为本申请实施例提供的一种复用8×4乘法器时,可选的卷积计算单元的具体结构示意图;

图23为本申请实施例提供的一种复用12×4乘法器时,可选的卷积计算单元的具体结构示意图;

图24为本申请实施例提供的一种复用12×4无符号乘法器时,可选的卷积计算单元的具体结构示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。

为了支持不同数据类型的卷积运算,降低面积和功耗开销,本申请实施例中提供了一种卷积运算电路、卷积计算单元、AI运算阵列、AI算法架构的实现装置及相关设备(处理器、电子部件及电子设备等)。

为便于理解本申请实施例所提供的方案,下面从AI算法架构的实现装置出发对本申请实施例的方案进行说明。

可以参见图1所示,图1示出了本申请实施例中提供的AI算法架构的实现装置的结构示意图,包括:存储单元、访存控制单元和本申请实施例所提供的AI运算阵列。

存储单元用于存储待运算数据和待运算权重。访存控制单元用于从存储单元获取待运算权重和待运算数据。AI运算阵列用于根据待运算权重和待运算数据进行卷积运算。

在本申请实施例中,待运算权重和待运算数据为芯片使用过程中需要参与卷积运算的权重和数据。待运算数据可以为对图像、音频、通信数据、频谱信息等转换为二进制数后得到的数据。本申请实施例可应用于AI训练、金融、高精度计算、智能驾驶、安防、通信、频谱测量、智能推理等领域中的一个或多个领域。

在本申请实施例中,存储单元可以采用各类存储器实现,例如可以采用SPM(Scratch Pad Memory,记事本存储器)来实现,而访存控制单元则可以采用各类数据读取电路实现,但不作为限制。

在本申请实施例中,AI运算阵列的结构可以如图2所示,包括至少一个卷积计算单元。

可选的,在AI运算阵列中,如图2所示,相邻两个卷积计算单元的权重传输子单元可以相连、数据传输单元可以相连,以通过权重传输子单元之间的连接实现待运算权重的传输,通过数据传输单元之间的连接实现待运算数据的传输。

在本申请实施例中,卷积计算单元的结构如图3所示,包括:权重传输子单元、数据传输单元和本申请实施例所提供的卷积运算电路。

权重传输子单元用于接收访存控制单元从存储单元中取出并传输来的待运算权重;数据传输单元用于接收访存控制单元从存储单元中取出并传输来的待运算数据。

卷积运算电路与权重传输子单元和数据传输单元连接,用于根据待运算数据和待运算权重进行卷积运算。

可选的,如图4所示,数据传输单元可以包括数据传输子单元,用于接收待运算数据。

在实际应用过程中,存在传输来的数据为稀疏数据的情况,此时传输来的数据并非全部都用作待运算数据进行卷积运算,为此需要进行数据选择。为此,可选的,如图5所示,数据传输单元也可以包括数据传输子单元和数据选择器。数据传输子单元,用于接收访存控制单元从存储单元中取出并传输来的待选数据;权重传输子单元还会接收到与待选数据相应的权重掩码;数据选择器分别与数据传输子单元和权重传输子单元连接,用于根据权重传输子单元传来的权重掩码从待选数据中选择出待运算数据。具体的选择方式可以包括但不限于sparsity4:2方式。在本申请实施例中,权重传输子单元、数据传输子单元可以采用寄存器、缓存器等电子元件实现,但不作为限制。

可以参见图6所示,图6为本申请实施例中提供的卷积运算电路的基本结构示意图,包括:乘法器、定点数累加计算电路和浮点数累加计算电路。其中:

定点数累加计算电路和浮点数累加计算电路均分别与乘法器连接,实现对于乘法器的复用。

可以理解,本申请实施例中的乘法器可以为有符号乘法器和无符号数乘法器。

还可以理解,本申请实施例中采用的乘法器位宽可以根据处理器被设计的主要应用场景来决定。例如,对于安防、视频等AI算法和AI推理应用领域,由于基于定点数的卷积算法的应用比较广泛,因此可以采用8×4乘法器、4×4乘法器等实现。又例如,在AI训练、金融、高精度计算等对精度要求较高的应用领域,由于基于浮点数的卷积算法的应用比较广泛,因此可以采用12×4乘法器、12×8乘法器等实现。

可以理解,乘法器位宽是指乘法器所需的两个操作数(分别记为权重操作数和数据操作数)的位宽。以8×4乘法器为例,其要求权重操作数的位宽为8bit,数据操作数的位宽为4bit。以12×4乘法器为例,其要求权重操作数的位宽为12bit,数据操作数的位宽为4bit。

对于需要进行运算的待运算数据和该待运算数据对应的待运算权重而言,其位宽可能并不能直接满足乘法器的位宽要求,因此需要先将待运算数据和待运算权重进行拆分或者扩展等预处理,以得到符合该乘法器位宽要求的操作数。示例性的,对于8×4乘法器而言,若待运算数据和待运算权重为int4/uint4类型的数据,那么需要对待运算权重进行扩展,以得到8bit的权重操作数;若待运算数据和待运算权重为int8/uint8类型的数据,那么需要对待运算数据进行拆分,以两个得到4bit的数据操作数。

为此,在本申请实施例中,可参见图7所示,卷积运算电路还可以包括:数据预处理单元和权重预处理单元。其中,数据预处理单元与各乘法器连接,通过数据预处理单元对待运算数据进行拆分或者扩展等预处理,得到各乘法器所需的两个操作数中的一个操作数(即数据操作数)。权重预处理单元与各乘法器连接,通过权重预处理单元对待运算权重进行预处理,得到各所述乘法器所需的两个操作数中的另一个操作数(即权重操作数)。

可以理解的是,对于数据类型本身与乘法器的需求匹配的情况,则可以不进行拆分或扩展。例如,对于8×4乘法器而言,若待运算数据和待运算权重为int4/uint4类型的数据,则对于待运算数据无需进行扩展。又例如,对于8×4乘法器而言,若待运算数据和待运算权重为int8/uint8类型的数据,则对于待运算权重无需进行拆分。

在本申请实施例中,数据预处理单元和权重预处理单元可以通过数据拆分电路或数据扩展电路实现,具体结构可参见现有技术,本申请实施例中不做赘述。

还可以理解,在本申请实施例中,定点数累加计算电路用于在操作数为定点数时,对乘法器输出的部分积进行压缩并对压缩后的部分积进行相加处理,得到定点卷积运算结果。而浮点数累加计算电路则用于在操作数为浮点数时,根据操作数的指数部分进行指数计算得到浮点乘法指数结果,并根据乘法器输出的部分积进行尾数计算得到尾数计算结果。

为实现对于浮点数的有效运算,在本申请实施例的一种可行实施方式中,参见图8所示,浮点数累加计算电路可以包括:

尾数计算单元,与乘法器连接,用于对乘法器输出的针对同一待运算数据的部分积进行压缩并求和,得到对应该待运算数据的浮点尾数乘法结果。

指数计算单元,用于对待运算数据和待运算数据对应的待运算权重的指数部分进行计算,得到针对该待运算数据的浮点乘法指数结果;

累加单元,与尾数计算单元和指数计算单元连接,用于从多个待运算数据对应的浮点乘法指数结果中,选择出最大浮点乘法指数结果,以及用于对多个待运算数据对应的浮点尾数乘法结果进行压缩并求和得到尾数计算结果。

示例性的,可参见图9所示,尾数计算单元可以包括:

压缩电路,与乘法器连接,用于对乘法器输出的针对同一待运算数据的部分积进行压缩。

第一加法器,与压缩电路的输出端连接,用于将压缩电路输出的部分积求和,得到对应该待运算数据的浮点尾数乘法结果。

可以理解,压缩电路的设计应当与乘法器的位宽相适配,以便能进行有效的压缩处理。

例如,对于8×4乘法器而言,参见图10所示,压缩电路可以包括两级的CSA42电路(CSA构成的4-2压缩器),其中第一级CSA42电路包括两个并行的CSA42电路,第二级CSA42电路包括一个单独的CSA42电路。这是由于,对于fp16/bf16/tf32类型的数据,尾数部分需要通过乘法器进行运算,运算位宽为b12×b12(对于fp32类型的数据,尾数部分需要通过乘法器进行运算,运算位宽为b24×b24,可以拆分为4个b12×b12进行运算),因此针对一个待运算数据和该待运算数据的待运算权重,需要6个8×4乘法器,会输出12个部分积。这12个部分积可以拼接为8个部分积,然后通过2个CSA42电路可以将8个部分积压缩为4个部分积,然后再通过一个CSA42电路可以将这4个部分积压缩为2个部分积,输入第一加法器中进行累加。

又例如,对于12×4乘法器而言,参见图11所示,压缩电路可以包括两个并行的CSA32(CSA构成的3-2压缩器)电路和一个CSA42电路。这是由于,对于fp16/bf16/tf32类型的数据,尾数部分需要通过乘法器进行运算,运算位宽为b12×b12(对于fp32类型的数据,尾数部分需要通过乘法器进行运算,运算位宽为b24×b24,可以拆分为4个b12×b12进行运算),因此针对一个待运算数据和该待运算数据的待运算权重,需要3个12×4乘法器,会输出6个部分积。这6个部分积可以通过2个CSA32电路可以将6个部分积压缩为4个部分积,然后再通过一个CSA42电路可以将这4个部分积压缩为2个部分积,输入第一加法器中进行累加。

可以理解,当乘法器选用其他位宽时,例如选用4×4乘法器、8×8乘法器、12×8乘法器等时,只需按照所需的乘法器数量选择相应的CSA电路构成压缩电路即可,选择原理与前述示例一致。

在本申请实施例的一种可行实施方式中,参见图12所示,AI算法架构的实现装置中还可以包括:权重浮点异常处理单元和数据浮点异常处理单元。其中:

权重浮点异常处理单元,用于判断访存控制单元获取到的待运算权重是否为规范浮点数,在待运算权重不为规范浮点数时,对待运算权重设置异常标志位;

数据浮点异常处理单元,用于判断访存控制单元获取到的待运算数据是否为规范浮点数,在待运算数据不为规范浮点数时,对待运算数据设置异常标志位。

此时,指数计算单元还可以用于:对待运算数据和待运算权重中携带的异常标志位进行检查,在存在表征数据为denormal的异常标志位时,将具有该异常标志位的待运算数据或待运算权重的指数部分表示为1。这样,不需要在对于指数部分的计算路径上引入浮点数denormal的判断逻辑,可以节省指数部分的计算开销。

此外,在本申请实施例的另一种可行实施方式中,权重浮点异常处理单元可以用于判断访存控制单元获取到的所述待运算权重是否为denormal数据,在待运算权重为denormal数据时,将待运算权重的指数部分表示为1。

数据浮点异常处理单元,用于判断访存控制单元获取到的待运算数据是否为denormal数据,在待运算数据为denormal数据时,将待运算数据的指数部分表示为1。

这样,待运算权重和待运算数据在进入到各卷积运算电路之前,就已经预先针对为denormal数据的待运算权重和待运算数据的指数部分的修改,从而无需在每个卷积运算电路中单独引入浮点数denormal的判断逻辑和数据修改逻辑,节约了浮点指数处理的面积开销。

当然,在本申请实施例中也可以在指数部分的计算路径上,例如在指数计算单元中加入判断逻辑进行数据是否为denormal数据的检测,从而在检测到数据为denormal数据时,将数据的指数部分表示为1。

在本申请实施例中,权重浮点异常处理单元和数据浮点异常处理单元可以采用比较电路等具有数据比较功能的电路实现,但不作为限制。

在本申请实施例中,指数计算单元还可以用于:在用于计算的所述待运算数据和所述待运算权重的指数部分中,存在至少一个指数部分为0时,确定浮点乘法指数结果为0。这样,通过将存在指数部分为0的指数计算情况中的浮点乘法指数结果确定为0,从而可以保证指数运算的正确,一方面可以提高指数部分运算效率(存在至少一个指数部分为0时,直接确定浮点乘法指数结果为0,无需再进行运算),而另一方面也可以避免按照正常累加后,造成运算出错。

可以理解,在本申请实施例中,指数计算单元可以由加法器电路实现,并可以直接与卷积计算单元中的权重传输子单元和数据传输单元连接,以获取到未经预处理的待运算数据和待运算权重。

在本申请实施例中,数据预处理单元还可以用于根据待运算数据中的异常标志位exp_is_0对待运算数据中的尾数隐藏高位进行处理,具体而言,可以在exp_is_0为真时将待运算数据中的尾数隐藏高位置0,否则将待运算数据中的尾数隐藏高位置1。类似的,权重预处理单元还可以用于根据待运算权重中的异常标志位exp_is_0对待运算权重中的尾数隐藏高位进行处理,具体而言,可以在exp_is_0为真时将待运算权重中的尾数隐藏高位置0,否则将待运算权重中的尾数隐藏高位置1。

在本申请实施例中,累加单元可以包括:

指数选择单元,用于从多个待运算数据对应的浮点乘法指数结果中,选择出最大浮点乘法指数结果;

指数阶差计算单元,与指数选择单元连接,用于计算各待运算数据对应的浮点乘法指数结果与最大浮点乘法指数结果之间的指数阶差;

累加器,与指数阶差计算单元连接,用于按照指数阶差对各待运算数据对应的浮点尾数乘法结果进行对阶移位,并对对阶移位后的浮点尾数乘法结果进行压缩并求和得到尾数计算结果。

其中,指数选择单元可以通过数据比较器实现,指数阶差计算单元可以通过减法器电路实现,但不作为限制。

可选的,累加单元可分为多级,从而提高所能支持的浮点数卷积运算性能。

示例性的,参见图13所示,可分为两级累加单元,其中第一级累加单元包括第一级指数选择单元、第一级指数阶差计算单元和第一级累加器;第二级累加单元包括第二级指数选择单元、第二级指数阶差计算单元和第二级累加器。

其中,第一级指数选择单元用于从多个待运算数据对应的浮点乘法指数结果中,选择出第一级最大浮点乘法指数结果,并传输给第一级指数阶差计算单元和第二级指数选择单元;

第一级指数阶差计算单元用于计算各待运算数据对应的浮点乘法指数结果与第一级最大浮点乘法指数结果之间的指数阶差;

第一级累加器用于按照指数阶差对各待运算数据对应的浮点尾数乘法结果进行对阶移位,并对对阶移位后的浮点尾数乘法结果进行压缩并求和得到第一级尾数计算结果,并输出给第二级累加器;

第二级指数选择单元用于从多个第一级最大浮点乘法指数结果中,选择出第二级最大浮点乘法指数结果;

第二级指数阶差计算单元用于计算多个第一级最大浮点乘法指数结果与该第二级最大浮点乘法指数结果之间的指数阶差;

第二级累加器用于根据各指数阶差,对第一级尾数计算结果进行对阶移位,并对对阶移位后的第一级尾数计算结果进行压缩并求和得到尾数计算结果。

可以理解,累加单元也可以分为3级或更多级,或者仅有1级,对此本申请实施例不做限定。

可选的,在上述多级累加单元的实施例中,参见图14所示,第一级累加器可以包括:

对阶移位器,用于按照指数阶差对各待运算数据对应的浮点尾数乘法结果进行对阶移位;

第一符号处理电路,与对阶移位器连接,用于对对阶移位后的浮点尾数乘法结果进行符号处理;

两级CSA32电路,与第一符号处理电路连接,用于对符号处理后的数据进行压缩;

第二加法器,与两级CSA32电路的输出端连接,用于将两级CSA32电路输出的数据相加得到第一级尾数计算结果。

其中,第一符号处理电路可以用于:

若4个对阶移位后的浮点尾数乘法结果的符号同时为负,记录第一标志信息并传输到第二级累加器;

两级CSA32电路中的第一级CSA32电路用于对4个对阶移位后的浮点尾数乘法结果中的3个浮点尾数乘法结果进行部分积压缩,输出2个部分积pp0,pp1;

两级CSA32电路中的第二级CSA32电路用于对4个对阶移位后的浮点尾数乘法结果中剩余的1个浮点尾数乘法结果和pp0、pp1进行部分积压缩,最终输出两个部分积。

若4个对阶移位后的浮点尾数乘法结果的符号不同时为负,则根据4个对阶移位后的浮点尾数乘法结果中符号为负的个数,生成3bit的标志值Neg[2:0],并对符号为负的浮点尾数乘法结果取反;

两级CSA32电路中的第一级CSA32电路还用于对符号处理后的4个浮点尾数乘法结果中的3个浮点尾数乘法结果和Neg[0]进行部分积压缩,输出2个部分积pp0,pp1;

两级CSA32电路中的第二级CSA32电路还用于对4个对阶移位后的浮点尾数乘法结果中剩余的1个浮点尾数乘法结果和pp0、pp1、进行Neg[1]进行部分积压缩,最终输出两个部分积。

第二加法器用于对最终输出两个部分积和Neg[2]进行累加。

可以理解,Neg[2:0]可以按照下述公式进行取值:

Neg[2:0]=(neg_count==3)?{1’b1,1’b1,1’b1}:

(neg_count==2)?{1’b0,1’b1,1’b1}:

(neg_count==1)?{1’b0,1’b0,1’b1}:3’b0

其中,neg_count表示符号为负的个数,上述公式表示:若neg_count==3,则Neg[2:0]={1’b1,1’b1,1’b1},若neg_count==2,则Neg[2:0]={1’b0,1’b1,1’b1},若neg_count==1,则Neg[2:0]={1’b0,1’b0,1’b1},否则Neg[2:0]={1’b0,1’b0,1’b0}。其中,m’b1表征m比特的1,m’b0表征m比特的0。

可选的,在本申请实施例中,第二级累加器可以包括:

对阶移位器,用于根据各指数阶差,对各第一级尾数计算结果进行对阶移位;

第二符号处理电路,与对阶移位器连接,用于对对阶移位后的第一级尾数计算结果进行符号处理。

压缩电路,与第二符号处理电路连接,用于对符号处理后的数据进行压缩。

第三加法器,与压缩电路的输出端连接,用于将压缩电路输出的数据和neg_cout进行累加得到尾数计算结果;其中,neg_cout为第二符号处理电路进行取反操作的次数,也即第一级尾数计算结果中符号为负的个数。

可以理解,压缩电路可以根据设计的每次需进行的计算的待运算数据数量进行选择与配置。

示例性的,可以选择一个CSA42电路作为压缩电路,例如图15-1所示,从而实现对于4个第一级尾数计算结果的累加。该电路可以应用于选择8×4乘法器的情况。

示例性的,也可以2个并行的CSA42电路和1个第二级的CSA42电路一起作为压缩电路,例如图15-2所示,此时可以实现8个第一级尾数计算结果的累加。该电路可以应用于选择12×4乘法器的情况。

可以理解,本申请实施例中可以根据设计需求采用不同数量的CSA42电路构成压缩电路,以上两种具体的压缩电路实现结构并不作为对本申请实施例的限制。

在本申请实施例中,第二符号处理电路的功能与第一符号处理电路一致,在此不再赘述。

可以理解,对于fp16或bf16或tf32类型的待运算数据和待运算权重,其尾数部分执行的是b12×b12运算,而对于fp32类型的待运算数据和待运算权重,其尾数部分执行的是b24×b24运算,因此可以将fp32类型的待运算数据和待运算权重的尾数部分的卷积运算拆分为4个b12×b12运算,即可以拆分成b12_d_l×b12_w_l、b12_d_l×b12_w_h、b12_d_h×b12_w_l、以及b12_d_h×b12_w_h四个B12×B12乘法实现。其中,b12_d_l为待运算数据中的第0位至11位尾数,b12_d_h为待运算数据中的第12位至23位尾数,b12_w_l为待运算权重中的第0位至11位尾数,b12_w_h为待运算权重中的第12位至23位尾数。

而在拆分成4个B12×B12乘法实现后,由于每个B12×B12乘法是单独运算的,若直接进行4个B12×B12乘法的浮点尾数乘法结果的累加,就会忽略了拆分后的数据和权重之间本身存在的位阶差,因此需要先进行4个B12×B12乘法的浮点尾数乘法结果的对齐。

为此,在本申请实施例的一种可行实施方式中,第一累加器中的对阶移位器可以在待运算数据和待运算权重的数据类型为fp16或bf16或tf32类型时,按照前述计算出指数阶差的方式,基于指数阶差对各待运算数据对应的浮点尾数乘法结果进行对阶移位。而在待运算数据和待运算权重的数据类型为fp32类型时,则将待运算数据对应的低位浮点尾数乘法结果右移12位;其中,低位浮点尾数乘法结果为b12_d_l×b12_w_l对应的浮点尾数乘法结果。对于其他几个b12×b12运算对应的浮点尾数乘法结果则不做移位操作,而是等到在两级CSA32电路的运算过程中,对b12_d_h×b12_w_h对应的浮点尾数乘法结果在尾部增加12bit的0,从而实现对于b12_d_h×b12_w_h对应的浮点尾数乘法结果的左移12位操作,保证从第一级累加器输出的最终运算结果是正确的B24×B24乘法的浮点尾数乘法结果。

可以理解,以上方案中,对阶移位器只需要采用右移的对阶移位器即可,无需额外设置左移的对阶移位器,可以节约面积。

但是,在本申请实施例的另一种可行实施方式中,也可以在采用右移的对阶移位器的同时,再需额外设置左移的对阶移位器,从而在待运算数据和待运算权重的数据类型为fp32类型时,将待运算数据对应的低位浮点尾数乘法结果右移12位,将待运算数据对应的高位浮点尾数乘法结果左移12位。其中,低位浮点尾数乘法结果为b12_d_l×b12_w_l对应的浮点尾数乘法结果,高位浮点尾数乘法结果为b12_d_h×b12_w_h对应的浮点尾数乘法结果。此时,在两级CSA32电路的运算过程中,无需对b12_d_h×b12_w_h对应的浮点尾数乘法结果在尾部增加12bit的0,直接按照前文介绍的运算逻辑对移位后的4个浮点尾数乘法结果进行压缩处理即可,这样也可以实现B24×B24乘法所拆分出的4个B12×B12乘法的浮点尾数乘法结果的对其,保证第一级累加器输出的最终运算结果是正确的B24×B24乘法的浮点尾数乘法结果。

为实现对于定点数的有效运算,在本申请实施例的一种可行实施方式中,参见图16所示,定点数累加计算电路可以包括:两条并行的华莱士树CSA_Tree_H和CSA_Tree_L,以及第五加法器、第六加法器和第七加法器。

可选的,华莱士树的实现结构可以参见图17所示,但不作为限制。

可选的,在本申请实施例中,CSA_Tree_H用于与奇数序号的乘法器连接,以对奇数序号的乘法器输出的部分积进行压缩,并输入第五加法器中进行累加得到result_H;

CSA_Tree_L用于与偶数序号的乘法器连接,以对偶数序号的乘法器输出的部分积进行压缩,并输入第六加法器中进行累加得到result_L;

定点数累加计算电路还包括第七加法器,与第五加法器和第六加法器连接,用于对result_H和result_L进行累加,得到定点卷积运算结果。

可以理解,定点数累加计算电路还可以包括移位器,移位器设置于第五加法器和所述第七加法器之间,例如图18所示。这样,在待运算数据和待运算权重为int8或uint8类型时,可以通过对result_H进行左移4位的操作,保证最终的计算结果的准确性。当然,在本申请实施例中,移位器也可以设置于乘法器与CSA_Tree_H之间,以对每一个输入至CSA_Tree_H中的部分积进行左移4位的操作,此时同样可以保证最终的计算结果的准确性。

可以理解的是,在乘法器为无符号数乘法器时,由于乘法器中进行的是无符号数的运算,因此为了保证对于有符号数进行运算时运算也是准确的,可以在定点数累加计算电路中设置第三符号处理电路、第四符号处理电路、第一Neg count计算单元和第二Negcount计算单元,例如图19所示。

其中:

第三符号处理电路设置于CSA_Tree_H和奇数序号的乘法器之间,并用于获取各奇数序号的乘法器处理的操作数的符号;

第四符号处理电路设置于CSA_Tree_L和偶数序号的乘法器之间,并用于获取各偶数序号的乘法器处理的操作数的符号;

第三符号处理电路和第四符号处理电路还用于:对所连接的每个乘法器输出的部分积进行符号处理,若任一乘法器的两操作数的符号值异或运算结果为真,则对该乘法器输出的两个部分积取反;

第一Neg count计算单元用于计算并输出第三符号处理电路进行的取反次数neg_count_H;第二Neg count计算单元用于计算并输出第四符号处理电路进行的取反次数neg_count_L;

第五加法器用于对CSA_Tree_H的输出数据和neg_count_H进行累加得到result_H;

第六加法器用于对CSA_Tree_L的输出数据和neg_count_L进行累加得到result_L。

这样,通过在定点数累加计算电路中设计符号处理电路进行符号处理,并计算取反次数,从而可以基于对无符号数的处理结果的基础上,结合取反次数得到准确的定点卷积运算结果。将定点负数的处理从定点和浮点共享的乘法路径上移动到了定点数累加计算电路中,缩短了浮点数的尾数乘法路径。

而为了支持无符号数的运算,在本申请实施例提供的AI算法架构的实现装置中,还可以设置数据定点绝对值处理单元和权重定点绝对值处理单元,例如图20所示。

数据定点绝对值处理单元用于对访存控制单元取出的待运算数据进行符号位分离和绝对值处理,以将处理后的绝对值数据和符号位数据传给后续的卷积运算电路。

权重定点绝对值处理单元用于对访存控制单元取出的待运算权重进行符号位分离和绝对值处理,以将处理后的绝对值权重数据和符号位权重数据传给后续的卷积运算电路。

这样,经过绝对值处理的数据在数据预处理单元和权重预处理单元中,不需要进行额外的符号处理,乘法操作采用统一的无符号乘法进行即可,可以节省乘法器部分积选择时由于符号位导致的部分积选择开销,将定点负数的处理从定点和浮点共享的乘法路径上移动到了定点数累加计算电路中,缩短了浮点数的尾数乘法路径。

需要说明的是,对于有符号数据类型的定点数卷积计算时,在进行操作数选择时需要根据数据类型对操作数进行符号处理。

示例性的,以8×4乘法器为例,对于int4/uint4卷积运算,数据预处理单元需要进行以下处理:

B4_d[i]=b4_d[i][3:0];

B4_d_sign[i]=int4&b4_d[i][3]。

即确定输入至第i个乘法器中的数据操作数B4_d[i]=b4_d[i][3:0],其中b4_d[i][3:0]表征第i个int4/uint4类型的待运算数据。B4_d_sign[i]为数据操作数的符号,其中int4&b4_d[i][3]表征若待运算数据的类型为int4,则B4_d_sign[i]等于b4_d[i][3](即待运算数据的最高为(即第3位));若待运算数据的类型为uint4,则B4_d_sign[i]等于0。

权重预处理单元中需要进行以下处理:

B8_w[i]={{4{int4&b4_w[i][3]}},b4_w[i][3:0]}

B8_w_sign[i]=int4&b4_w[i][3];

即对待运算权重b4_w[i][3:0]进行扩展,扩展方式为在前面增加4个的符号数,得到权重操作数B8_w[i],i表征第i个待运算权重。int4&b4_w[i][3]表征若待运算权重的类型为int4,则符号操作数的符号数B8_w_sign[i]等于b4_w[i][3](即待运算权重的最高为(即第3位));若待运算权重的类型为uint4,则B8_w_sign[i]等于0。

从上文可见,对于有符号数据类型的定点数卷积计算时,在进行操作数选择时需要由数据预处理单元和权重预处理单元根据数据类型对操作数进行符号处理。而在图20所示的无符号数乘法器的方案中,通过数据定点绝对值处理单元和权重定点绝对值处理单元预先进行了符号分离处理,因此数据预处理单元和权重预处理单元中无需进行符号处理,从而可以节省乘法器部分积选择时由于符号位导致的部分积选择开销,将定点负数的处理从定点和浮点共享的乘法路径上移动到了定点数累加计算电路中,缩短了浮点数的尾数乘法路径。

可以理解,数据定点绝对值处理单元和权重定点绝对值处理单元可以采用数据复制电路和绝对值运算电路实现,但不作为限制。

可以理解,在采用4×4乘法器时,可以采用4个并行的华莱士树结构实现,例如图21所示。此时,CSA_Tree_1用于与序号为4n的乘法器连接,CSA_Tree_2用于与序号为4n+1的乘法器连接,CSA_Tree_3用于与序号为4n+2的乘法器连接,CSA_Tree_4用于与序号为4n+3的乘法器连接。从而,针对int8或uint8类型的数据,只需对CSA_Tree_4输出的结果左移8位,对CSA_Tree_2和CSA_Tree_3输出的结果左移4位后进行4个华莱士树的输出结果的累加即可。

在本申请实施例中,可以在每一个卷积运算电路的累加单元的输出端设置一个规格化处理单元,以将每一个卷积运算电路中对于浮点数的尾数计算结果和最大浮点乘法指数结果进行规格化,输出满足IEEE754规范的浮点数。

在本申请实施例中,规格化处理单元可以通过已有的各类规范数据格式的电路实现,具体实现结构在本申请实施例中不做限制。

为便于更清楚的说明本申请实施例的方案,下面以图22所示的卷积计算单元、图23所示的卷积计算单元、以及图24所示的卷积计算单元为例,对本申请实施例做示例说明:

示例1,以图22所示的卷积计算单元为例进行说明,其中,华莱士树的结构可参见图17所示,尾数计算单元的结构可参见图10所示,第一级累加器的结构如图14所示,第二级累加器的结构如图15-1所示。

假设AI算法架构的实现装置如图12所示,权重浮点异常处理单元和数据浮点异常处理单元预先进行待运算权重和待运算数据的denormal异常检测,并对存在denormal异常的待运算权重和待运算数据设置denormal异常标志位。

在图22所示的卷积计算单元中,处理流程如下:

步骤1,数据选择器采用sparsity4:2稀疏卷积运算从待选数据中选择1/2的待运算数据参与卷积计算。

步骤2,数据预处理单元根据数据类型完成乘法器的数据操作数的选择。若待运算数据的数据类型为浮点数,根据denormal异常标志位对待运算数据的尾数的隐藏高位进行处理。若为有符号数int4/int8对操作数进行符号位扩展。根据数据类型,若待运算数据的为浮点数,还需要将选择后的待运算数据进行复制并拆分成多个4bits的数据操作数映射到乘法器。

步骤3,权重预处理单元根据数据类型完成乘法器的权重操作数的选择。若待运算权重的数据类型为浮点数根据denormal异常标志位对待运算权重的尾数的隐藏高位进行处理。若为有符号数int4/int8对操作数进行符号位扩展。根据数据类型,若待运算权重的为浮点数,还需要对待运算权重进行复制并拆分成多个8bits的权重操作数映射到乘法器。

步骤4,定点和浮点运算共享的乘法器包含128个multp8×4乘法器,乘法器单元根据数据预处理单元选择数的数据和权重预处理单元选择出来的权重完成乘法结果的中间结果计算。每个multp8×4的输入根据8bit的weight(权重操作数)和4bits的data(数据操作数)以及weight和data的符号计算B8×B4的乘法中间结果计算并输出2个部分积。

步骤5,定点卷积数据类型Int4/uint4/int8/uint8在复用统一的莱士压缩树CSA_Tree_H和CSA_Tree_L的基础上,完成multp8×4乘法器输出的中间结果的累加计算。其中,华莱士树采用高低位分离的方法实现,CSA_Tree_H与奇数序号的乘法器相连,而CSA_Tree_L与偶数序号的乘法器相连。

步骤4中的128个multp8×4乘法器可以产生256个定点乘法部分积,通过部分积压缩电路CSA_Tree_H和CSA_Tree_L以及加法器累加成1个定点卷积结果。CSA_Tree_H和CSA_Tree_L的电路实现结构可参见图22所示,分别采用了6级18bits位宽的csa42压缩电路将128个部分积压缩到2个部分积。

下面分别针对待运算数据和待运算权重为int4/uint4的情况,以及待运算数据和待运算权重为int8/uint8的情况对定点数运算逻辑进行描述:

(1)对于int4/uint4卷积运算,int4和uint4数据类型的待运算数据和待运算权重到乘法器multp8×4的映射方法为:

For(i=0;i<128;i++){

B8_w[i]={{4{int4&b4_w[i][3]}},b4_w[i][3:0]}

B4_d[i]=b4_d[i][3:0];

B8_w_sign[i]=int4&b4_w[i][3];

B4_d_sign[i]=int4&b4_d[i][3];

{pp0[i],pp1[i]}=multp8×4(B8_w[i],B4_d[i],B8_w_sign[i],B4_d_sign[i]);

}

在本申请实施例中,i表征第i个待运算数据和待运算权重,B8_w[i]为8bit大小的权重操作数,B4_d[i]为4bit大小的数据操作数,B8_w_sign[i]表征权重操作数对应的符号值,B4_d_sign[i]表征数据操作数对应的符号值。后续不再重复说明。

需要说明的是,在本申请实施例中,公式X=a&b表征若a和b同时为真b,则X为真,否则X为假。公式{4{a}}表征将a复制4次。公式{pp0[i],pp1[i]}=multp8×4(B8_w[i],B4_d[i],B8_w_sign[i],B4_d_sign[i])表征8×4乘法器基于输入的B8_w[i],B4_d[i],B8_w_sign[i],B4_d_sign[i]输出两个部分积pp0[i],pp1[i]。后文对同类公式不再做重复说明。

需要说明的是,在本申请实施例中,d[i][n:m]表征第i个待运算数据的第m至n位数据,w[i][n:m]表征第i个待运算权重的第m至n位数据,相应的,d[i][3]即表征第i个待运算数据的第3位数据,w[i][3]即表征第i个待运算权重的第3位数据。

在本申请实施例中,Bk_w或bk_w表征kbit大小的权重(待运算权重或权重操作数),Bk_d或bk_d表征kbit大小的数据(待运算数据或数据操作数),后续不再单独说明。

也即,在本示例中,权重预处理单元对每个4bits的待运算权重b4_w[i]进行符号位扩展,扩展后得到的权重操作数为8bits,表示为b8_w[i];将扩展后的b8_w[i]和待运算数据b4_d[i](刚好4bit,无需进行扩展或拆分,直接作为数据操作数)以及乘法操作数符号位b8_w_sign[i]和b4_d_sign[i]分别映射到每个multp8×4乘法器,输出的2个部分积分别为pp1[i]和pp0[i],其中pp1[i]+pp0[i]=b8_w[i]×b4_d[i]。

将128个待运算权重和待运算数据通过上述映射方式映射到128个multp8×4乘法器,分别产生128个部分积pp0和128个部分积pp1。

将i为奇数的部分积pp1[i]和pp0[i]送到高位华莱士树CSA_Tree_H压缩成2个部分积,压缩后的2个部分积相加得到高位卷积计算结果result_H。

将i为偶数的部分积pp1[i]和pp0[i]送到低位华莱士树CSA_Tree_L压缩成2个部分积,压缩后的2个部分积相加得到低位卷积计算结果result_L。

低位和高位的卷积结果相加完成int4/uint4的DP128(即128个待运算数据进行卷积运算)的卷积结果:result=result_H+result_L。

(2)对于int8/uint8卷积运算:

将每个int8/uint8的b8×b8(即8bit×8bit)乘法运算映射到2个multp8×4乘法器,具体为:将每个b8×b8运算拆分成2个b8×b4运算映射到2个multp8×4中。

具体地,b8×b8=b8_w×{b8_d[7:4],b8_d[3:0]}=(b8_w×b8_d[7:4]<<4)+b8_w×b8_d[3:0]。

其中,b8_w表征8bit的待运算权重,b8_d[7:4]表征待运算数据的第4至7位,b8_d[3:0]表征待运算数据的第0至3位。<<为左移符号,公式a<

int8/uint8数据类型到乘法器multp8×4的映射方法为:

For(i=0;i<64;i++){

B8_w[i]=b8_w[i][7:0];

B8_w_sign[i]=int8&b8_w[i][7];

B4_d_l[i]=b8_d[i][3:0];

B4_d_sign_l[i]=0;

B4_d_h[i]=b8_d[i][7:4];

B4_d_sign_h[i]=int8&b8_d[i][7];

{pp0[i×2+0],pp1[i×2+0]}=multp8×4(B8_w[i],B4_d_l[i],B8_w_sign[i],B4_d_sign_l[i]);

{pp0[i×2+1],pp1[i×2+1]}=multp8×4(B8_w[i],B4_d_h[i],B8_w_sign[i],B4_d_sign_h[i]);

}

在上述实现过程中,每次循环产生的4个部分积pp0[i×2+0]、pp1[i×2+0]、pp0[i×2+1]和pp1[i×2+1]。而b8_w[i]×b8_d[i]的结果为:(pp1[i×2+1]<<4)+(pp0[i×2+1]<<4)+pp1[i×2]+pp0[i×2]。

为快速得到该结果,在本申请实施例中,将64个部分积pp1[i×2+1]和64个部分积pp0[i×2+1]送到高位华莱士树CSA_Tree_H压缩成2个部分积,这2个部分积相加得到result_H。

将64个部分积pp1[i×2]和64个部分积pp0[i×2]送到低位华莱士树CSA_Tree_L压缩成2个部分积,这2个部分积相加得到低位卷积计算结果result_L。

低位卷积结果result_L进行符号位扩展和高位的卷积结果相加完成int8/uint8的DP64(即64个待运算数据进行卷积运算)的卷积结果:result=(result_H<<4)+sign_extend(result_L)。

这样,相比于直接对pp0[i×2+0]、pp1[i×2+0]、pp0[i×2+1]和pp1[i×2+1]4个部分积一起进行压缩的方式而言,可以将csa42压缩器的位宽从20bits宽度缩减到16bits宽度,从而有效的节约CSA压缩树的面积。同时,可以将左移操作在result_H后进行操作,无需对每一个pp0[i×2+1]和pp1[i×2+1]进行左移,降低了处理开销。

而对于浮点数的运算,则可参见下述步骤实现:

步骤6,对于浮点卷积数据类型fp16/bf16/tf32/fp32,可以复用multp8×4完成B12×B12的浮点尾数乘法计算。

具体的,可以将每个B12×B12乘法操作映射到6个乘法器multp8×4,产生的12个部分积拼接成8个部分积,移位拼接后形成8个部分积,经过尾数计算单元中的2级csa42压缩电路将8个部分积压缩成2个部分积,压缩后的2个部分积通过加法器add24完成浮点尾数乘法fp_mult_man[i]的计算。

具体的,B12×B12乘法到乘法器multp8×4的映射方式为:将每个浮点fp16/bf16/tf32的尾数乘法b12×b12乘法映射到6个multp8×4乘法器:

将每个b12×b1运算拆分成B12×B12={b4_d_h,b8_d_l}×{b4_w_h,b8_w_l}=

(b8_d_l[3:0]×b8_w_l[7:0])+

(b8_d_l[7:4]×b8_w_l[7:0]<<4)+

(b8_d_l[3:0]×b4_w_h[3:0]<<8)+

(b8_d_l[7:4]×b4_w_h[3:0]<<12)+

(b4_d_h[3:0]×b8_w_l[7:0]<<8)+

(b4_d_h[3:0]×b4_w_h[3:0]<<16)。

进一步将乘法器映射到multp8×4得到乘法单元的部分积如下:

其中b8_d_l×b8_w_l映射到2个multp8x4分别产生部分积pp0,pp1,pp2,pp3。

其中b8_d_l×b4_w_h映射到2个multp8x4分别产生部分积pp4,pp5,pp6,pp7。

其中b4_d_h×b8_w_l映射到1个multp8x4分别产生部分积pp8,pp9。

其中b4_d_h×b4_w_h映射到1个multp8x4分别产生部分积pp10,pp11。

尾数计算单元将乘法器multp8×4产生的12个部分积拼接成8个部分积:

Fp_Man_pp0={4‘b0,pp6[7:0],pp0[11:0]};

Fp_Man_pp1={4‘b0,pp7[7:0],pp1[11:0]};

Fp_Man_pp2={pp10[7:0],pp2[11:0],4‘b0};

Fp_Man_pp3={pp11[7:0],pp3[11:0],4‘b0};

Fp_Man_pp4={8‘b0,pp4[7:0],8‘b0};

Fp_Man_pp5={8‘b0,pp5[7:0],8‘b0};

Fp_Man_pp6={4‘b0,pp8[11:0],8‘b0};

Fp_Man_pp7={4‘b0,pp9[11:0],8‘b0}。

移位拼接后的8个部分积,经过尾数计算单元中的2级csa42压缩电路将8个部分积压缩成2个部分积。压缩后的2个部分积通过加法器add24完成浮点尾数乘法B12×B12的计算并输出24bits的fp_mult_man送到第一级累加单元进行浮点累加计算。

步骤7,对指数部分进行计算:

对于数据类型fp16/bf16/tf32/fp32的浮点数,指数计算单元不进行浮点denormal/zero/inf/nan的异常数据的判断,直接根据data flop chain(即数据传输子单元)和weight flop chain(即权重传输子单元)中的浮点数异常标志位和数据完成浮点乘法的指数计算。

当data和weight中实际存在denorm数据时,通过data flop chain和weight flopchain传输的denormal数据,将指数部分表示为1,即data flop chain和weight flopchain中实际传输的浮点数为:

Fp16 S1E5M10 denormal为{sign,exp[4:0]|denormal,man[9:0]};

fp32 S1E8M23 denormal为{sign,exp[7:0]|denormal,man[22:0]};

tf32 S1E8M10 denormal为{sign,exp[7:0]|denormal,man[9:0]};

bf16 S1E8M7 denormal为{sign,exp[7:0]|denormal,man[6:0]};

指数计算单元根据数据类型选择指数位并扩展到统一的8bits的位宽进行指数运算。处理方式为:Mult_exp[i]=data_exp[i]+weight_exp[i]。当data_exp[i]/weight_exp[i]中存在0时,将Mult_exp[i]设置成0。其中,data_exp[i]/weight_exp[i]为0的异常标志位分别通过data flop chain和weight flop chain传输到指数计算单元。各个浮点数据类型共享8bits的加法器完成浮点乘法的指数计算。其中,data_exp[i]表征第i个待运算数据的指数部分,weight_exp[i]表征第i个待运算权重的指数部分。

步骤8,第一级累加单元根据包含的4个DP4 exp_max计算单元(即第一级指数选择单元,后文不再重复说明),每个DP4 exp_max计算单元负责从4个浮点乘法指数结果mul_exp[iii×4+0],mul_exp[iii×4+1],mul_exp[iii×4+2],mul_exp[iii×4+3]中找到最大的指数lv1_exp_max[iii]。

步骤9,第一级累加单元根据包含4个DP4指数阶差计算单元(即第一级指数阶差计算单元,后文不再重复说明),DP4指数阶差计算单元负责浮点乘法指数阶差计算,根据DP4exp_max计算出的结果计算对阶移位量:

Mul_exp_diff[iii×4+0]=lv1_exp_max[iii]-exp_max[iii×4+0];

Mul_exp_diff[iii×4+1]=lv1_exp_max[iii]-exp_max[iii×4+1];

Mul_exp_diff[iii×4+2]=lv1_exp_max[iii]-exp_max[iii×4+2];

Mul_exp_diff[iii×4+2]=lv1_exp_max[iii]-exp_max[iii×4+3]。

步骤10,第一级累加单元包含4个DP4累加单元(即第一级累加器,后文不再重复说明),DP4累加单元中的对阶移位器根据DP4指数阶差计算单元计算出来的对阶移位量对步骤6计算出的结果fp_mult_man进行移位操作:

Mul_man_align[iii×4+0]=fp_mult_man[iii×4+0]>>Mul_exp_diff[iii×4+0];

Mul_man_align[iii×4+1]=fp_mult_man[iii×4+1]>>Mul_exp_diff[iii×4+1];

Mul_man_align[iii×4+2]=fp_mult_man[iii×4+2]>>Mul_exp_diff[iii×4+2];

Mul_man_align[iii×4+3]=fp_mult_man[iii×4+3]>>Mul_exp_diff[iii×4+3]。

其中,>>为右移操作符,公式a>>b表征将a右移b位。

DP4累加单元中的符号处理电路根据待运算数据和待运算权重的符号对移位后的结果Mul_man_align进行符号处理,具体分成2种情况:

(1)若DP4累加的4个Mul_man_align的符号同时为负,即fp_man_sign[iii×4+0],fp_man_sign[iii×4+1],fp_man_sign[iii×4+2],fp_man_sign[iii×4+3]符号位同时为负,生成1bit的is_neg4[iii]标志,并将is_neg4[iii]标志赋值为1,不进行尾数的取反+1操作,并将标志信息is_neg4[iii]标志信息传输到第二级累加单元,由第二级浮点累加单元对DP4累加结果lv1_dp4_reduce[iii]进行符号处理。DP4累加单元不进尾数符号处理,对4个正的乘法尾数扩展3bits0后进行累加操作:

Sign_man_align[iii×4+0]={3’b0,Mul_man_align[iii×4+0]};

Sign_man_align[iii×4+1]={3’b0,Mul_man_align[iii×4+1]};

Sign_man_align[iii×4+2]={3’b0,Mul_man_align[iii×4+2]};

Sign_man_align[iii×4+3]={3’b0,Mul_man_align[iii×4+3]}。

其中第一级csa32对sign_man_align[iii×4+0],Sign_man_align[iii×4+1],Sign_man_align[iii×4+2]进行部分积压缩输出的2个部分积pp0,pp1。

其中第二级csa32电路对第一级csa32输出的pp0,pp1和Sign_man_align[iii×4+3]进行部分积压缩。

其中加法器将第二级csa32压缩电路输出的2个部分积进行累加,完成第一级DP4累加的结果计算并输出lv1_dp4_reduce[iii]。

(2)若DP4累加的4个Mul_man_align的符号不同时为负,最多存在3个操作数存在取反+1,根据fp_man_sign[iii×4+0],fp_man_sign[iii×4+1],fp_man_sign[iii×4+2],fp_man_sign[iii×4+3]的符号位,分别对乘法尾数进行符号处理:

Sign_man_align[iii×4+0]=fp_man_sign[iii×4+0]?~{3’b0,Mul_man_align[iii×4+0]}:{3’b0,Mul_man_align[iii×4+0]};

Sign_man_align[iii×4+1]=fp_man_sign[iii×4+1]?~{3’b0,Mul_man_align[iii×4+1]}:{3’b0,Mul_man_align[iii×4+1]};

Sign_man_align[iii×4+2]=fp_man_sign[iii×4+2]?~{3’b0,Mul_man_align[iii×4+2]}:{3’b0,Mul_man_align[iii×4+2]};

Sign_man_align[iii×4+3]=fp_man_sign[iii×4+3]?~{3’b0,Mul_man_align[iii×4+3]}:{3’b0,Mul_man_align[iii×4+3]}。

在本申请实施例中,公式X=a?b1:b2表征:判断a是否为真,若a为真,则X=b1,否则X=b2。而~为取反符号,~a表征对a取反。在计算机领域,对于有符号数而言,负数的符号位为1,正数的符号位为0。因此当fp_man_sign为负时,判断结果为真。

在本申请实施例中,n’b0表征n比特的0,相应的n’b1表征n比特的1。

在本申请实施例中,可以统计fp_man_sign[iii×4+0],fp_man_sign[iii×4+1],fp_man_sign[iii×4+2],fp_man_sign[iii×4+3]中负数的个数neg_count,并设置negcount的标志Neg[2:0],并将is_neg4[iii]标志赋值为0传给第二级DP4reduce(即第二级累加器,后文不再重复说明)。其中:

Neg[2:0]=(neg_count==3)?{1’b1,1’b1,1’1}:

(neg_count==2)?{1’b0,1’b1,1’1}:

(neg_count==1)?{1’b0,1’b0,1’1}:3’b0;

其中第一级csa32对sign_man_align[iii×4+0],Sign_man_align[iii×4+1],Sign_man_align[iii×4+2]和1bit Neg[0]进行部分积压缩输出的2个部分积pp0,pp1。

其中第二级csa电路对第一级csa32输出的pp0,pp1,Sign_man_align[iii×4+3]和1bit Neg[1]的部分积压缩。

其中加法器将第二级csa32压缩电路输出的2个部分积和1bit Neg[2]进行累加,在不引入额外加法器的基础上完成第一级DP4累加种最多3个负数的累加的结果计算并输出lv1_dp4_reduce[iii]。

步骤11,第二级DP4 exp_max计算单元根据第一级累加单元输出的4个最大lv1_exp_max[0],lv1_exp_max[1],lv1_exp_max[2],lv1_exp_max[3]找到最大的指数lv2_exp_max。

步骤12,第二级DP4指数阶差计算单元(即第二级指数阶差计算单元)根据lv2_exp_max和lv1_exp_max[iii],完成第一级累加单元输出的lv1_reduce_man[iii]浮点尾数指数阶差计算:

Lv2_exp_diff[iii×4+0]=lv2_exp_max–lv1_exp_max[iii×4+0];

Lv2_exp_diff[iii×4+1]=lv2_exp_max–lv1_exp_max[iii×4+1];

Lv2_exp_diff[iii×4+2]=lv2_exp_max–lv1_exp_max[iii×4+2];

Lv2_exp_diff[iii×4+2]=lv2_exp_max–lv1_exp_max[iii×4+3]。

步骤13,第二级DP4累加单元器中的对阶移位器根据第二级指数阶差模块计算出来的指数阶差对第一级累加单元输出的4个浮点尾数乘法结果进行对阶移位:

Lv2_man_align[iii×4+0]=lv1_reduce_man[iii×4+0]>>lv2_exp_diff[iii×4+0];

Lv2_man_align[iii×4+1]=lv1_reduce_man[iii×4+1]>>lv2_exp_diff[iii×4+1];

Lv2_man_align[iii×4+2]=lv1_reduce_man[iii×4+2]>>lv2_exp_diff[iii×4+2];

Lv2_man_align[iii×4+3]=lv1_reduce_man[iii×4+3]>>lv2_exp_diff[iii×4+3]。

步骤14,第二级DP4累加器中的符号处理电路根据is_neg_4[iii]标志位对Lv2_man_align[iii]进行符号处理,is_neg_4[iii]为1对对齐后的Lv2_man_align进行取反:

Sign_Lv2_man_align[0]=is_neg_4[0]?~Lv2_man_align[0]:Lv2_man_align[0];

Sign_Lv2_man_align[1]=is_neg_4[1]?~Lv2_man_align[1]:Lv2_man_align[1];

Sign_Lv2_man_align[2]=is_neg_4[2]?~Lv2_man_align[2]:Lv2_man_align[2];

Sign_Lv2_man_align[3]=is_neg_4[3]?~Lv2_man_align[3]:Lv2_man_align[3]。

计算进行了取反操作的尾数数目neg_cout=is_neg_4[0]+is_neg_4[1]+is_neg_4[2]+is_neg_4[3]。

步骤15,第二级DP4累加器中的csa42压缩电路将4个部分积sign_lv2_man_align[0],Sign_lv2_man_align[1],Sign_lv2_man_align[2],sign_lv2_man_align[3]进行部分积压缩输出的2个部分积pp0,pp1。

步骤16,加法器计算pp0+pp1+neg_coun完成第二级DP4累加的结果计算,并输出lv2_dp4_reduce和lv2_exp_max。

步骤17,若步骤16输出的级DP4累加结果需要和其他DP单元的输出lv2_dp4_reduce[iii]进行累加则不进行规格化处理,否则根据步骤16输出的lv2_dp4_reduce和lv2_exp_max,对尾数进行规格化处理并输出IEEE规定的浮点数数据格式。

可以理解的是,对于fp32数据,可以在完全复用浮点计算路径上的硬件开销基础上,实现fp32的DP4计算,过程如下:

fp32尾数B24×B24的尾数乘法通过复用4个B12×B12乘法器实现,具体为将每个b24×b24运算拆分成B24×B24={b12_d_h,b12_d_l}×{b12_w_h,b12_w_l}。4个B12×B12乘法器分别映射到定点浮点共享的multp8×4乘法器。由尾数计算单元分别输出4个B12×B12乘法结果fp_man[iii×4+0],fp_man[iii×4+1],fp_man[iii×4+2],fp_man[iii×4+3]分别为:

24bits结果fp_man[iii×4+0]=b12_d_l×b12_w_l;

24bits结果fp_man[iii×4+1]=b12_d_l×b12_w_h;

24bits结果fp_man[iii×4+2]=b12_d_h×b12_w_l;

24bits结果fp_man[iii×4+3]=b12_d_h×b12_w_h。

Fp32浮点尾数乘法的4个B12×B12 fp_man[iii×4+0],fp_man[iii×4+1],fp_man[iii×4+2],fp_man[iii×4+3]中间结果,复用第一级累加单元中dp4累加单元的阶移位器完成fp32乘法尾数的移位操作:

Mul_man_align[iii×4+0]=fp_man[iii×4+0]>>12;

Mul_man_align[iii×4+1]=fp_man[iii×4+1]>>0;

Mul_man_align[iii×4+2]=fp_man[iii×4+2]>>0;

Mul_man_align[iii×4+3]=fp_man[iii×4+3]>>0。

移位后的B12乘法结果进行拼接传输到DP4累加单元中的2个csa32压缩电路和dp4的加法器完成fp32尾数乘法的计算:

Fp32_man[iii][11:0]=fp_man[iii×4+0][11:0];

Fp32_man[iii][47:12]=

{Mul_man_align[iii×4+0]+Mul_man_align[iii×4+1]+

Mul_man_align[iii×4+2]+{Mul_man_align[iii×4+3],12’b0}}。

其中Fp32_man[iii][47:12]由第一级DP4累加单元中的2个csa32压缩电路和dp4的加法器完成fp32尾数乘法的计算。第一级累加单元输出4个DP4浮点尾数乘法结果Fp32_man[iii]和4个FP32_exp[iii]。

其中4个fp32乘法尾数的DP尾数累加通过复用第二级累加单元的基础上实现,第二级累加单元根据第一级累加单元输出的4个FP32_exp[0],FP32_exp[1],FP32_exp[2],FP32_exp[3],和4个fp32乘法尾数Fp32_man[0],Fp32_man[1],Fp32_man[2],Fp32_man[3],以及FP32_mul_sign[0]至FP32_mul_sign[3]完成第二级乘法尾数的累加计算。

Fp32 DP4的Max exp计算如步骤11,复用第二级DP4 exp_max从4个fp32_exp找到最大的指数lv2_exp_max。其中:

lv1_exp_max[0]=FP32_exp[0];

lv1_exp_max[1]=FP32_exp[1];

lv1_exp_max[2]=FP32_exp[2];

lv1_exp_max[3]=FP32_exp[3]。

Fp32 DP4的指数阶差计算如步骤12,第二级DP4指数阶差计算单元根据lv2_exp_max和lv1_exp_max[iii],完成第一级浮点累加单元输出的lv1_reduce_man[iii]浮点尾数指数阶差计算:

Lv2_exp_diff[iii×4+0]=lv2_exp_max–lv1_exp_max[iii×4+0];

Lv2_exp_diff[iii×4+1]=lv2_exp_max–lv1_exp_max[iii×4+1];

Lv2_exp_diff[iii×4+2]=lv2_exp_max–lv1_exp_max[iii×4+2];

Lv2_exp_diff[iii×4+2]=lv2_exp_max–lv1_exp_max[iii×4+3]。

Fp32 DP4的乘法尾数对阶如步骤13,第二级DP4累加器中的对阶移位器根据第二级指数阶差模块计算出来的指数阶差对第一级累加单元输出的4个浮点尾数乘法结果进行对阶移位:

其中lv1_reduce_man[0]=Fp32_man[0];

其中lv1_reduce_man[1]=Fp32_man[1];

其中lv1_reduce_man[2]=Fp32_man[2];

其中lv1_reduce_man[3]=Fp32_man[3];

Lv2_man_align[iii×4+0]=lv1_reduce_man[0]>>lv2_exp_diff[iii×4+0];

Lv2_man_align[iii×4+1]=lv1_reduce_man[1]>>lv2_exp_diff[iii×4+1];

Lv2_man_align[iii×4+2]=lv1_reduce_man[2]>>lv2_exp_diff[iii×4+2];

Lv2_man_align[iii×4+3]=lv1_reduce_man[3]>>lv2_exp_diff[iii×4+3]。

Fp32 DP4的尾数符号处理如步骤14,第二级DP4累加器中的符号处理电路根据is_neg_4[iii]标志位对Lv2_man_align[iii]进行符号处理,is_neg_4[iii]为1对对齐后的Lv2_man_align进行取反:

其中is_neg_4[0]=FP32_mul_sign[0];

其中is_neg_4[1]=FP32_mul_sign[1];

其中is_neg_4[2]=FP32_mul_sign[2];

其中is_neg_4[3]=FP32_mul_sign[3];

Sign_Lv2_man_align[0]=is_neg_4[0]?~Lv2_man_align[0]:Lv2_man_align[0];

Sign_Lv2_man_align[1]=is_neg_4[1]?~Lv2_man_align[1]:Lv2_man_align[1];

Sign_Lv2_man_align[2]=is_neg_4[2]?~Lv2_man_align[2]:Lv2_man_align[2];

Sign_Lv2_man_align[3]=is_neg_4[3]?~Lv2_man_align[3]:Lv2_man_align[3];

计算进行了取反操作的尾数数目neg_cout=is_neg_4[0]+is_neg_4[1]+is_neg_4[2]+is_neg_4[3]。

Fp32 DP4的尾数累加如步骤15,第二级DP4累加器中的csa42压缩电路将4个部分积sign_lv2_man_align[0],Sign_lv2_man_align[1],Sign_lv2_man_align[2],sign_lv2_man_align[3]进行部分积压缩输出的2个部分积pp0,pp1。

如步骤16,加法器计算pp0+pp1+neg_coun完成第二级DP4累加的结果计算并输出lv2_dp4_reduce和lv2_exp_max;。

如步骤17,若步骤16输出的级DP4累加结果需要和其他DP单元的输出lv2_dp4_reduce[iii]进行累加则不进行规格化处理,否则根据步骤16输出的lv2_dp4_reduce和lv2_exp_max对尾数进行规格化处理并输出IEEE规定的浮点数数据格式。

示例2,以图23所示的卷积计算单元为例进行说明,其中,华莱士树的结构可参见图17所示,尾数计算单元的结构可参见图11所示,第一级累加器的结构如图14所示,第二级累加器的结构如图15-2所示。

假设AI算法架构的实现装置如图12所示,权重浮点异常处理单元和数据浮点异常处理单元预先进行待运算权重和待运算数据的denormal异常检测,并对存在denormal异常的待运算权重和待运算数据设置denormal异常标志位。

在图23所示的卷积计算单元中,处理流程如下:

步骤1,数据选择器采用sparsity4:2稀疏卷积运算从待选数据中选择1/2的待运算数据参与卷积计算。

步骤2,数据预处理单元根据数据类型完成乘法器的数据操作数的选择。若待运算数据的数据类型为浮点数,根据denormal异常标志位对待运算数据的尾数的隐藏高位进行处理。若为有符号数int4/int8对操作数进行符号位扩展。若为有符号数int4/int8对操作数进行符号位扩展。若待运算数据的为浮点数,还需要将选择后的待运算数据进行复制并拆分成多个4bits的数据操作数映射到乘法器。

步骤3,权重预处理单元根据数据类型完成乘法器的权重操作数的选择。若待运算权重的数据类型为浮点数根据denormal异常标志位对待运算权重的尾数的隐藏高位进行处理。若为有符号数int4/int8对操作数进行符号位扩展。根据数据类型,若待运算权重的为浮点数,还需要对待运算权重进行复制并拆分成多个12bits的权重操作数映射到乘法器。

步骤4,定点和浮点运算共享的乘法器包含128个multp12×4乘法器,乘法器单元根据数据预处理单元选择数的数据和权重预处理单元选择出来的权重完成乘法结果的中间结果计算。每个multp12×4的输入根据12bit的weight(权重操作数)和4bits的data(数据操作数)以及weight和data的符号计算B12×B4的乘法中间结果计算并输出2个部分积。

步骤5,定点卷积数据类型Int4/uint4/int8/uint8在复用统一的莱士压缩树CSA_Tree_H和CSA_Tree_L的基础上,完成multp12×4中间结果的累加计算。其中,华莱士树采用高低位分离的方法实现,CSA_Tree_H与奇数序号的乘法器相连,而CSA_Tree_L与偶数序号的乘法器相连。

下面分别针对待运算数据和待运算权重为int4/uint4的情况,以及待运算数据和待运算权重为int8/uint8的情况对定点数运算逻辑进行描述:

(1)对于int4/uint4卷积运算,int4和uint4数据类型的待运算数据和待运算权重到乘法器multp12×4的映射方法为:

For(i=0;i<128;i++){

B12_w[i]=sign_extend(b4_w[i][3:0]);

B4_d[i]=b4_d[i][3:0];

B12_w_sign[i]=int4&b4_w[i][3];

B4_d_sign[i]=int4&b4_d[i][3];

{pp0[i],pp1[i]}=multp12×4(B12_w[i],B4_d[i],B12_w_sign[i],B4_d_sign[i]);

}

在上述实现过程中,sign_extend(a)表征:以符号位的值对a进行扩展。对于B12_w[i]=sign_extend(b4_w[i][3:0])即为:以b4_w[i][3:0]中的符号位进行扩展,扩展为12bit的B12_w[i]。

也即,在本示例中,权重预处理单元根据数据类型对每个4bits的待运算权重b4_w[i]进行符号位扩展,扩展后的权重操作数为12bits,表示为b12_w[i];将扩展后的b12_w[i]和待运算数据b4_d[i]以及乘法操作数符号位b12_w_sign[i]和b4_d_sign[i]分别映射到每个multp12×4乘法器,输出的2个部分积分别为pp1[i]和pp0[i],其中pp1[i]+pp0[i]=b12_w[i]×b4_d[i]。

将128个待运算权重和待运算数据通过上述映射方式映射到128个multp12×4乘法器,分别产生128个部分积pp0和128个部分积pp1。

将i为奇数的部分积pp1[i]和pp0[i]送到高位华莱士树CSA_Tree_H压缩成2个部分积,压缩后的2个部分积相加得到高位卷积计算结果result_H。

将i为偶数的部分积pp1[i]和pp0[i]送到低位华莱士树CSA_Tree_L压缩成2个部分积,压缩后的2个部分积相加得到低位卷积计算结果result_L。

低位和高位的卷积结果相加完成int4/uint4的DP128卷积结果为:result=result_H+result_L。

(2)对于int8/uint8卷积运算:

将每个b8×b8乘法运算映射到2个multp12×4乘法器,具体为:将每个b8×b8映射到2个multp12×4,其中权重预处理单元根据数据类型对每个8bits的待运算权重b8_w[i]进行符号位扩展到12bits表示为b12_w[i],具体映射关系为:

B8×B8=b12_w×{b8_d[7:4],b8_d[3:0]}=(b12_w×b8_d[7:4]<<4)+b12_w×b8_d[3:0]。

int8/uint8数据类型到乘法器multp12×4的映射方法为:

For(i=0;i<64;i++){

B12_w[i]=sign_extend(b8_w[i][7:0]);

w_sign[i]=int8&b8_w[i][7];

B4_d_l[i]=b8_d[i][3:0];

B4_d_sign_l[i]=0;

B4_d_h[i]=b8_d[i][7:4];

B4_d_sign_h[i]=int8&b8_d[i][7];

{pp0[i×2+0],pp1[i×2+0]}=multp12×4(B12_w[i],B4_d_l[i],w_sign[i],B4_d_sign_l[i]);

{pp0[i×2+1],pp1[i×2+1]}=multp12×4(B12_w[i],B4_d_h[i],w_sign[i],B4_d_sign_h[i]);

}

其中,b8_w[i]×b8_d[i]=(pp1[i×2+1]<<4)+(pp0[i×2+1]<<4)+pp1[i×2]+pp0[i×2])。

为快速得到该结果,在本申请实施例中,将64个部分积pp1[i×2+1]和64个部分积pp0[i×2+1]送到高位华莱士树CSA_Tree_H压缩成2个部分积,这2个部分积相加得到result_H。

将64个部分积pp1[i×2]和64个部分积pp0[i×2]送到低位华莱士树CSA_Tree_L压缩成2个部分积,这2个部分积相加得到低位卷积计算结果result_L。

低位卷积结果result_L进行符号位扩展和高位的卷积结果相加完成Int8和Uint8的DP64卷积结果为:result=(result_H<<4)+sign_extend(result_L)。

这样,避免了直接对乘法器输出的部分积(pp1[i×2+1]<<4)+(pp0[i×2+1]<<4)+pp1[i×2]+pp0[i×2])进行部分积压缩需要对pp1[i×2+1],pp0[i×2+1]进行4bits的移位,导致pp1[i×2],pp0[i×2]高位对齐需要额外4bits符号位扩展导致的华莱士压缩树位宽变大导致的面积开销的情况就,减少了面积开销。

而对于浮点数的运算,则可参见下述步骤实现:

步骤6,对于浮点卷积数据类型fp16/bf16/tf32/fp32,可以复用multp12×4完成B12×B12的浮点尾数乘法计算。

具体的,可以将每个B12×B12乘法操作映射到乘法器multp12×4产生6个部分积,经过尾数计算单元中的2×csa32压缩和csa42压缩电路将6个部分积压缩成2个部分积,压缩后的2个部分积通过加法器add24完成浮点尾数乘法fp_mult_man[i]的计算。

具体的,B12×B12乘法到乘法器multp12×4的映射方式为:将每个浮点fp16/bf16/tf32的尾数乘法b12×b12乘法映射到3个multp12×4乘法器,将12bits的待运算数据d_b12按照4bits拆分成3段分别为b4_d_h=d_b12[11:8],b4_d_m=d_b12[7:4],b4_d_l=d_b12[3:0]。其中:

d_b12×w_b12={b4_d_h,b4_d_m,b4_d_l}×{b12_w}=

(b4_d_l×b12_w)+

(b4_d_m×b12_w<<4)+

(b8_d_h×b12_w<<8)。

进一步将乘法器映射到multp12×4得到乘法单元的部分积如下:

其中b4_d_l×b12_w映射到2个multp12×4分别产生部分积pp0,pp1。

其中b4_d_m×b12_w映射到2个multp12×4分别产生部分积pp2,pp3。

其中b4_d_h×b12_w映射到1个multp12×4分别产生部分积pp4,pp5。

尾数计算单元对乘法器multp12×4产生的6个部分积进行移位拼接:

Fp_Man_pp0={8’b0,pp0[15:0]};

Fp_Man_pp1={8’b0,pp1[15:0]};

Fp_Man_pp2={4’b0,pp2[15:0],4‘b0};

Fp_Man_pp3={4’b0,pp3[15:0],4‘b0};

Fp_Man_pp4={pp4[15:0],8‘b0};

Fp_Man_pp5={pp5[15:0],8‘b0}。

移位拼接后的6个部分积,经过尾数计算单元中的2个并行的csa32电路分别将6个部分积压缩成4个部分积,csa42电路将2个csa32电路输出的4个部分积压缩成2个部分积,加法器add24对压缩后的2个部分积进行加法操作完成B12×B12尾数乘法的计算。

步骤7,对指数部分进行计算:

对于浮点卷积数据类型fp16/bf16/tf32/fp32的浮点数,指数计算单元不进行浮点denormal/zero/inf/nan的异常数据的判断,直接根据data flop chain和weight flopchain中的浮点数异常标志位和数据完成浮点乘法的指数计算。

当data和weight中实际存在denorm数据时,通过data flop chain和weight flopchain传输的denormal数据,将指数部分表示为1,即data flop chain和weight flopchain中实际传输的浮点数为:

Fp16 S1E5M10 denormal为{sign,exp[4:0]|denormal,man[9:0]};

fp32 S1E8M23 denormal为{sign,exp[7:0]|denormal,man[22:0]};

tf32 S1E8M10 denormal为{sign,exp[7:0]|denormal,man[9:0]};

bf16 S1E8M7 denormal为{sign,exp[7:0]|denormal,man[6:0]}。

指数计算单元根据数据类型选择指数位并扩展到统一的8bits的位宽进行指数运算。处理方式为:Mult_exp[i]=data_exp[i]+weight_exp[i];当data_exp[i]/weight_exp[i]中存在0时,将Mult_exp[i]设置成0。其中,data_exp[i]/weight_exp[i]为0的异常标志位分别通过data flop chain和weight flop chain传输到指数计算单元。各个浮点数据类型共享8bits的加法器完成浮点乘法的指数计算。

步骤8,第一级累加单元根据包含8个DP4 exp_max计算单元,每个DP4 exp_max计算单元负责从4个浮点乘法指数mul_exp[i×4+0],mul_exp[i×4+1],mul_exp[i×4+2],mul_exp[i×4+3]中找到最大的指数lv1_exp_max[i]。

步骤9,第一级累加单元根据包8个DP4指数阶差计算单元,DP4指数阶差计算单元负责浮点乘法指数阶差计算,根据DP4 exp_max计算出浮点尾数乘法结果的对阶移位量:

Mul_exp_diff[i×4+0]=lv1_exp_max[i]-exp_max[i×4+0];

Mul_exp_diff[i×4+1]=lv1_exp_max[i]-exp_max[i×4+1];

Mul_exp_diff[i×4+2]=lv1_exp_max[i]-exp_max[i×4+2];

Mul_exp_diff[i×4+2]=lv1_exp_max[i]-exp_max[i×4+3]。

步骤10,第一级累加单元包含8个DP4累加单元,DP4累加单元中的对阶移位器根据指数阶差模块计算出来的指数对乘法尾数进行移位操作:

Mul_man_align[i×4+0]=fp_man[i×4+0]>>Mul_exp_diff[i×4+0];

Mul_man_align[i×4+1]=fp_man[i×4+1]>>Mul_exp_diff[i×4+1];

Mul_man_align[i×4+2]=fp_man[i×4+2]>>Mul_exp_diff[i×4+2];

Mul_man_align[i×4+3]=fp_man[i×4+3]>>Mul_exp_diff[i×4+3]。

DP4累加单元中的符号处理电路根据待运算数据和待运算权重的符号对移位后的结果Mul_man_align进行符号处理,具体分成2种情况:

(1)若DP4累加的4个Mul_man_align的符号同时为负,即fp_man_sign[i×4+0],fp_man_sign[i×4+1],fp_man_sign[i×4+2],fp_man_sign[i×4+3]符号位同时为负,生成1bit的is_neg4[i]标志,并将is_neg4[i]标志赋值为1,不进行尾数的取反+1操作,并将标志信息is_neg4[i]标志信息传输到第二级累加单元,由第二级累加单元对DP4累加结果lv1_dp4_reduce[i]进行符号处理。DP4累加单元不进尾数符号处理,对4个正的乘法尾数扩展3bits 0后进行累加操作:

Sign_man_align[i×4+0]={3’b0,Mul_man_align[i×4+0]};

Sign_man_align[i×4+1]={3’b0,Mul_man_align[i×4+1]};

Sign_man_align[i×4+2]={3’b0,Mul_man_align[i×4+2]};

Sign_man_align[i×4+3]={3’b0,Mul_man_align[i×4+3]};

其中第一级csa32对sign_man_align[i×4+0],Sign_man_align[i×4+0],Sign_man_align[i×4+0]进行部分积压缩输出的2个部分积pp0,pp1。

其中第二级csa32电路对第一级csa32输出的pp0,pp1和Sign_man_align[i×4+0]的部分积压缩。

其中加法器将第二级csa32压缩电路输出的2个部分积进行累加,完成第一级DP4累加的结果计算并输出lv1_dp4_reduce[i]。

(2)若DP4累加的4个Mul_man_align的符号不同时为负,最多存在3个操作数存在取反+1,根据fp_man_sign[i×4+0],fp_man_sign[i×4+1],fp_man_sign[i×4+2],fp_man_sign[i×4+3]的符号位,分别对乘法尾数进行符号处理:

Sign_man_align[i×4+0]=fp_man_sign[i×4+0]?~{3’b0,Mul_man_align[i×4+0]}:{3’b0,Mul_man_align[i×4+0]};

Sign_man_align[i×4+1]=fp_man_sign[i×4+1]?~{3’b0,Mul_man_align[i×4+1]}:{3’b0,Mul_man_align[i×4+1]};

Sign_man_align[i×4+2]=fp_man_sign[i×4+2]?~{3’b0,Mul_man_align[i×4+2]}:{3’b0,Mul_man_align[i×4+2]};

Sign_man_align[i×4+3]=fp_man_sign[i×4+3]?~{3’b0,Mul_man_align[i×4+3]}:{3’b0,Mul_man_align[i×4+3]}。

统计fp_man_sign[i×4+0],fp_man_sign[i×4+1],fp_man_sign[i×4+2],fp_man_sign[i×4+3]中负数的个数neg_count,并重新设置neg count的标志Neg[2:0],并将is_neg4[i]标志赋值为0传给第二级DP4reduce。其中:

Neg[2:0]=(neg_count==3)?{1’b1,1’b1,1’1}:

(neg_count==2)?{1’b0,1’b1,1’1}:

(neg_count==1)?{1’b0,1’b0,1’1}:3’b0;

其中第一级csa32对sign_man_align[i×4+0],Sign_man_align[i×4+1],Sign_man_align[i×4+2]和1bit Neg[0]进行部分积压缩输出的2个部分积pp0,pp1。

其中第二级csa电路对第一级csa32输出的pp0,pp1,Sign_man_align[i×4+3]和1bit Neg[1]的部分积压缩。

其中加法器将第二级csa32压缩电路输出的2个部分积和1bit Neg[2]进行累加,在不引入额外加法器的基础上完成第一级DP4累加种最多3个负数的累加的结果计算并输出lv1_dp4_reduce[i]。

步骤11,第二级DP8 exp_max计算单元根据第一级累加单元输出的8个最大lv1_exp_max[0],lv1_exp_max[1],lv1_exp_max[2],lv1_exp_max[3],lv1_exp_max[4],lv1_exp_max[5],lv1_exp_max[6],lv1_exp_max[7]找到最大的指数lv2_exp_max。

步骤12,第二级DP4指数阶差计算单元根据lv2_exp_max和lv1_exp_max[i],完成第一级累加单元输出的lv1_reduce_man[i]浮点尾数指数阶差计算:

Lv2_exp_diff[0]=lv2_exp_max–lv1_exp_max[0];

Lv2_exp_diff[1]=lv2_exp_max–lv1_exp_max[1];

Lv2_exp_diff[2]=lv2_exp_max–lv1_exp_max[2];

Lv2_exp_diff[3]=lv2_exp_max–lv1_exp_max[3];

Lv2_exp_diff[4]=lv2_exp_max–lv1_exp_max[4];

Lv2_exp_diff[5]=lv2_exp_max–lv1_exp_max[5];

Lv2_exp_diff[6]=lv2_exp_max–lv1_exp_max[6];

Lv2_exp_diff[7]=lv2_exp_max–lv1_exp_max[7]。

步骤13,第二级DP8累加单元器中的对阶移位器根据第二级指数阶差模块计算出来的指数阶差对第一级累加单元输出的8个浮点尾数乘法结果进行对阶移位:

Lv2_man_align[0]=lv1_reduce_man[0]>>lv2_exp_diff[0];

Lv2_man_align[1]=lv1_reduce_man[1]>>lv2_exp_diff[1];

Lv2_man_align[2]=lv1_reduce_man[2]>>lv2_exp_diff[2];

Lv2_man_align[3]=lv1_reduce_man[3]>>lv2_exp_diff[3];

Lv2_man_align[4]=lv1_reduce_man[4]>>lv2_exp_diff[4];

Lv2_man_align[5]=lv1_reduce_man[5]>>lv2_exp_diff[5];

Lv2_man_align[6]=lv1_reduce_man[6]>>lv2_exp_diff[6];

Lv2_man_align[7]=lv1_reduce_man[7]>>lv2_exp_diff[7]。

步骤14,第二级DP4累加器中的符号处理电路根据is_neg_4[i]标志位对Lv2_man_align[i]进行符号处理,is_neg_4[i]为1对对齐后的Lv2_man_align进行取反:

Sign_Lv2_man_align[0]=is_neg_4[0]?~Lv2_man_align[0]:Lv2_man_align[0];

Sign_Lv2_man_align[1]=is_neg_4[1]?~Lv2_man_align[1]:Lv2_man_align[1];

Sign_Lv2_man_align[2]=is_neg_4[2]?~Lv2_man_align[2]:Lv2_man_align[2];

Sign_Lv2_man_align[3]=is_neg_4[3]?~Lv2_man_align[3]:Lv2_man_align[3];

Sign_Lv2_man_align[4]=is_neg_4[4]?~Lv2_man_align[4]:Lv2_man_align[4];

Sign_Lv2_man_align[5]=is_neg_4[5]?~Lv2_man_align[5]:Lv2_man_align[5];

Sign_Lv2_man_align[6]=is_neg_4[6]?~Lv2_man_align[6]:Lv2_man_align[6];

Sign_Lv2_man_align[7]=is_neg_4[7]?~Lv2_man_align[7]:Lv2_man_align[7]。

计算进行了取反操作的尾数数目neg_count=is_neg_4[0]+is_neg_4[1]+is_neg_4[2]+is_neg_4[3]+is_neg_4[4]+is_neg_4[5]+is_neg_4[6]+is_neg_4[7]。

步骤15,第二级DP8累加器中的2级csa42压缩电路将8个部分积sign_lv2_man_align[0],Sign_lv2_man_align[1],Sign_lv2_man_align[2],sign_lv2_man_align[3],sign_lv2_man_align[4],sign_lv2_man_align[5],sign_lv2_man_align[6],sign_lv2_man_align[7]进行部分积压缩并输出的2个部分积pp0,pp1。

步骤16,加法器计算pp0+pp1+neg_count完成第二级DP8累加的结果计算并输出lv2_dp8_reduce和lv2_exp_max。

步骤17,若步骤16输出的级DP8累加结果需要和其他DP单元的输出lv2_dp8_reduce[i]进行累加则不进行规格化处理,否则根据步骤16输出的lv2_dp8_reduce和lv2_exp_max对尾数进行规格化处理并输出IEEE规定的浮点数数据格式。

可以理解的是,对于fp32数据,可以在完全复用浮点计算路径上的硬件开销基础上,实现fp32的DP8计算,过程如下:

fp32尾数B24×B24的尾数乘法通过复用4个B12×B12乘法器实现,具体为将每个b24×b24运算拆分成B24×B24={b12┐_d_h,b12_d_l}×{b12_w_h,b12_w_l},4个B12×B12乘法器分别映射到定点浮点共享的的multp12×4乘法器。由尾数计算单元分别输出的4个B12×B12乘法结果fp_man[i×4+0],fp_man[i×4+1],fp_man[i×4+2],fp_man[i×4+3]分别为:

24bits结果fp_man[i×4+0]=b12_d_l×b12_w_l;

24bits结果fp_man[i×4+1]=b12_d_l×b12_w_h;

24bits结果fp_man[i×4+2]=b12_d_h×b12_w_l;

24bits结果fp_man[i×4+3]=b12_d_h×b12_w_h;

Fp32浮点尾数乘法的4个B12×B12 fp_man[i×4+0],fp_man[i×4+1],fp_man[i×4+2],fp_man[i×4+3]中间结果,复用第一级累加单元中dp4累加单元的阶移位器完成fp32乘法尾数的移位操作:

Mul_man_align[i×4+0]=fp_man[i×4+0]>>12;

Mul_man_align[i×4+1]=fp_man[i×4+1]>>0;

Mul_man_align[i×4+2]=fp_man[i×4+2]>>0;

Mul_man_align[i×4+3]=fp_man[i×4+3]>>0。

移位后的B12乘法结果进行拼接传输到DP4累加单元中的2个csa32压缩电路和dp4的加法器完成fp32尾数乘法的计算。

Fp32_man[i][11:0]=fp_man[i×4+0][11:0];

Fp32_man[i][47:12]={Mul_man_align[i×4+0]+Mul_man_align[i×4+1]+Mul_man_align[i×4+2]+{Mul_man_align[i×4+3],12’b0}};

Fp32_man[i][11:0]=fp_man[i×4+0][11:0];

其中Fp32_man[i][47:12]由第一级DP4累加单元中的2个csa32压缩电路和dp4的加法器完成fp32尾数乘法的计算。第一级累加单元输出8个DP4浮点尾数乘法结果Fp32_man[i]和8个FP32_exp[i]。

其中8个fp32乘法尾数的DP尾数累加通过复用第二级累加单元的基础上实现,第二级累加单元根据第一级累加单元输出的8个指数FP32_exp[0]~FP32_exp[7]和8个fp32乘法尾数Fp32_man[0]~Fp32_man[7],以及FP32_mul_sign[0]~FP32_mul_sign[7]完成第二级乘法尾数的累加计算。

Fp32 DP8的Max exp计算如步骤11,复用第二级DP8 exp_max从8个fp32_exp找到最大的指数lv2_exp_max。其中:

lv1_exp_max[0]=FP32_exp[0];

lv1_exp_max[1]=FP32_exp[1];

lv1_exp_max[2]=FP32_exp[2];

lv1_exp_max[3]=FP32_exp[3];

lv1_exp_max[4]=FP32_exp[4];

lv1_exp_max[5]=FP32_exp[5];

lv1_exp_max[6]=FP32_exp[6];

lv1_exp_max[7]=FP32_exp[7];

Fp32 DP8的指数阶差计算如步骤12,第二级DP4指数阶差计算单元根据lv2_exp_max和lv1_exp_max[i],完成第一级累加单元输出的lv1_reduce_man[i]浮点尾数指数阶差计算:

Lv2_exp_diff[0]=lv2_exp_max–lv1_exp_max[0];

Lv2_exp_diff[1]=lv2_exp_max–lv1_exp_max[1];

Lv2_exp_diff[2]=lv2_exp_max–lv1_exp_max[2];

Lv2_exp_diff[3]=lv2_exp_max–lv1_exp_max[3];

Lv2_exp_diff[4]=lv2_exp_max–lv1_exp_max[4];

Lv2_exp_diff[5]=lv2_exp_max–lv1_exp_max[5];

Lv2_exp_diff[6]=lv2_exp_max–lv1_exp_max[6];

Lv2_exp_diff[7]=lv2_exp_max–lv1_exp_max[7]。

Fp32 DP4的乘法尾数对阶如步骤13,第二级DP4累加单元器中的对阶移位器根据第二级指数阶差模块计算出来的指数阶差对第一级累加单元输出的4个浮点尾数乘法结果进行对阶移位:

其中lv1_reduce_man[0]=Fp32_man[0];

其中lv1_reduce_man[1]=Fp32_man[1];

其中lv1_reduce_man[2]=Fp32_man[2];

其中lv1_reduce_man[3]=Fp32_man[3];

其中lv1_reduce_man[4]=Fp32_man[4];

其中lv1_reduce_man[5]=Fp32_man[5];

其中lv1_reduce_man[6]=Fp32_man[6];

其中lv1_reduce_man[7]=Fp32_man[7];

Lv2_man_align[0]=lv1_reduce_man[0]>>lv2_exp_diff[0];

Lv2_man_align[1]=lv1_reduce_man[1]>>lv2_exp_diff[1];

Lv2_man_align[2]=lv1_reduce_man[2]>>lv2_exp_diff[2];

Lv2_man_align[3]=lv1_reduce_man[3]>>lv2_exp_diff[3];

Lv2_man_align[4]=lv1_reduce_man[4]>>lv2_exp_diff[4];

Lv2_man_align[5]=lv1_reduce_man[5]>>lv2_exp_diff[5];

Lv2_man_align[6]=lv1_reduce_man[6]>>lv2_exp_diff[6];

Lv2_man_align[7]=lv1_reduce_man[7]>>lv2_exp_diff[7]。

Fp32 DP4的尾数符号处理如步骤14,第二级DP4累加单元中的符号处理电路根据is_neg_4[i]标志位对Lv2_man_align[i]进行符号处理,is_neg_4[i]为1对对齐后的Lv2_man_align进行取反:

其中is_neg_4[0]=FP32_mul_sign[0];

其中is_neg_4[1]=FP32_mul_sign[1];

其中is_neg_4[2]=FP32_mul_sign[2];

其中is_neg_4[3]=FP32_mul_sign[3];

其中is_neg_4[4]=FP32_mul_sign[4];

其中is_neg_4[5]=FP32_mul_sign[5];

其中is_neg_4[6]=FP32_mul_sign[6];

其中is_neg_4[7]=FP32_mul_sign[7];

Sign_Lv2_man_align[0]=is_neg_4[0]?~Lv2_man_align[0]:Lv2_man_align[0];

Sign_Lv2_man_align[1]=is_neg_4[1]?~Lv2_man_align[1]:Lv2_man_align[1];

Sign_Lv2_man_align[2]=is_neg_4[2]?~Lv2_man_align[2]:Lv2_man_align[2];

Sign_Lv2_man_align[3]=is_neg_4[3]?~Lv2_man_align[3]:Lv2_man_align[3];

Sign_Lv2_man_align[4]=is_neg_4[4]?~Lv2_man_align[4]:Lv2_man_align[4];

Sign_Lv2_man_align[5]=is_neg_4[5]?~Lv2_man_align[5]:Lv2_man_align[5];

Sign_Lv2_man_align[6]=is_neg_4[6]?~Lv2_man_align[6]:Lv2_man_align[6];

Sign_Lv2_man_align[7]=is_neg_4[7]?~Lv2_man_align[7]:Lv2_man_align[7];

计算进行了取反操作的尾数数目neg_count=is_neg_4[0]+is_neg_4[1]+is_neg_4[2]+is_neg_4[3]+is_neg_4[4]+is_neg_4[5]+is_neg_4[6]+is_neg_4[7]。

Fp32 DP8的尾数累加如步骤15:第二级DP8累加器中的2级csa42压缩电路将8个部分积sign_lv2_man_align[0],Sign_lv2_man_align[1],Sign_lv2_man_align[2],sign_lv2_man_align[3],sign_lv2_man_align[4],sign_lv2_man_align[5],sign_lv2_man_align[6],sign_lv2_man_align[7]进行部分积压缩并输出的2个部分积pp0,pp1。

Fp32 DP8的尾数累加如步骤16,加法器计算pp0+pp1+neg_count完成第二级DP8累加的结果计算并输出lv2_dp8_reduce和lv2_exp_max。

Fp32 DP8的尾数的规格化处理如步骤17,若步骤16输出的级DP8累加结果需要和其他DP单元的输出lv2_dp8_reduce[i]进行累加,则不进行规格化处理,否则根据步骤16输出的lv2_dp8_reduce和lv2_exp_max对尾数进行规格化处理,并输出IEEE规定的浮点数数据格式。

示例3,以图24所示的卷积计算单元为例进行说明,其中,华莱士树的结构可参见图17所示,尾数计算单元的结构可参见图11所示,第一级累加器的结构如图14所示,第二级累加器的结构如图15-2所示。

假设AI算法架构的实现装置如图20所示,权重浮点异常处理单元和数据浮点异常处理单元预先进行待运算权重和待运算数据的denormal异常检测,并对存在denormal异常的待运算权重和待运算数据设置denormal异常标志位。数据定点绝对值处理单元对访存控制单元取出的待运算数据进行符号位分离和绝对值处理,将处理后的绝对值数据和符号位数据传给后续的卷积运算电路。权重定点绝对值处理单元用于对访存控制单元取出的待运算权重进行符号位分离和绝对值处理,将处理后的绝对值权重数据和符号位权重数据传给后续的卷积运算电路。

在图24所示的卷积计算单元中,处理流程如下:

步骤1,稀疏数据选择器采用sparsity4:2稀疏卷积运算从待选数据中选择1/2的待运算数据参与卷积计算。

步骤2,数据预处理单元根据数据类型完成乘法器的数据操作数的选择。若待运算数据的数据类型为浮点数根据denormal异常标志位对待运算数据的尾数的隐藏高位进行处理。若待运算数据的为浮点数,还需要将选择后的待运算数据进行复制并拆分成多个4bits的数据映射到乘法器单元。

步骤3,权重预处理单元根据数据类型完成乘法器的权重操作数的选择。若待运算权重的数据类型为浮点数根据denormal异常标志位对待运算权重的尾数的隐藏高位进行处理。若待运算权重的为浮点数,还需要对待运算权重进行复制并拆分成多个12bits的权重操作数映射到乘法器。

步骤4,定点和浮点运算共享的乘法器包含128个multp12×4乘法器,乘法器单元根据数据预处理单元选择数的数据和权重预处理单元选择出来的权重完成乘法结果的中间结果计算。每个multp12×4的输入根据12bit的weight(权重操作数)和4bits的data(数据操作数)以及weight和data的符号计算B12×B4的乘法中间结果计算并输出2个部分积;

步骤5,定点卷积数据类型Int4/uint4/int8/uint8在复用统一的莱士压缩树CSA_Tree_H和CSA_Tree_L的基础上完成multp12×4中间结果的累加计算。其中,华莱士树采用高低位分离的方法实现,步骤4中128个multp12×4产生的256个定点乘法部分积,通过部分积压缩电路CSA_Tree_H和CSA_Tree_L以及加法器累加成1个定点卷积结果。

下面分别针对待运算数据和待运算权重为int4/uint4的情况,以及待运算数据和待运算权重为int8/uint8的情况对定点数运算逻辑进行描述:

(1)对于int4/uint4卷积运算,int4和uint4数据类型的待运算数据和待运算权重到乘法器multp12×4的映射方法为:

For(i=0;i<128;i++){

B12_w[i]=(8’b0,b4_w[i][3:0]);

B4_d[i]=b4_d[i][3:0];

B12_w_sign[i]=w_sign[i];

B4_d_sign[i]=d_sign[i];

{pp0[i],pp1[i]}=multp12×4(B12_w[i],B4_d[i]);

}

在本示例中,权重预处理单元根据数据类型对每个4bits的待运算权重b4_w[i]扩展到12bits表示为:b12_w[i]={8’b0,b4_w[i]};将b12_w[i]和b4_d[i]映射到每个multp12×4乘法器,输出的2个部分积分别为pp1[i]和pp0[i],其中pp1[i]+pp0[i]=b12_w[i]×b4_d[i]。

将128个待运算权重和待运算数据通过上述映射方式映射到128个multp12×4乘法器,分别产生128个部分积pp0和128个部分积pp1。

第三符号处理电路和第四符号处理电路根据每个操作数的符号w_sign[i]^d_sign[i],对每个multp12×4单元进行单元输出的部分积进行符号处理。其中,^为异或运算符。若w_sign[i]^d_sign[i]为真,则乘法结果为负数,对应乘法结果进行取反+1:

(-pp0+-pp1)==~pp0+1+~pp1+1:

Sign_pp0[i]=w_sign[i]^d_sign[i]?~pp0[i]:pp0[i];

Sign_pp1[i]=w_sign[i]^d_sign[i]?~pp1[i]:pp1[i];

Neg_cout[i]=w_sign[i]^d_sign[i]?2:0。

符号处理后的部分积sign_pp0[i×2+1]和sign_pp1[i×2+1]送到高位华莱士树CSA_Tree_H压缩成2个部分积h_pp0,h_pp1。将Neg_count[i×2+1]送到第一Neg count计算单元进行累加,计算出部分积为负数的数目并输出neg_count_H。h_pp0,h_pp1和neg_count_H进行累加,完成高位定点累加结果计算并输出result_H。

符号处理后的将部分积sign_pp1[i×2]和sign_pp0[i×2]送到低位华莱士树CSA_Tree_L压缩成2个部分积l_pp0,l_pp1。将Neg_count[i×2]送到第二Neg count计算单元进行累加,计算出部分积为负数的数目并输出neg_count_L。l_pp0,l_pp1和neg_count_L进行累加完成低位定点累加结果计算并输出result_L。

低位和高位的卷积结果相加完成Int4/Uint4的DP128卷积结果result=result_H+result_L。

(2)对于int8/uint8卷积运算:

将每个b8×b8乘法运算映射到2个multp12×4乘法器,具体为:将每个b8×b8映射到2个multp12×4,其中权重预处理单元根据数据类型对每个8bits的weight元素b8_w[i]扩展位b12_w[i]={4’b0,b8_w[i]},具体映射关系为:

B8×B8=b12_w×{b8_d[7:4],b8_d[3:0]}=(b12_w×b8_d[7:4]<<4)+b12_w×b8_d[3:0]。

int8/uint8数据类型到乘法器multp12×4的映射方法为:

For(i=0;i<64;i++){

B12_w[i]=(4’b0,b8_w[i][7:0]);

w_sign[i]=w_sign[i];

B4_d_l[i]=b8_d[i][3:0];

B4_d_sign_l[i]=d_sign[i];

B4_d_h[i]=b8_d[i][7:4];

B4_d_sign_h[i]=d_sign[i];

{pp0[i×2+0],pp1[i×2+0]}=multp12×4(B12_w[i],B4_d_l[i]);

{pp0[i×2+1],pp1[i×2+1]}=multp12×4(B12_w[i],B4_d_h[i]);

}

其中,b8_w[i]×b8_d[i]=(pp1[i×2+1]<<4)+(pp0[i×2+1]<<4)+pp1[i×2]+pp0[i×2])。

根据乘法操作数的符号位对乘法器生成的部分积进行符号处理:

sign_pp0[i×2]=w_sign[i]^d_sign[i]?~pp0[i×2]:pp0[i×2];

sign_pp1[i×2]=w_sign[i]^d_sign[i]?~pp1[i×2]:pp1[i×2];

Neg_cout[i×2]=w_sign[i]^d_sign[i]?2:0;

sign_pp0[i×2+1]=w_sign[i]^d_sign[i]?~pp0[i×2+1]:pp0[i×2+1];

sign_pp1[i×2+1]=w_sign[i]^d_sign[i]?~pp1[i×2+1]:pp1[i×2+1];

Neg_cout[i×2+1]=w_sign[i]^d_sign[i]?2:0;

将经过符号处理后的部分积sign_pp0[i×2+1]和sign_pp1[i×2+1]送到高位华莱士树CSA_Tree_H压缩成2个部分积h_pp0,h_pp1。将Neg_count[i×2+1]送到Neg count计算单元H进行累加,计算出部分积为负数的数目并输出neg_count_H。h_pp0,h_pp1和neg_count_H进行累加完成高位定点累加结果计算并输出result_H。

符号处理后的将部分积sign_pp1[i×2]和sign_pp0[i×2]送到低位华莱士树CSA_Tree_L压缩成2个部分积l_pp0,l_pp1。将Neg_count[i×2]送到Neg count计算单元L进行累加,计算出部分积为负数的数目并输出neg_count_L。l_pp0,l_pp1和neg_count_L进行累加完成低位定点累加结果计算并输出result_L。低位卷积结果result_L进行符号位扩展和高位的卷积结果相加完成Int8/Uint8的DP64卷积结果为:result=(result_H<<4)+result_L。

这样,采用高低位分离的华莱士压缩树避免了直接对乘法器输出的部分积(pp1[i×2+1]<<4)+pp0[i×2+1]<<4)+pp1[i×2]+pp0[i×2])进行部分积压缩的方式中,需要对pp1[i×2+1],pp0[i×2+1]进行4bits的移位以及pp1[i×2],pp0[i×2]高位对齐,从而需要额外4bits符号位扩展,导致华莱士压缩树位宽变大导致的面积开销的情况,减少了面积开销。

而对于浮点数的运算,则可参见下述步骤实现:

步骤6,对于浮点卷积数据类型fp16/bf16/tf32/fp32,复用multp12×4完成B12×B12的浮点尾数乘法计算。

具体的,可以将每个将B12×B12乘法操作映射到乘法器multp12×4产生6个部分积,经过尾数计算单元中的2×csa32压缩和csa42压缩电路将6个部分积压缩成2个部分积,压缩后的2个部分积通过加法器add24完成浮点尾数乘法fp_mult_man[i]的计算。

B12×B12乘法器到乘法器multp12×4的映射方式为:将每个浮点fp16/bf16/tf32的尾数乘法b12×b12乘法映射到3个multp12×4乘法器,将12bits的待运算数据d_b12按照4bits拆分成3段分别为b8_d_h=d_b12[11:8],b4_d_m=d_b12[7:4],b4_d_l d_b12[3:0]。其中:

d_b12×w_b12={b4_d_h,b4_d_m,b4_d_l}×{b12_w}=

(b4_d_l×b12_w)+

(b4_d_m×b12_w<<4)+

(b8_d_h×b12_w<<8);

进一步将乘法器映射到multp12×4得到乘法单元的部分积如下:

其中b4_d_l×b12_w映射到2个multp12×4分别产生部分积pp0,pp1。

其中b4_d_m×b12_w映射到2个multp12×4分别产生部分积pp2,pp3。

其中b4_d_h×b12_w映射到1个multp12×4分别产生部分积pp4,pp5。

尾数计算单元对乘法器multp12×4产生的6个部分积进行移位拼接,

Fp_Man_pp0={8’b0 pp0[15:0]};

Fp_Man_pp1={8’b0 pp1[15:0]};

Fp_Man_pp2={4’b0,pp2[15:0],4‘b0};

Fp_Man_pp3={4’b0,pp3[15:0],4‘b0};

Fp_Man_pp4={pp4[15:0],8‘b0};

Fp_Man_pp5={pp5[15:0],8‘b0};

移位拼接后的的6个部分积,经过尾数计算单元中的2个并行的csa32压缩电路分别将6个部分积压缩成4个部分积,csa42电路将2个csa32电路输出的4个部分积压缩成2个部分积,加法器add24对压缩后的2个部分积进行加法操作完成B12×B12尾数乘法的计算。

步骤7,对指数部分进行计算:

对于浮点卷积数据类型fp16/bf16/tf32/fp32,指数计算单元不进行浮点denormal/zero/inf/nan的异常数据的判断,直接根据data flop chain和weight flopchain中的浮点数异常标志位和数据完成浮点乘法的指数计算。

当data和weight中实际存在denorm数据时,通过data flop chain和weight flopchain传输的denormal数据,将指数部分表示为1,即data flop chain和weight flopchain中实际传输的浮点数为:

Fp16 S1E5M10 denormal为{sign,exp[4:0]|denormal,man[9:0]};

fp32 S1E8M23 denormal为{sign,exp[7:0]|denormal,man[22:0]};

tf32 S1E8M10 denormal为{sign,exp[7:0]|denormal,man[9:0]};

bf16 S1E8M7 denormal为{sign,exp[7:0]|denormal,man[6:0]}。

指数计算单元根据数据类型选择指数位并扩展到统一的8bits的位宽进行指数运算。处理方式为:Mult_exp[i]=data_exp[i]+weight_exp[i];当data_exp[i]/weight_exp[i]中存在0时,将Mult_exp[i]设置成0。其中,data_exp[i]/weight_exp[i]为0的异常标志位分别通过data flop chain和weight flop chain传输到指数计算单元。各个浮点数据类型共享8bits的加法器完成浮点乘法的指数计算。

步骤8,第一级累加单元根据包含8个DP4 exp_max计算单元,每个DP4 exp_max计算单元负责从4个浮点乘法指数mul_exp[i×4+0],mul_exp[i×4+1],mul_exp[i×4+2],mul_exp[i×4+3]中找到最大的指数lv1_exp_max[i]。

步骤9,第一级累加单元根据包8个DP4指数阶差计算单元,DP4指数阶差计算单元负责浮点乘法指数阶差计算,根据DP4 exp_max计算出浮点尾数乘法结果的对阶移位量:

Mul_exp_diff[i×4+0]=lv1_exp_max[i]-exp_max[i×4+0];

Mul_exp_diff[i×4+1]=lv1_exp_max[i]-exp_max[i×4+1];

Mul_exp_diff[i×4+2]=lv1_exp_max[i]-exp_max[i×4+2];

Mul_exp_diff[i×4+2]=lv1_exp_max[i]-exp_max[i×4+3]。

步骤10,第一级累加单元包含8个DP4累加单元,DP4累加单元中的对阶移位器根据指数阶差模块计算出来的指数对乘法尾数进行移位操作:

Mul_man_align[i×4+0]=fp_man[i×4+0]>>Mul_exp_diff[i×4+0];

Mul_man_align[i×4+1]=fp_man[i×4+1]>>Mul_exp_diff[i×4+1];

Mul_man_align[i×4+2]=fp_man[i×4+2]>>Mul_exp_diff[i×4+2];

Mul_man_align[i×4+3]=fp_man[i×4+3]>>Mul_exp_diff[i×4+3]。

DP4累加单元中的符号处理电路根据待运算数据和待运算权重的符号对移位后的结果Mul_man_align进行符号处理,具体分成2种情况:

(1)若DP4累加的4个Mul_man_align的符号同时为负,即fp_man_sign[i×4+0],fp_man_sign[i×4+1],fp_man_sign[i×4+2],fp_man_sign[i×4+3]符号位同时为负,生成1bit的is_neg4[i]标志,并将is_neg4[i]标志赋值为1,不进行尾数的取反+1操作,将is_neg4[i]标志赋值为1并将标志信息is_neg4[i]标志信息传输到第二级累加单元,由第二级累加单元对DP4累加结果lv1_dp4_reduce[i]进行符号处理。DP4累加单元不进尾数符号处理,对4个正的乘法尾数扩展3bits 0进行累加操作:

Sign_man_align[i×4+0]={3’b0,Mul_man_align[i×4+0]};

Sign_man_align[i×4+1]={3’b0,Mul_man_align[i×4+1]};

Sign_man_align[i×4+2]={3’b0,Mul_man_align[i×4+2]};

Sign_man_align[i×4+3]={3’b0,Mul_man_align[i×4+3]};

其中第一级csa32对sign_man_align[i×4+0],Sign_man_align[i×4+0],Sign_man_align[i×4+0]进行部分积压缩输出的2个部分积pp0,pp1。

其中第二级csa32电路对第一级csa32输出的pp0,pp1和Sign_man_align[i×4+0]的部分积压缩。

其中加法器将第二级csa32压缩电路输出的2个部分积进行累加,完成第一级DP4累加的结果计算并输出lv1_dp4_reduce[i]。

(2)若DP4累加的4个Mul_man_align的符号不同时为负,最多存在3个操作数存在取反+1,根据乘法的符号位fp_man_sign[i×4+0],fp_man_sign[i×4+1],fp_man_sign[i×4+2],fp_man_sign[i×4+3],分别对乘法尾数进行符号处理:

Sign_man_align[i×4+0]=fp_man_sign[i×4+0]?~{3’b0,Mul_man_align[i×4+0]}:{3’b0,Mul_man_align[i×4+0]};

Sign_man_align[i×4+1]=fp_man_sign[i×4+1]?~{3’b0,Mul_man_align[i×4+1]}:{3’b0,Mul_man_align[i×4+1]};

Sign_man_align[i×4+2]=fp_man_sign[i×4+2]?~{3’b0,Mul_man_align[i×4+2]}:{3’b0,Mul_man_align[i×4+2]};

Sign_man_align[i×4+3]=fp_man_sign[i×4+3]?~{3’b0,Mul_man_align[i×4+3]}:{3’b0,Mul_man_align[i×4+3]};

统计fp_man_sign[i×4+0],fp_man_sign[i×4+1],fp_man_sign[i×4+2],fp_man_sign[i×4+3]中负数的个数neg_count,并重新设置neg count的标志Neg[2:0],并将is_neg4[i]标志赋值为0传给第二级DP4reduce。其中:

Neg[2:0]=(neg_count==3)?{1’b1,1’b1,1’1}:

(neg_count==2)?{1’b0,1’b1,1’1}:

(neg_count==1)?{1’b0,1’b0,1’1}:3’b0;

其中第一级csa32对sign_man_align[i×4+0],Sign_man_align[i×4+1],Sign_man_align[i×4+2]和1bit Neg[0]进行部分积压缩输出的2个部分积pp0,pp1。

其中第二级csa电路对第一级csa32输出的pp0,pp1,Sign_man_align[i×4+3]和1bit Neg[1]的部分积压缩。

其中加法器将第二级csa32压缩电路输出的2个部分积和1bit Neg[2]进行累加,在不引入额外加法器的基础上完成第一级DP4累加种最多3个负数的累加的结果计算并输出lv1_dp4_reduce[i]。

步骤11,第二级DP8 exp_max计算单元根据第一级累加单元输出的8个最大lv1_exp_max[0],lv1_exp_max[1],lv1_exp_max[2],lv1_exp_max[3],lv1_exp_max[4],lv1_exp_max[5],lv1_exp_max[6],lv1_exp_max[7]找到最大的指数lv2_exp_max。

步骤12,第二级DP4指数阶差计算单元根据lv2_exp_max和lv1_exp_max[i],完成第一级累加单元输出的lv1_reduce_man[i]浮点尾数指数阶差计算:

Lv2_exp_diff[0]=lv2_exp_max–lv1_exp_max[0];

Lv2_exp_diff[1]=lv2_exp_max–lv1_exp_max[1];

Lv2_exp_diff[2]=lv2_exp_max–lv1_exp_max[2];

Lv2_exp_diff[3]=lv2_exp_max–lv1_exp_max[3];

Lv2_exp_diff[4]=lv2_exp_max–lv1_exp_max[4];

Lv2_exp_diff[5]=lv2_exp_max–lv1_exp_max[5];

Lv2_exp_diff[6]=lv2_exp_max–lv1_exp_max[6];

Lv2_exp_diff[7]=lv2_exp_max–lv1_exp_max[7];

步骤13,第二级DP8累加单元器中的对阶移位器根据第二级指数阶差模块计算出来的指数阶差对第一级累加单元输出的8个浮点尾数乘法结果进行对阶移位:

Lv2_man_align[0]=lv1_reduce_man[0]>>lv2_exp_diff[0];

Lv2_man_align[1]=lv1_reduce_man[1]>>lv2_exp_diff[1];

Lv2_man_align[2]=lv1_reduce_man[2]>>lv2_exp_diff[2];

Lv2_man_align[3]=lv1_reduce_man[3]>>lv2_exp_diff[3];

Lv2_man_align[4]=lv1_reduce_man[4]>>lv2_exp_diff[4];

Lv2_man_align[5]=lv1_reduce_man[5]>>lv2_exp_diff[5];

Lv2_man_align[6]=lv1_reduce_man[6]>>lv2_exp_diff[6];

Lv2_man_align[7]=lv1_reduce_man[7]>>lv2_exp_diff[7];

步骤14,第二级DP4累加器中的符号处理电路根据is_neg_4[i]标志位对Lv2_man_align[i]进行符号处理,is_neg_4[i]为1对对齐后的Lv2_man_align进行取反:

Sign_Lv2_man_align[0]=is_neg_4[0]?~Lv2_man_align[0]:Lv2_man_align[0];

Sign_Lv2_man_align[1]=is_neg_4[1]?~Lv2_man_align[1]:Lv2_man_align[1];

Sign_Lv2_man_align[2]=is_neg_4[2]?~Lv2_man_align[2]:Lv2_man_align[2];

Sign_Lv2_man_align[3]=is_neg_4[3]?~Lv2_man_align[3]:Lv2_man_align[3];

Sign_Lv2_man_align[4]=is_neg_4[4]?~Lv2_man_align[4]:Lv2_man_align[4];

Sign_Lv2_man_align[5]=is_neg_4[5]?~Lv2_man_align[5]:Lv2_man_align[5];

Sign_Lv2_man_align[6]=is_neg_4[6]?~Lv2_man_align[6]:Lv2_man_align[6];

Sign_Lv2_man_align[7]=is_neg_4[7]?~Lv2_man_align[7]:Lv2_man_align[7]。

计算进行了取反操作的尾数数目neg_count=is_neg_4[0]+is_neg_4[1]+is_neg_4[2]+is_neg_4[3]+is_neg_4[4]+is_neg_4[5]+is_neg_4[6]+is_neg_4[7]。

步骤15,第二级DP8累加器中的2级csa42压缩电路将8个部分积sign_lv2_man_align[0],Sign_lv2_man_align[1],Sign_lv2_man_align[2],sign_lv2_man_align[3],sign_lv2_man_align[4],sign_lv2_man_align[5],sign_lv2_man_align[6],sign_lv2_man_align[7]进行部分积压缩并输出的2个部分积pp0,pp1。

步骤16,加法器计算pp0+pp1+neg_count完成第二级DP8累加的结果计算并输出lv2_dp8_reduce和lv2_exp_max。

步骤17,若步骤16输出的级DP8累加结果需要和其他DP单元的输出lv2_dp8_reduce[i]进行累加则不进行规格化处理,否则根据步骤16输出的lv2_dp8_reduce和lv2_exp_max对尾数进行规格化处理并输出IEEE规定的浮点数数据格式。

可以理解的是,对于fp32数据,可以在完全复用浮点计算路径上的硬件开销基础上,实现fp32的DP8计算,过程如下:

在上述步骤中fp32在完全复用浮点路径上的硬件开销基础上实现fp32 DP8的计算如下:

fp32尾数B24×B24的尾数乘法通过复用4个B12×B12乘法器实现,具体为将每个b24×b24运算拆分成B24×B24={b12┐_d_h,b12_d_l}×{b12_w_h,b12_w_l},4个B12×B12乘法器分别映射到定点浮点共享的的multp12×4乘法器。由尾数计算单元分别输出的4个B12×B12乘法结果fp_man[i×4+0],fp_man[i×4+1],fp_man[i×4+2],fp_man[i×4+3]分别为:

24bits结果fp_man[i×4+0]=b12_d_l×b12_w_l;

24bits结果fp_man[i×4+1]=b12_d_l×b12_w_h;

24bits结果fp_man[i×4+2]=b12_d_h×b12_w_l;

24bits结果fp_man[i×4+3]=b12_d_h×b12_w_h;

Fp32浮点尾数乘法的4个B12×B12 fp_man[i×4+0],fp_man[i×4+1],fp_man[i×4+2],fp_man[i×4+3]中间结果,复用第一级累加单元中dp4累加单元的阶移位器完成fp32乘法尾数的移位操作:

Mul_man_align[i×4+0]=fp_man[i×4+0]>>12;

Mul_man_align[i×4+1]=fp_man[i×4+1]>>0;

Mul_man_align[i×4+2]=fp_man[i×4+2]>>0;

Mul_man_align[i×4+3]=fp_man[i×4+3]>>0。

移位后的B12乘法结果进行拼接传输到DP4累加单元中的2个csa32压缩电路和dp4的加法器完成fp32尾数乘法的计算。

Fp32_man[i][11:0]=fp_man[i×4+0][11:0];

Fp32_man[i][47:12]={Mul_man_align[i×4+0]+Mul_man_align[i×4+1]+Mul_man_align[i×4+2]+{Mul_man_align[i×4+3],12’b0}};

Fp32_man[i][11:0]=fp_man[i×4+0][11:0];

其中Fp32_man[i][47:12]由第一级DP4累加单元中的2个csa32压缩电路和dp4的加法器完成fp32尾数乘法的计算。第一级累加单元输出8个DP4浮点尾数乘法结果Fp32_man[i]和8个FP32_exp[i]。

其中8个fp32乘法尾数的DP尾数累加通过复用第二级累加单元的基础上实现,第二级累加单元根据第一级累加单元输出的8个指数FP32_exp[0]~FP32_exp[7]和8个fp32乘法尾数Fp32_man[0]~Fp32_man[7],以及FP32_mul_sign[0]~FP32_mul_sign[7]完成第二级乘法尾数的累加计算。

Fp32 DP8的Max exp计算如步骤11,复用第二级DP8 exp_max从8个fp32_exp找到最大的指数lv2_exp_max。其中:

lv1_exp_max[0]=FP32_exp[0];

lv1_exp_max[1]=FP32_exp[1];

lv1_exp_max[2]=FP32_exp[2];

lv1_exp_max[3]=FP32_exp[3];

lv1_exp_max[4]=FP32_exp[4];

lv1_exp_max[5]=FP32_exp[5];

lv1_exp_max[6]=FP32_exp[6];

lv1_exp_max[7]=FP32_exp[7];

Fp32 DP8的指数阶差计算如步骤12,第二级DP4指数阶差计算单元根据lv2_exp_max和lv1_exp_max[i],完成第一级累加单元输出的lv1_reduce_man[i]浮点尾数指数阶差计算:

Lv2_exp_diff[0]=lv2_exp_max–lv1_exp_max[0];

Lv2_exp_diff[1]=lv2_exp_max–lv1_exp_max[1];

Lv2_exp_diff[2]=lv2_exp_max–lv1_exp_max[2];

Lv2_exp_diff[3]=lv2_exp_max–lv1_exp_max[3];

Lv2_exp_diff[4]=lv2_exp_max–lv1_exp_max[4];

Lv2_exp_diff[5]=lv2_exp_max–lv1_exp_max[5];

Lv2_exp_diff[6]=lv2_exp_max–lv1_exp_max[6];

Lv2_exp_diff[7]=lv2_exp_max–lv1_exp_max[7]。

Fp32 DP4的乘法尾数对阶如步骤13,第二级DP4累加单元器中的对阶移位器根据第二级指数阶差模块计算出来的指数阶差对第一级累加单元输出的4个浮点尾数乘法结果进行对阶移位:

其中lv1_reduce_man[0]=Fp32_man[0];

其中lv1_reduce_man[1]=Fp32_man[1];

其中lv1_reduce_man[2]=Fp32_man[2];

其中lv1_reduce_man[3]=Fp32_man[3];

其中lv1_reduce_man[4]=Fp32_man[4];

其中lv1_reduce_man[5]=Fp32_man[5];

其中lv1_reduce_man[6]=Fp32_man[6];

其中lv1_reduce_man[7]=Fp32_man[7];

Lv2_man_align[0]=lv1_reduce_man[0]>>lv2_exp_diff[0];

Lv2_man_align[1]=lv1_reduce_man[1]>>lv2_exp_diff[1];

Lv2_man_align[2]=lv1_reduce_man[2]>>lv2_exp_diff[2];

Lv2_man_align[3]=lv1_reduce_man[3]>>lv2_exp_diff[3];

Lv2_man_align[4]=lv1_reduce_man[4]>>lv2_exp_diff[4];

Lv2_man_align[5]=lv1_reduce_man[5]>>lv2_exp_diff[5];

Lv2_man_align[6]=lv1_reduce_man[6]>>lv2_exp_diff[6];

Lv2_man_align[7]=lv1_reduce_man[7]>>lv2_exp_diff[7]。

Fp32 DP4的尾数符号处理如步骤14,第二级DP4累加单元中的符号处理电路根据is_neg_4[i]标志位对Lv2_man_align[i]进行符号处理,is_neg_4[i]为1对对齐后的Lv2_man_align进行取反:

其中is_neg_4[0]=FP32_mul_sign[0];

其中is_neg_4[1]=FP32_mul_sign[1];

其中is_neg_4[2]=FP32_mul_sign[2];

其中is_neg_4[3]=FP32_mul_sign[3];

其中is_neg_4[4]=FP32_mul_sign[4];

其中is_neg_4[5]=FP32_mul_sign[5];

其中is_neg_4[6]=FP32_mul_sign[6];

其中is_neg_4[7]=FP32_mul_sign[7];

Sign_Lv2_man_align[0]=is_neg_4[0]?~Lv2_man_align[0]:Lv2_man_align[0];

Sign_Lv2_man_align[1]=is_neg_4[1]?~Lv2_man_align[1]:Lv2_man_align[1];

Sign_Lv2_man_align[2]=is_neg_4[2]?~Lv2_man_align[2]:Lv2_man_align[2];

Sign_Lv2_man_align[3]=is_neg_4[3]?~Lv2_man_align[3]:Lv2_man_align[3];

Sign_Lv2_man_align[4]=is_neg_4[4]?~Lv2_man_align[4]:Lv2_man_align[4];

Sign_Lv2_man_align[5]=is_neg_4[5]?~Lv2_man_align[5]:Lv2_man_align[5];

Sign_Lv2_man_align[6]=is_neg_4[6]?~Lv2_man_align[6]:Lv2_man_align[6];

Sign_Lv2_man_align[7]=is_neg_4[7]?~Lv2_man_align[7]:Lv2_man_align[7];

计算进行了取反操作的尾数数目neg_count=is_neg_4[0]+is_neg_4[1]+is_neg_4[2]+is_neg_4[3]+is_neg_4[4]+is_neg_4[5]+is_neg_4[6]+is_neg_4[7]。

Fp32 DP8的尾数累加如步骤15:第二级DP8累加单元中的2级csa42压缩电路将8个部分积sign_lv2_man_align[0],Sign_lv2_man_align[1],Sign_lv2_man_align[2],sign_lv2_man_align[3],sign_lv2_man_align[4],sign_lv2_man_align[5],sign_lv2_man_align[6],sign_lv2_man_align[7]进行部分积压缩并输出的2个部分积pp0,pp1。

Fp32 DP8的尾数累加如步骤16,加法器计算pp0+pp1+neg_count完成第二级DP8累加的结果计算并输出lv2_dp8_reduce和lv2_exp_max。

Fp32 DP8的尾数的规格化处理如步骤17,若步骤16输出的级DP8累加结果需要和其他DP单元的输出lv2_dp8_reduce[i]进行累加则不进行规格化处理,否则根据步骤16输出的lv2_dp8_reduce和lv2_exp_max对尾数进行规格化处理并输出IEEE规定的浮点数数据格式。

基于同一发明构思,本申请实施例中还提供了一种处理器,该处理器中包括前述的AI算法架构的实现装置。

需要说明的是,本申请实施例提供的处理器可以是GPU(Graphic ProcessingUnit,图形处理器)、CPU(Central Processing Unit,中央处理器)、AI处理器等可以布设上述AI算法架构的实现装置,实现AI运算的处理器。

基于同一发明构思,本申请实施例中还提供了一种电子部件,该电子部件中包括有前述的处理器。

可选的,该电子部件可以是诸如边缘处理盒子、可独立生产的控制器等可以实现IA运算的部件。

基于同一发明构思,本申请实施例中还提供了一种电子设备,该电子设备中包括有前述的处理器或者包括有前述的电子部件。

可选的,该电子设备可以是诸如电脑、手机、服务器等设备,但不作为限制。

在本申请所提供的实施例中,应该理解到,所揭露装置,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。另一点,所显示或讨论的相互之间的连接可以是通过一些接口电性连接的。

另外,作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。

在本文中,多个是指两个或两个以上,“/”是指或的关系。

以上所述仅为本申请的实施例而已,并不用于限制本申请的保护范围,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

相关技术
  • 卷积运算电路、编译方法及相关产品
  • 卷积运算电路及方法、神经网络加速器和电子设备
技术分类

06120115967866