运算单元、相关装置和方法与流程

文档序号:30948972发布日期:2022-07-30 06:34阅读:62来源:国知局
运算单元、相关装置和方法与流程

1.本公开涉及芯片领域,更具体而言,涉及一种运算单元、相关装置和方法。


背景技术:

2.数据处理中经常要涉及整型、浮点数等多种不同数据类型的运算。目前,为了提高数据处理中的运算效率,通过芯片设计来从硬件上支持多种不同数据类型的运算。数据类型包括但不限于32位浮点数(f32)、32位张量浮点数(tf32)、16位浮点数(f16)、16位人脑浮点数(bf16)、32位带符号整数(s32)、32位无符号整数(u32)、16位带符号整数(s16)、16位无符号整数(u16)、8位带符号整数(s8)、8位无符号整数(u8)。不同数据类型的转换是必不可少的。现有技术中,一般是针对每两种不同的数据类型,按照这两种不同类型之间的转换的方法,专门设置转换的硬件,即专门的数据路径。任意两种不同的数据类型之间互相组合,有多少种组合,就有多少种数据路径。该方案通用性差,需要的数据路径多,且不能和已有的数据路径复用。


技术实现要素:

3.有鉴于此,本公开旨在提高数据类型转换的硬件实现的通用性,减少数据类型转换引起的硬件资源耗费。
4.根据本公开的一方面,提供了一种运算单元,包括:
5.第一格式转换单元,用于将源数据格式的数据按照第一规则转换成中间数据格式;
6.第二格式转换单元,用于将所述中间数据格式的数据按照第二规则转换成目标数据格式的数据,其中,所述中间数据格式至少包括所述源数据格式所有的字段和目标数据格式所有的字段,且所述中间数据格式的字段中的位数不小于所述源数据格式和目标数据格式中任一个数据格式的相应字段的位数。
7.可选地,所述中间数据格式包括符号位、指数位、整数位、尾数位,所述中间数据格式表示的值为:(-1)^sign*2^(exponent-255)*(integer[0]+fraction*2^-31-2*integer[1]),其中,^表示指数,sign表示符号位,sign=0表示正数,sign=1表示负数,exponent指数位对应的数值,integer[0]是整数位的最后一位,用0表示非规格化浮点数,用1表示规格化浮点数,fraction表示尾数位,integer[1]是整数位的倒数第2位,用0表示尾数为正数,用1表示尾数为负数。
[0008]
可选地,所述指数位为9位,所述尾数位为31位。
[0009]
可选地,该运算单元还包括:
[0010]
前导零计数单元,用于检查所述整数位的最后一位和所述尾数位形成的序列中从最高位开始的连续0的个数;
[0011]
左移位单元,用于将所述个数的连续0向左移出所述中间数据格式;
[0012]
指数调整单元,用于调整所述指数位,使所述指数位对应的数值减去所述个数。
[0013]
可选地,该运算单元还包括:
[0014]
溢出检测单元,用于确定所述中间数据格式的数据转换成目标数据格式的数据后溢出;
[0015]
溢出处理单元,用于对溢出的目标数据格式的数据进行预定处理。
[0016]
可选地,所述溢出检测单元通过以下中的至少一项确定溢出:
[0017]
如果目标数据格式是32位张量浮点数,所述指数位对应的数值为383,则确定向上溢出;
[0018]
如果目标数据格式是16位浮点数,所述指数位对应的数值大于等于271,则确定向上溢出;所述指数位对应的数值小于等于240,则确定向下溢出;
[0019]
如果目标数据格式是16位人脑浮点数,所述指数位对应的数值大于等于383,则确定向上溢出;所述指数位对应的数值小于等于128,则确定向下溢出;
[0020]
如果目标数据格式是32位带符号整数,所述指数位对应的数值大于等于286且符号位为0,则确定向上溢出;所述指数位对应的数值大于等于286且符号位为1,则确定向下溢出;
[0021]
如果目标数据格式是32位无符号整数,所述指数位对应的数值大于等于287,则确定向上溢出;所述指数位对应的数值小于等于254,则确定向下溢出;
[0022]
如果目标数据格式是16位带符号整数,所述指数位对应的数值大于等于270且符号位为0,则确定向上溢出;所述指数位对应的数值大于等于270且符号位为1,则确定向下溢出;
[0023]
如果目标数据格式是16位无符号整数,所述指数位对应的数值大于等于271,则确定向上溢出;所述指数位对应的数值小于等于254,则确定向下溢出;
[0024]
如果目标数据格式是8位带符号整数,所述指数位对应的数值大于等于262且符号位为0,则确定向上溢出;所述指数位对应的数值大于等于262且符号位为1,则确定向下溢出;
[0025]
如果目标数据格式是8位无符号整数,所述指数位对应的数值大于等于263,则确定向上溢出;所述指数位对应的数值小于等于254,则确定向下溢出。
[0026]
可选地,该运算单元还包括:
[0027]
转换后非规格化确定单元,用于确定所述中间数据格式的数据转换成目标数据格式的数据后是否为非规格化数据或整数;
[0028]
右移位单元,用于根据是否为非规格化数据或整数的确定结果,对所述中间数据格式的尾数位进行向右移位,使得中间数据格式移位并转换成目标数据格式的数据之后为规格化数据。
[0029]
可选地,该运算单元还包括:
[0030]
舍入单元,用于基于所述右移位单元向右移出所述中间数据格式的尾数位,确定是否为所述中间数据格式中留下的尾数位进行进位操作。
[0031]
可选地,所述右移位单元按照以下中的至少一项,对所述中间数据格式的尾数位进行向右移位:
[0032]
如果目标数据格式是32位浮点数或32位张量浮点数,在确定是非规格化数据的情况下,所述指数位对应的数值为t,将所述中间数据格式向右移(137-t)位;在确定是规格化
数据的情况下,将所述中间数据格式向右移8位;
[0033]
如果目标数据格式是16位浮点数,在确定是非规格化数据的情况下,所述指数位对应的数值为t,将所述中间数据格式向右移(262-t)位;在确定是规格化数据的情况下,将所述中间数据格式向右移21位;
[0034]
如果目标数据格式是16位人脑浮点数,在确定是非规格化数据的情况下,所述指数位对应的数值为t,将所述中间数据格式向右移(153-t)位;在确定是规格化数据的情况下,将所述中间数据格式向右移24位;
[0035]
如果目标数据格式是32位带符号整数、32位无符号整数、16位带符号整数、16位无符号整数、8位带符号整数、或8位无符号整数,所述指数位对应的数值为t,将所述中间数据格式向右移(286-t)位。
[0036]
可选地,所述第一规则包括以下中的至少一项:
[0037]
如果源数据格式是32位浮点数或32位张量浮点数,将所述32位浮点数或32位张量浮点数的符号位填充到所述中间数据格式的符号位,将所述32位浮点数或32位张量浮点数的后7位指数位填充到所述中间数据格式的后7位指数位,将所述32位浮点数或32位张量浮点数的首位指数位填充到所述中间数据格式的首位指数位,将所述32位浮点数或32位张量浮点数的首位指数位的相反数填充到所述中间数据格式的倒数第5-8指数位;如果所述32位浮点数或32位张量浮点数是非规格化浮点数,将中间数据格式的整数位的最后一位填充0;如果所述32位浮点数或32位张量浮点数是规格化浮点数,将中间数据格式的整数位的最后一位填充1;从所述中间数据格式的尾数位的首位开始,依次放入所述32位浮点数或32位张量浮点数的尾数位,将所述中间数据格式的尾数位的剩余的位放入0;
[0038]
如果源数据格式是16位浮点数,将所述16位浮点数的符号位填充到所述中间数据格式的符号位,将所述16位浮点数的后4位指数位填充到所述中间数据格式的后4位指数位,将所述16位浮点数的首位指数位填充到所述中间数据格式的首位指数位,将所述16位浮点数的首位指数位的相反数填充到所述中间数据格式的第二位指数位;如果所述16位浮点数是非规格化浮点数,将中间数据格式的整数位的最后一位填充0;如果所述16位浮点数是规格化浮点数,将中间数据格式的整数位的最后一位填充1;从所述中间数据格式的尾数位的首位开始,依次放入所述16位浮点数的尾数位,将所述中间数据格式的尾数位的剩余的位放入0;
[0039]
如果源数据格式是16位人脑浮点数,将所述16位人脑浮点数的符号位填充到所述中间数据格式的符号位,将所述16位人脑浮点数的后7位指数位填充到所述中间数据格式的后7位指数位,将所述16位人脑浮点数的首位指数位填充到所述中间数据格式的首位指数位,将所述16位人脑浮点数的首位指数位的相反数填充到所述中间数据格式的第二位指数位;如果所述16位人脑浮点数是非规格化浮点数,将中间数据格式的整数位的最后一位填充0;如果所述16位人脑浮点数是规格化浮点数,将中间数据格式的整数位的最后一位填充1;从所述中间数据格式的尾数位的首位开始,依次放入所述16位人脑浮点数的尾数位,将所述中间数据格式的尾数位的剩余的位放入0;
[0040]
如果源数据格式是32位带符号整数、32位无符号整数、16位带符号整数、16位无符号整数、8位带符号整数、或8位无符号整数,将源数据格式转换成33位带符号整数;将所述中间数据格式的符号位设置为0;将所述中间数据格式的指数位设置为286对应的二进制
值;用所述33位带符号整数填充所述中间数据格式的整数位和尾数位。
[0041]
可选地,所述如果源数据格式是32位带符号整数、32位无符号整数、16位带符号整数、16位无符号整数、8位带符号整数、或8位无符号整数,将源数据格式转换成33位带符号整数,包括:
[0042]
将所述32位带符号整数、16位带符号整数、或8位带符号整数的后面分别添加1位、17位、25位0,凑成33位带符号整数;
[0043]
将所述32位无符号整数的前面加1位0,凑成33位带符号整数;
[0044]
将所述16位无符号整数、或所述8位无符号整数的前面添加1位0,后面分别添加16位、24位0,凑成33位带符号整数。
[0045]
可选地,所述第二规则包括以下中的至少一项:
[0046]
如果目标数据格式是32位浮点数或32位张量浮点数,将所述中间数据格式的符号位填充到所述32位浮点数或32位张量浮点数的符号位,将所述中间数据格式的后7位指数位填充到所述32位浮点数或32位张量浮点数的后7位指数位,将所述中间数据格式的首位指数位填充到所述32位浮点数或32位张量浮点数的首位指数位;将所述中间数据格式的尾数位的最后23位作为所述32位浮点数的尾数位,或将所述中间数据格式的尾数位的最后10位作为所述32位张量浮点数的尾数位;
[0047]
如果目标数据格式是16位浮点数,将所述中间数据格式的符号位填充到所述16位浮点数的符号位,将所述中间数据格式的后4位指数位填充到所述16位浮点数的后4位指数位,将所述中间数据格式的首位指数位填充到所述16位浮点数的首位指数位;将所述中间数据格式的尾数位的最后10位作为所述16位浮点数的尾数位;
[0048]
如果目标数据格式是16位人脑浮点数,将所述中间数据格式的符号位填充到所述16位人脑浮点数的符号位,将所述中间数据格式的后7位指数位填充到所述16位人脑浮点数的后7位指数位,将所述中间数据格式的首位指数位填充到所述16位人脑浮点数的首位指数位;将所述中间数据格式的尾数位的最后7位作为所述16位人脑浮点数的尾数位;
[0049]
如果目标数据格式是32位带符号整数、16位带符号整数、或8位带符号整数,将所述中间数据格式的整数位和分别去掉前面的1位、17位、25位的尾数位接续,分别作为所述32位带符号整数、16位带符号整数、或8位带符号整数;
[0050]
如果目标数据格式是32位无符号整数,将所述中间数据格式的整数位和尾数位取出,去掉首位,作为所述32位无符号整数;
[0051]
如果目标数据格式是16位无符号整数,将所述中间数据格式的去掉首位的整数位、和去掉前面16位的尾数位接续,作为所述16位无符号整数;
[0052]
如果目标数据格式是8位无符号整数,将所述中间数据格式的去掉首位的整数位、和去掉前面24位的尾数位接续,作为所述8位无符号整数。
[0053]
可选地,所述运算单元包括整数数据路径、和浮点数数据路径,所述整数数据路径用于整数的运算处理,所述浮点数数据路径用于浮点数的运算处理,所述第一格式转换单元、第二格式转换单元包含在所述整数数据路径中。
[0054]
根据本公开的一方面,提供了一种处理单元,包括:
[0055]
作为如上所述的运算单元的指令执行单元;
[0056]
寄存器,其中,所述源数据格式的数据从该寄存器由所述运算单元读出,所述目标
数据格式的数据由所述运算单元写入该寄存器。
[0057]
根据本公开的一方面,提供了一种加速单元,包括:
[0058]
作为如上所述的运算单元的张量引擎;
[0059]
片上内存,其中,所述源数据格式的数据从该片上内存由所述张量引擎读出,所述目标数据格式的数据由所述张量引擎写入该片上内存。
[0060]
根据本公开的一方面,提供了一种计算装置,包括如上所述的处理单元、如上所述的加速单元中的至少一个。
[0061]
根据本公开的一方面,提供了一种片上系统,包括如上所述的处理单元、根据如上所述的加速单元中的至少一个。
[0062]
根据本公开的一方面,提供了一种数据中心,包括如上所述的计算装置。
[0063]
根据本公开的一方面,提供了一种数据格式转换方法,包括:
[0064]
将源数据格式的数据按照第一规则转换成中间数据格式;
[0065]
将所述中间数据格式的数据按照第二规则转换成目标数据格式的数据,其中,所述中间数据格式至少包括所述源数据格式所有的字段和目标数据格式所有的字段,且所述中间数据格式的字段中的位数不小于所述源数据格式和目标数据格式中任一个数据格式的相应字段的位数。
[0066]
本公开实施例中,没有象现有技术那样,针对每两种不同的数据类型,按照这两种不同类型之间的转换的方法,设置不同的数据路径,而是无论什么源数据格式,都转换成通用的中间数据格式(该中间数据格式字段的设置考虑到了能够囊括各种可能的数据类型的已有字段,并在位数上大于等于各种可能的数据类型的已有字段的位数,从而为任何数据类型都能与中间数据格式进行转换扫清障碍),再从中间数据格式转换成要转换的目标数据格式,这个数据路径是唯一的,且能和运算单元中已有的数据路径(如整数数据路径)复用,提高了数据类型转换的硬件实现的通用性,减少了数据类型转换引起的硬件资源耗费。
附图说明
[0067]
通过参考以下附图对本公开实施例的描述,本公开的上述以及其它目的、特征和优点将更为清楚,在附图中:
[0068]
图1是本公开一个实施例所应用的数据中心的结构图;
[0069]
图2是本公开一个实施例的数据中心中一个服务器的内部结构图;
[0070]
图3是根据本公开一个实施例服务器内部的处理单元和加速单元的内部结构图,其中示出了作为本公开实施例的执行主体的运算单元;
[0071]
图4是根据本公开一个实施例的加速单元核的内部结构图;
[0072]
图5是根据本公开一个实施例的运算单元的内部结构图;
[0073]
图6a-j分别示出了32位浮点数、32位张量浮点数、16位浮点数、16位人脑浮点数、32位带符号整数、32位无符号整数、16位带符号整数、16位无符号整数、8位带符号整数、8位无符号整数的数据结构图;
[0074]
图7示出了根据本公开一个实施例的中间数据格式的数据结构图;
[0075]
图8示出了根据本公开的一个实施例针对不同的目标数据格式,将中间数据格式转换成目标数据格式时向上溢出和向下溢出的条件、以及为了确保转换成的目标数据格式
是规格化数据而对中间数据格式的尾数位向右移位的位数。
[0076]
图9示出了根据本公开一个实施例的数据格式转换方法的流程图。
具体实施方式
[0077]
以下基于实施例对本公开进行描述,但是本公开并不仅仅限于这些实施例。在下文对本公开的细节描述中,详尽描述了一些特定的细节部分。对本领域技术人员来说没有这些细节部分的描述也可以完全理解本公开。为了避免混淆本公开的实质,公知的方法、过程、流程没有详细叙述。另外附图不一定是按比例绘制的。
[0078]
在本文中使用以下术语。
[0079]
数据格式:描述数据保存在文件或记录中的规则。它对应于数据类型,一般来说,每种数据类型表示成不同的数据格式。它一般包括若干字段,每个字段表示数据的某一要素。例如,对于浮点数来说,整数、尾数、指数、符号都会影响表示的浮点数的大小,都是浮点数的要素,在数据格式中可能会分别用不同字段体现。
[0080]
定点数:约定小数点位置固定不变的数。在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数(尾数),后者为定点整数(整数)。
[0081]
浮点数:属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体地说,这个实数由一个整数或定点小数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学计数法。一个浮点数a由两个数m和e来表示:a=m
×
b^e,其中^为指数符号。在任意一个这样的体系结构中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m是形如
±
d.ddd...ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。上述浮点数的表示形式a=m
×
b^e中,e称为指数,它一般为整型数;m的小数点之后的部分,如
±
d.ddd...ddd中的ddd...ddd称为尾数;m的小数点之后的部分,如
±
d.ddd...ddd中小数点前的d称为整数,上述浮点数的符号表示其是正数还是负数。
[0082]
张量浮点数:作为张量中的元素的浮点数。张量是n维(其中n可能非常大)数据结构,最常见的是标量、向量或矩阵。标量是0维张量,向量是1维张量,矩阵是2维张量。张量浮点数中尾数的位数一般需要减少,以确保张量运算的效率。
[0083]
人脑浮点数:用神经网络模拟人脑运算时采用的浮点数。类似于张量浮点数,其与一般浮点数的主要区别在于,大大减少了尾数的位数,确保神经网络运算的执行效率。
[0084]
32位浮点数(f32):用32位表示的浮点数,其数据结构如图6a所示。其第0-22位是尾数位,用于表示该浮点数的尾数,即上述a=m
×
b^e中的m的小数点之后的ddd...ddd。m的小数点之前的d由8位指数位决定。当8位指数位为全0时,m的小数点之前的d为0。当8位指数位不是全0时,m的小数点之前的d为1。第23-30位为指数位。第31位为符号位。符号位s为0时,表示正数;符号位s为1时,表示负数。假设8位指数位表示的指数表示为exponent,23位尾数位为fraction,符号位为s,则当指数位不全0时,32位浮点数的值=(-1)^s*(1.fraction)*2^(exponent-127);当指数位全0时,32位浮点数的值=(-1)^s*(0.fraction)*2^(-126)。当s=0时,(-1)^s=1,上述32位浮点数为正数;当s=1时,(-1)^s=-1,上述32位浮点数为负数。1.fraction或0.fraction中整数位的1或0实际上表示规格
31位整个表示32位无符号整数的值。例如,00000000000000000000000000000000表示0,11111111111111111111111111111111表示2
32-1。
[0090]
16位带符号整数(s16):用16位表示的带符号整数,其数据结构如图6g所示。其0-14位表示带符号整数的绝对值,第15位表示符号,即数的正负。符号位为0表示正数,为1表示负数。当符号位为0时,位0-14的值就是该16位带符号整数的值。当符号位为1时,该16位带符号整数的值=位0-14的值-2
15
。例如,1000000000000000表示-2
15
,1111111111111111表示-1。
[0091]
16位无符号整数(u16):用16位表示的无符号整数,其数据结构如图6h所示。其0-15位整个表示16位无符号整数的值。例如,0000000000000000表示0,1111111111111111表示2
16-1。
[0092]
8位带符号整数(s8):用8位表示的带符号整数,其数据结构如图6i所示。其0-6位表示带符号整数的绝对值,第7位表示符号,即数的正负。符号位为0表示正数,为1表示负数。当符号位为0时,位0-6的值就是该8位带符号整数的值。当符号位为1时,该8位带符号整数的值=位0-6的值-27。例如,1000000000000000表示-27,1111111111111111表示-1。
[0093]
8位无符号整数(u8):用8位表示的无符号整数,其数据结构如图6j所示。其0-7位整个表示8位无符号整数的值。例如,0000000000000000表示0,1111111111111111表示2
8-1。
[0094]
规格化浮点数:指数位不全0的浮点数。上述a=m
×
b^e中,m为
±
d.ddd...ddd,规格化浮点数的标志是m的小数点前的d不为0,在二进制的情况下,为1。它是一种类似于科学计数法的表示方式,即将任一个数都可以表示成小数点前只有一位的小数乘以某个基数的整数次幂。当一个浮点数表示成这种标准的形式时,就是规格化浮点数。它的特点是上述m的中的小数点前的d为1,且指数一般不为0。
[0095]
非规格化浮点数:指数位全为0的浮点数。上述a=m
×
b^e中,m为
±
d.ddd...ddd,规格化浮点数的标志是m的小数点前的d为0,例如m为0.0010001。非规格化浮点数可以转换成规格化浮点数,即让m的小数点前的d不为0,例如,非规格化浮点数0.0010001
×
105可以表示为规格化浮点数1.0001
×
102。
[0096]
溢出:转换为某一数据格式后的数值超过了该数据格式所能表示的值的范围。
[0097]
向上溢出:转换为某一数据格式后的数值大于该数据格式所能表示的最大值。
[0098]
向下溢出:转换为某一数据格式后的数值小于该数据格式所能表示的最小值。
[0099]
左移位:将数据的某一个字段的所有位一齐向左移若干位,右边空出的位用0补齐。
[0100]
右移位:将数据的某一个字段的所有位一齐向右移若干位,左边空出的位根据预定规则补齐。右移位分为逻辑右移和算术右移。如果是逻辑右移,预定规则可以是,用0补齐左边空出的位。如果是算术右移,预定规则可以是,用符号位补齐左边空出的位。
[0101]
舍入:当要保留小数点后的若干位时,根据要舍去的位,决定是否要对保留的位进行进位操作。具体舍入方法是已有技术。
[0102]
数据路径:在芯片中进行一类处理所用到的相关单元的总和为一条数据路径。例如,进行整数的运算处理的所有单元的总和为整数数据路径,进行浮点数的运算处理的所有单元的总和为浮点数数据路径。
[0103]
加速单元:针对传统处理单元在一些专门用途的领域(例如,处理图像、处理深度学习模型的各种运算,等等)效率不高的情况,为了提高在这些专门用途领域中的数据处理速度而设计的单元。加速单元包括中央处理器(cpu)、图形处理器(gpu)、通用图形处理器(gpgpu)、现场可编程门阵列(fpga)、专用集成电路(asic)、以及专用智能加速硬件(例如,神经网络处理器npu)。
[0104]
处理单元:进行传统处理(非用于上述加速单元负责的处理)的单元。处理单元除了进行这些传统处理之外,还承担着对加速单元的调度职能,向加速单元分配加速单元需要承担的任务。处理单元可以采用处理单元(cpu)、专用集成电路(asic)、现场可编程门阵列(fpga)等多种形式。
[0105]
本公开的应用环境
[0106]
本公开实施例提出了一种数据格式转换方案。整个数据格式转换方案相对较为通用。例如,数据中心、需要处理不同数据格式的数据的iot(物联网)设备,嵌入式设备等。该数据格式转换方案与最终部署在的硬件环境无关。但为了示例性描述,下文中将主要以数据中心为应用场景进行描述。本领域技术人员应当理解,本公开实施例还可以适用于其它的应用场景。
[0107]
数据中心
[0108]
数据中心是全球协作的特定设备网络,用来在互联网网络基础设施上传递、加速、展示、计算、存储数据信息。在今后的发展中,数据中心也将会成为企业竞争的资产。在数据中心的大数据分析运算中,常常用到各种数据格式的数据。当这些数据在一起运算时,需要先进行数据格式的转换。
[0109]
在传统的大型数据中心,网络结构通常如图1所示,即互连网络模型(hierarchical inter-networking model)。这个模型包含了以下部分:
[0110]
服务器140:各服务器140是数据中心的处理和存储实体,数据中心中大量数据的处理和存储都是由这些服务器140完成的。
[0111]
接入交换机130:接入交换机130是用来让服务器140接入到数据中心中的交换机。一台接入交换机130接入多台服务器140。接入交换机130通常位于机架顶部,所以它们也被称为机顶(top of rack)交换机,它们物理连接服务器。
[0112]
汇聚交换机120:每台汇聚交换机120连接多台接入交换机130,同时提供其他的服务,例如防火墙,入侵检测,网络分析等。
[0113]
核心交换机110:核心交换机110为进出数据中心的包提供高速的转发,为汇聚交换机120提供连接性。整个数据中心的网络分为l3层路由网络和l2层路由网络,核心交换机110为通常为整个数据中心的网络提供一个弹性的l3层路由网络。
[0114]
通常情况下,汇聚交换机120是l2和l3层路由网络的分界点,汇聚交换机120以下的是l2网络,以上是l3网络。每组汇聚交换机管理一个传送点(pod,point of delivery),每个pod内都是独立的vlan网络。服务器在pod内迁移不必修改ip地址和默认网关,因为一个pod对应一个l2广播域。
[0115]
汇聚交换机120和接入交换机130之间通常使用生成树协议(stp,spanning tree protocol)。stp使得对于一个vlan网络只有一个汇聚层交换机120可用,其他的汇聚交换机120在出现故障时才被使用(上图中的虚线)。也就是说,在汇聚交换机120的层面,做不到水
平扩展,因为就算加入多个汇聚交换机120,仍然只有一个在工作。
[0116]
服务器
[0117]
由于服务器140才是数据中心真实的处理设备,图2示出了一个服务器140内部的结构框图。服务器140包括有总线连接的存储器210、处理单元集群270和加速单元集群280。处理单元集群270包括多个处理单元220。加速单元集群280包括多个加速单元230。加速单元230即为了提高在专门用途领域中的数据处理速度而设计的处理单元。加速单元包括中央处理器(cpu)、图形处理器(gpu)、通用图形处理器(gpgpu)、现场可编程门阵列(fpga)、专用集成电路(asic)、以及专用智能加速硬件(例如,神经网络处理器npu)。处理单元是对加速单元进行调度、向各加速单元分配要执行的待执行指令序列的单元,它本身也执行一些运算和处理,它可以采用处理单元(cpu)、专用集成电路(asic)、现场可编程门阵列(fpga)等多种形式。
[0118]
传统的处理单元的架构设计,使得在架构中控制单元、存储单元占用了很大一部分空间,而计算单元占用的空间反而不足,因此其在逻辑控制方面十分有效,而在大规模并行计算方面则效率不够。因此,开发出了各种专门的加速单元,用来针对不同功能和不同领域的计算进行更有效的提高运算速度的处理,例如,针对深度学习模型采用数据驱动并行计算的架构提高其运算速度。这些复杂的运算中会用到大量数据,并产生大量中间结果,在计算过程中会被经常用到。如果用现有的处理单元构架来处理,由于处理单元的核内的内存容量很小,因此要大量频繁访问核外存储器,造成处理的低效。采用这种加速单元,由于其每个核中具有暂存大量输入数据和中间结果的片上内存,避免频繁访问核外部的存储器,就能大大提高处理效率,提高计算性能。
[0119]
加速单元230要接受处理单元220的调度。如图2所示,存储器210中存储有加速运算所需要的参数,如深度学习模型中的节点权重等。这些加速运算当需要时被图2中的一个处理单元220部署到一个加速单元230。即,处理单元220可以通过指令的形式向加速单元230发送加速运算所需要的参数(如各节点的权重)在存储器210中的地址。加速单元230在实际进行加速计算时,就会根据这些参数(例如权重)在存储器210中的地址,直接在存储器210中寻址这些参数,将其暂存在其片上内存中。加速单元230在实际进行加速运算时,处理单元220还会将加速运算的输入发送给加速单元230,暂存在加速单元230的片上内存中。这样,加速单元230就可以根据这些输入和加速运算需要的参数(例如权重)进行推理计算。
[0120]
处理单元和加速单元的内部结构
[0121]
下面结合图3的处理单元220与加速单元230的内部结构图,具体说明处理单元220是如何调度加速单元230进行工作的。
[0122]
如图3所示,处理单元220内包含多个处理器核222和被多个处理器核222共享的高速缓存221。每个处理器核222包括取指令单元203、指令译码单元224、指令发射单元225、指令执行单元226。
[0123]
取指令单元223用于将要执行的指令从存储器210中搬运到指令寄存器(可以是图3示出的寄存器堆229中的一个用于存放指令的寄存器)中,并接收下一个取指地址或根据取指算法计算获得下一个取指地址,取指算法例如包括:根据指令长度递增地址或递减地址。
[0124]
取出指令后,处理单元220进入指令译码阶段,指令译码单元224按照预定的指令
格式,对取回的指令进行解码,以获得取回的指令所需的操作数获取信息,从而为指令执行单元(运算单元)226的操作做准备。操作数获取信息例如指向立即数、寄存器或其他能够提供源操作数的软件/硬件。
[0125]
指令发射单元225位于指令译码单元224与指令执行单元(运算单元)226之间,用于指令的调度和控制,以将各个指令高效地分配至不同的指令执行单元(运算单元)226,使得多个指令的并行操作成为可能。
[0126]
指令发射单元225将指令发射到指令执行单元(运算单元)226后,指令执行单元(运算单元)226开始执行指令。对于一般的逻辑运算或简单的算术运算,由指令执行单元(运算单元)226直接执行。但如果该指令执行单元(运算单元)226判断该指令应该是加速单元230执行的,则将其转发到相应的加速单元230执行。例如,如果该指令是一条深度学习模型推理(inference)的指令,指令执行单元(运算单元)226不再执行该指令,而是将该指令通过总线发送到加速单元230,由加速单元230执行。
[0127]
由于一般的逻辑运算或简单的算术运算是由指令执行单元226执行的,它可以作为本公开实施例的运算单元。它可以需要对不同类型的数据进行运算,因此需要对不同数据格式的数据进行转换。因而,该执行指令单元(运算单元)226可能会实施后文详述的本公开实施例的数据格式转换方案,作为本公开实施例的执行主体。后文将详述其结构。
[0128]
图3示出的加速单元30不限于npu,还可以是gpgpu。gpgpu即通用图形处理器,是一种利用处理图形任务来计算原本由中央处理器处理的通用计算任务的图形处理器。这些通用计算常常与图形处理没有任何关系。由于现代图形处理器强大的并行处理能力和可编程流水线,令流处理器可以处理非图形数据。特别在面对单指令流多数据流(simd),且数据处理的运算量远大于数据调度和传输的需要时,通用图形处理器在性能上大大超越了传统的中央处理器应用程序,因此能够起到加速的作用,与npu一样属于加速单元30。另外,加速单元30还可以包括cpu、gpu、fpga、asic等。
[0129]
加速单元30的通用结构如图3,其内部包括多个核236(图3中示出了4个核,但本领域技术人员应当理解,加速单元230中也可以包含其它数目的核236)、命令处理器237、直接存储访问机制235、和总线通道231。
[0130]
总线通道231是指令从总线进出加速单元230的通道。
[0131]
直接内存访问(dma,direct memory access)机制235是一些计算机总线架构提供的功能,它能使数据从附加设备直接写入计算机主板的存储器上。这种方式相比于设备之间所有的数据传输都要通过处理单元的方式,大大提高了数据访问的效率。正是因为有这样的机制,加速单元230的核可以直接访问存储器210,读取加速运算中的参数(例如各节点的权重)等,大大提高了数据访问效率。
[0132]
命令处理器237将由处理单元220发送至加速单元230的指令分配给核236执行。指令执行单元226将需要加速单元230执行的待执行指令序列发送给加速单元230。该待执行指令序列从总线通道231进入后,缓存在命令处理器237,由命令处理器237选择核236,将指令序列分配给其执行。另外,命令处理器237还负责核236之间的同步操作。
[0133]
加速单元核
[0134]
图4是根据本公开一个实施例的加速单元核的内部结构图。
[0135]
在一个实施例中,如图4所示,加速单元核236包括张量引擎310、池化引擎320、存
储器拷贝引擎330、定序器350、指令缓存器340、片上内存360、常数缓冲器370。
[0136]
命令处理器237分配给加速单元核236的指令序列首先进入指令缓存器340缓存。然后,定序器350从指令缓存器340中按照先进先出的顺序取指令,根据指令的性质分配给张量引擎310或池化引擎320执行。
[0137]
张量引擎310负责处理深度学习模型中的卷积和矩阵乘法等相关操作。在执行这些操作时,也可能涉及到整数、浮点数等多种数据格式的数据的运算,需要进行数据格式的转换。因此,该张量引擎310也可能作为运算单元,成为本公开实施例的数据格式转换方案的执行主体。
[0138]
池化引擎320负责处理深度学习模型中的池化操作。
[0139]
存储器拷贝引擎330是专门处理数据拷贝的单元,这里的数据拷贝包括由于片上内存360可能会溢出而将一些数据由片上内存360拷贝到各核236共享的存储器,或者其它核236的片上内存360。
[0140]
定序器350根据取出的指令是卷积、矩阵乘法、池化、还是数据拷贝等操作性质,决定将指令分配给张量引擎310、池化引擎320、或者存储器拷贝引擎330。
[0141]
片上内存360是加速运算需要的参数(如权重)、以及加速运算实际使用的输入和各种中间结果的核内存储器。常数缓冲器370是存储加速运算涉及的一些常量(例如,神经网络模型中的超参)的缓冲器。如上所述,在处理单元220将加速运算预先配置在加速单元230的过程中,处理单元220通过指令的形式向加速单元230发送加速运算需要的参数和常量在存储器210中的地址。对于权重,加速单元230在实际的加速运算前,将它从存储器210相应的位置取出,放在片上内存360中。对于常量(如超参),加速单元230在实际的加速运算前,从存储器210相应的位置取出,放在常数缓冲器370中。另外,当实际进行加速运算的指令由命令处理器237分配给核236执行后,指令中的输入(加速运算的输入)也存储在片上内存360。另外,当张量引擎310和池化引擎320进行卷积或池化运算后,得到的各种中间结果也存放在片上内存360中。
[0142]
运算单元
[0143]
如上所述,图3的指令执行单元226可以作为运算单元,用于执行在处理单元220执行任务时需要处理不同数据格式的数据的情况下的数据格式的转换。图4中的张量引擎310也可以作为运算单元,用于执行在加速单元230执行任务时需要处理不同数据格式的数据的情况下的数据格式的转换。图5示出了运算单元的结构既适用于图3的指令执行单元226,也适用于图4中的张量引擎310。
[0144]
图5所示的运算单元226,310包括多种数据路径,例如,整数数据路径410、和浮点数数据路径420。如果运算单元226,310还需要处理其它数据类型的运算,还可能包括其它数据类型的数据路径。进行某一种数据类型的运算处理所用到的相关单元的总和为一条数据路径。例如,进行整数的运算处理的所有单元的总和为整数数据路径410,进行浮点数的运算处理的所有单元的总和为浮点数数据路径420。本公开实施例的特点是,将进行数据格式转换的相关单元放在其中一条数据路径中,如放在所述整数数据路径410中,因此它复用同一条数据路径支持多种数据类型之间任意转换。它没有针对各种数据格式的每两种之间的转换,分别专设出一条数据路径,而是复用已有的一条数据路径,提高了数据类型转换的硬件实现的通用性,减少了数据类型转换引起的硬件资源耗费。
[0145]
整数数据路径
[0146]
由于整数数据路径410要进行对整数的各种运算处理,它要包括常规的进行整数的逻辑运算的逻辑运算单元440和对整数进行加法处理的整数加法器450。对整数的减法运算一般是转换成加法运算完成的。它也可以含有整数乘除法运算的单元(未示)。
[0147]
除了上述逻辑运算单元440、整数加法器450等常用整数运算部件外,本公开实施例的整数数据路径410还可以包括第一格式转换单元411、前导零计数单元412、左移位单元413、指数调整单元414、溢出检测单元415、溢出处理单元416、转换后非格式化确定单元417、右移位单元418、舍入单元419、第二格式转换单元421等。
[0148]
第一格式转换单元411将源数据格式的数据按照第一规则转换成中间数据格式。第二格式转换单元421将所述中间数据格式的数据按照第二规则转换成目标数据格式的数据。
[0149]
源数据格式即本公开实施例转换前的数据格式,目标数据格式即本公开实施例转换后的数据格式,本公开实施例将源数据格式转换成目标数据格式。每种数据格式对应于一种数据类型。在前文的术语解释中,结合图6a-j,分别描述了32位浮点数、32位张量浮点数、16位浮点数、16位人脑浮点数、32位带符号整数、32位无符号整数、16位带符号整数、16位无符号整数、8位带符号整数、8位无符号整数这些数据格式的数据结构。应当理解,上述数据格式只是示例,还可以有其它的数据格式。源数据格式可以是它们中的任一种。目标数据格式也可以是它们中的任一种。
[0150]
将源数据格式转换成目标数据格式现有的做法是,针对每两种不同的数据类型,按照这两种不同类型之间的转换的方法,专门设置转换的硬件,即专门的数据路径。任意两种不同的数据类型之间互相组合,有多少种组合,就有多少种数据路径。因此,这种方案通用性差,需要的数据路径多,资源耗费大。本公开实施例巧妙地构造出一种中间数据格式。这种中间数据格式在字段的设置上考虑到了囊括所有可能的数据格式的已有字段,并在位数上大于等于各种可能的数据格式的已有字段的相应位数,从而为任何数据类型都能与中间数据格式进行转换扫清障碍。这样,将源数据格式转换成通用的上述中间数据格式,再由中间数据格式转换成目标数据格式,就完成了任何源数据格式和目标数据格式的转换,这个数据路径是唯一的,且能和运算单元中已有的数据路径(如整数数据路径)复用,提高了数据类型转换的硬件实现的通用性。
[0151]
由于图6a-d的数据格式中含有符号位、指数位、尾数位三种字段,6e-j的数据格式含有符号位、整数位的字段,因此,中间数据格式包括符号位、指数位、整数位、尾数位四种字段,如图7所示,以体现所有可能的数据结构的字段的并集。对于符号位来说,图6a-j中的符号位都为1位,因此,图7的中间数据格式的符号位也可以设置为1位。对于指数位来说,图6a-j的指数位有8位、5位两种情况,取最大值8位,因此,图7的中间数据格式的指数位需要设置为大于等于8位,具体地,在图7中设置为9位。对于尾数位来说,图6a-j中的尾数位有23位、10位、7位几种情况,因此,图7的中间数据格式的尾数位需要大于等于23位,具体地,设置为31位。图6a-j中的整数位有31位、32位、15位、16位、7位、8位的情况,由于考虑到当中间数据格式表示整数时不需要尾数位,因此,可以当中间数据格式表示整数时让整数位和尾数位共用,这样,只需要保证图7的整数位与尾数位位数的和大于等于32。具体地,在图7中,整数位为2位,尾数位为31位,其和大于等于32。在用该中间数据格式表示浮点数时,用尾数
位表示浮点数的尾数,用整数位的最后一位表示浮点数的小数点之前的整数位,用整数位的倒数第二位表示浮点数的正负。在用中间数据格式表示整数时,用整数位和尾数位一共33位表示整个整数。
[0152]
如图7所示的中间数据格式包括符号位、指数位、整数位、尾数位,即包括了可能的各种数据格式用到的字段,且在位数的设计上能够大于等于各种数据格式相应字段的最大位数,这样,就可以将任何源数据格式转换成图7的中间数据格式,也可以将图7的中间数据格式转换成任何目标数据格式。
[0153]
图7的中间数据格式表示的值为:(-1)^sign*2^(exponent-255)*(integer[0]+fraction*2^-31-2*integer[1]),其中,^表示指数。sign表示符号位。sign=0时,(-1)^sign=1,整个值为正数。sign=1时,(-1)^sign=-1,整个值为负数。exponent是指数位对应的数值。例如,111111111对应的数值是2
9-1=511。之所以用exponent减去255是希望让2^(exponent-255)大于1和小于1的概率均衡。255是000000000到111111111之间的中间数。这样,2^(exponent-255)的最小值就是2^(-255),最大值就是2^(256),实现大于1和小于1的概率均衡。integer[0]是整数位的最后一位,用0表示非规格化浮点数,用1表示规格化浮点数,因为非规格化浮点数中的小数点前的数值为0,而规格化浮点数中小数点前的数值为1。fraction表示尾数位对应的数值。由于其小数点实际上在31位的fraction之前,其实际表示的尾数值就是fraction*2^-31,加上整数部分integer[0],integer[0]+fraction*2^-31就是a=m
×
b^e中m的绝对值。integer[1]是整数位的倒数第2位,用0表示尾数为正数,用1表示尾数为负数。这样,如果图7的最后33位为100000000000000000000000000000000,其表示的实际上是-1。如果图7的最后33位为10 1111111111111111111111111111111,其表示的实际上是-0.000000000000000000000000000001。这样设置避免了100000000000000000000000000000000和000000000000000000000000000000000都表示0的局面。
[0154]
下面详细描述将源数据格式转换成中间数据格式的第一规则。即针对图6a-j的作为源数据格式的32位浮点数、32位张量浮点数、16位浮点数、16位人脑浮点数、32位带符号整数、32位无符号整数、16位带符号整数、16位无符号整数、8位带符号整数、8位无符号整数,如何将它们转换成图7的中间数据格式的。
[0155]
针对图6a-b的32位浮点数或32位张量浮点数,将所述32位浮点数或32位张量浮点数的符号位(图6a-b的位31)填充到所述中间数据格式的符号位(图7的位42)。将所述32位浮点数或32位张量浮点数的后7位指数位(图6a-b的位23-29)填充到所述中间数据格式的后7位指数位(图7的位33-39)。将所述32位浮点数或32位张量浮点数的首位指数位(图6a-b的位30)填充到所述中间数据格式的首位指数位(图7的位41)。将所述32位浮点数或32位张量浮点数的首位指数位(图6a-b的位30)的相反数填充到所述中间数据格式的第二位指数位(图7的位40)。如果所述32位浮点数或32位张量浮点数是非规格化浮点数,将中间数据格式的整数位的最后一位(图7的位31)填充0。如果所述32位浮点数或32位张量浮点数是规格化浮点数,将中间数据格式的整数位的最后一位(图7的位31)填充1。由于源数据格式是浮点数,不是整数,不涉及整数的符号,可以将中间数据格式的整数位的倒数第二位(图7的位32)统一填0。从图7的中间数据格式的尾数位的首位(图7的位30)开始,依次放入所述32位浮点数或32位张量浮点数的尾数位。对于图6a来说,尾数位有23位,放入后,占用图7的尾数位的前23位(位30-位8),剩下位0-7,可以放入0。对于图6b来说,尾数位有10位,放入后,占
用图7的尾数位的前10位(位30-位21),剩下位0-20,可以放入0。
[0156]
针对图6c的16位浮点数,将所述16位浮点数的符号位(图6c的位15)填充到所述中间数据格式的符号位(图7的位42)。将所述16位浮点数的后4位指数位(图6c的位10-13)填充到所述中间数据格式的后4位指数位(位33-36)。将所述16位浮点数的首位指数位(图6c的位14)填充到所述中间数据格式的首位指数位(图7的位41),将所述16位浮点数的首位指数位(图6c的位14)的相反数填充到所述中间数据格式的倒数第5-8指数位(图7的位37-40)。如果所述16位浮点数是非规格化浮点数,将中间数据格式的整数位的最后一位(图7的位31)填充0。如果所述16位浮点数是规格化浮点数,将中间数据格式的整数位的最后一位(图7的位31)填充1。将中间数据格式的整数位的倒数第二位(图7的位32)统一填0。从所述中间数据格式的尾数位的首位(图7的位30)开始,依次放入所述16位浮点数的尾数位。16位浮点数有10位尾数位,因此填充到图7的位30-位21。剩下图7的位0-20,可以填入0。
[0157]
针对图6d的16位人脑浮点数,将所述16位人脑浮点数的符号位(位15)填充到所述中间数据格式的符号位(图7的位42)。将所述16位人脑浮点数的后7位指数位(图6d的位7-13)填充到所述中间数据格式的后7位指数位(图7的位33-39)。将所述16位人脑浮点数的首位指数位(图6d的位14)填充到所述中间数据格式的首位指数位(图7的位41)。将所述16位人脑浮点数的首位指数位(图6d的位14)的相反数填充到所述中间数据格式的第二位指数位(图7的位40)。如果所述16位人脑浮点数是非规格化浮点数,将中间数据格式的整数位的最后一位(图7的位31)填充0;如果所述16位人脑浮点数是规格化浮点数,将中间数据格式的整数位的最后一位(图7的位31)填充1。将中间数据格式的整数位的倒数第二位(图7的位32)统一填0。从所述中间数据格式的尾数位的首位(图7的位30)开始,依次放入所述16位人脑浮点数的尾数位。16位人脑浮点数的尾数位有7位。放入后,图7的位30-位24被人脑浮点数的尾数位,位0-23未被占用,可以在其中放入0。
[0158]
针对图6e的32位带符号整数、图6f的32位无符号整数、图6g的16位带符号整数、图6h的16位无符号整数、图6i的8位带符号整数、或图6j的8位无符号整数,将它们转换成33位带符号整数,再转换到中间数据格式。33位带符号整数就是用最高位(位32)表示数的正负,用其余的位0-31表示数的绝对值的整数。
[0159]
对于图6e的32位带符号整数来说,它本身是带符号的,不需要添加符号位。其与33位带符号整数就差了末尾的一位,因此,在32位带符号整数后面加上一位0,就得到了33位带符号整数。对于图6f的32位无符号整数来说,它本身是不带符号的,需要在其前面添加1位符号位0(表示正数),就得到了33位带符号整数。对于图6g的16位带符号整数来说,它本身是带符号的,不需要添加符号位。其与33位带符号整数末尾差了17位,因此,在16位带符号整数后面加上17位0,就得到了33位带符号整数。对于图6h的16位无符号整数来说,它本身是不带符号的,需要在其前面添加1位符号位0(表示正数),但17位与33位仍然相差16位,需要在其末尾加上16位0,就得到了33位带符号整数。对于图6i的8位带符号整数来说,它本身是带符号的,不需要添加符号位。其与33位带符号整数末尾差了25位,因此,在8位带符号整数后面加上25位0,就得到了33位带符号整数。对于图6j的8位无符号整数来说,它本身是不带符号的,需要在其前面添加1位符号位0(表示正数),但9位与33位仍然相差24位,需要在其末尾加上24位0,就得到了33位带符号整数。
[0160]
然后,将33位带符号整数转换成图7的中间数据格式。由于整数的符号不通过符号
位体现,因此可以将图7的中间数据格式的符号位(位42)统一设置为0。图7中实质上是通过31位的尾数位来表示整数值。由于尾数位默认小数点在首位尾数位的前面,它其实上是将整数表示成一个小数点在31位尾数位之前的小数乘以2的31次幂。由于9位指数位是围绕均值255(2
8-1)布局的,其目的是使该幂大于1的概率和小于1的概率均衡,因此,9位指数位设置为286对应的二进制值时,286-255=31,正好相当于表示乘以2的31次幂。因此,将33位带符号整数转换成中间数据格式时,9位指数位固定为286对应的二进制值。用所述33位带符号整数填充所述中间数据格式的整数位和尾数位。中间数据格式的整数位和尾数位合起来正好是33位,如图7所示。
[0161]
如上转换成的中间数据格式不一定是规格化的,其很有可能是非规格化的。例如,中间数据格式的整数位的最后一位可能是0,尾数位的前若干位也可能是0。考虑到本公开实施例实现的是各种不同的源数据格式通过中间数据格式向不同的目标数据格式的转换。为了保证转换到不同的目标数据格式都不出错,中间数据格式的数据应遵循一定标准。本公开实施例中,首先要使该中间数据格式的数据规格化。即,如果中间数据格式的整数位的最后一位是0,尾数位的前若干位也是0,要对其规格化,进行数据的移位,使中间数据格式的整数位的最后一位是1,成为规格化浮点数。例如,假设中间数据格式的整数位的最后一位是0,尾数位为0000010101010001110110001111101,指数位表示的指数是267,其实际表示的浮点数为0.0000010101010001110110001111101
×2267-255=0.0000010101010001110110001111101
×212
。该浮点数是非规格的,将其变成规格化浮点数后等于1.0101010001110110001111101
×26

[0162]
上述由非规格化浮点数变为规格化浮点数的实现过程是:首先,前导零计数单元412检查上述形成的中间数据格式的整数位的最后一位和所述尾数位形成的序列中从最高位开始的连续0的个数。如上例中有6个连续0。然后,通过左移位单元413将所述个数的连续0向左移出所述中间数据格式。如上例中,将0.0000010101010001110110001111101向左移6位。这样,该浮点数前面的6个0统统左移出了中间数据格式,右面空出来6个位补0。上例中的0.0000010101010001110110001111101所有位左移6位后变成1.0101010001110110001111101000000,此时就变成了一个规格化浮点数。左移若干位相当于a=m
×
b^e中的m乘以2的该位数次幂,如上例中,左移6位相当于m乘以2的6次幂。这样,需要将e减去该位数,才能保持a不变。因此,指数调整单元414调整所述指数位,使所述指数位对应的数值减去所述个数。如上例中,指数位表示的指数是267,使其变成261,261-255=6,这样非规格化浮点数0.0000010101010001110110001111101
×212
就变成了规格化浮点数1.0101010001110110001111101
×26

[0163]
通过使中间数据结构的非规格化浮点数变成规格化浮点数,使得转换成第二数据结构后具有统一标准,有利于转换结果的统一。
[0164]
为了使中间数据格式转换成目标数据格式不会溢出(例如,目标数据格式为图6c所示的16位浮点数,其指数位为5位,尾数位为10位,表示的最大值是1.1111111111
×216
,如果转换成目标数据格式后大于该值则溢出),用溢出检测单元415确定所述中间数据格式的数据转换成目标数据格式的数据后溢出。
[0165]
溢出是指转换为某一数据格式后的数值超过了该数据格式所能表示的值的范围。向上溢出是指转换为某一数据格式后的数值大于该数据格式所能表示的最大值。向下溢出
是指转换为某一数据格式后的数值小于该数据格式所能表示的最小值。
[0166]
图8示出了各种目标数据格式下向上溢出和向下溢出的判定条件。
[0167]
如果目标数据格式是32位浮点数,不会发生向上和向下溢出。这是因为如图6a-j所示,32位浮点数的指数位的位数和尾数位的位数都最多,因此表示的动态范围最宽,图6b-j的数据结构转换到32位浮点数都不会向上或向下溢出。
[0168]
如果目标数据格式是32位张量浮点数,在图6a-j示出的所有的数据结构中,其指数位的位数8位与图6a的32位浮点数并列是最多的,但图6a的32位浮点数的尾数位比它的尾数位多,因此,如果转换到32位张量浮点数的目标数据格式发生了溢出,则源数据格式是32位浮点数,此时相当于图7的指数位(位41-位33)表示的数值是383的情况。由于指数位表示的值要使整个的幂值在大于1的概率和小于1的概率上保持均衡,中间值是255。383-255=128。128的值表示在图6b的8位指数位上会超上限,无法表示,因此向上溢出。目标数据格式是32位张量浮点数时,向下溢出不会发生。
[0169]
如果目标数据格式是16位浮点数,图7的中间数据格式的9位指数位对应的数值大于等于271,则确定向上溢出。其原因是,图7的中间数据格式的9位指数位的中间值是255。271-255=16。此时,该9位指数位实际表示的指数值大于等于16。图6c的5位指数位表示的指数的动态范围是-14到15。因此,该9位指数位实际表示的指数值超出了图6c的5位指数位表示的指数值的上限,发生向上溢出。图7的中间数据格式的9位指数位对应的数值小于等于240,则确定向下溢出。这是因为240-255=-15,小于图6c的5位指数位表示的指数值的下限-14。
[0170]
如果目标数据格式是16位人脑浮点数,图7的中间数据格式的9位指数位对应的数值大于等于383,则确定向上溢出。其原因是,图7的中间数据格式的9位指数位的中间值是255。383-255=128。此时,该9位指数位实际表示的指数值大于等于128。图6d的8位指数位表示的指数的动态范围是-126到127。因此,该9位指数位实际表示的指数值超出了图6d的8位指数位表示的指数值的上限,发生向上溢出。图7的中间数据格式的9位指数位对应的数值小于等于128,则确定向下溢出。这是因为128-255=-127,小于图6d的8位指数位表示的指数值的下限-126。
[0171]
如果目标数据格式是32位带符号整数,图7的中间数据格式的9位指数位对应的数值大于等于286且符号位为0,则确定向上溢出。图7的中间数据格式的9位指数位的中间值是255。286-255=31。图7的中间数据格式的9位指数位对应的数值大于等于286,实际上意味着将图7的中间数据格式的数据表示成小数点在图7的位30之前的数乘以2的31以上次方的形式。乘以2的31以上次方,换算到图6e中只有31个整数位的数,一定会溢出。如果符号为0,说明是正数,因此向上溢出。如果图7的中间数据格式的9位指数位对应的数值大于等于286且符号位为1,则确定向下溢出。
[0172]
如果目标数据格式是32位无符号整数,图7的中间数据格式的9位指数位对应的数值大于等于287,则确定向上溢出。图7的中间数据格式的9位指数位的中间值是255。287-255=31。图7的中间数据格式的9位指数位对应的数值大于等于287,实际上意味着将图7的中间数据格式的数据表示成小数点在图7的位30之前的数乘以2的32以上次方的形式。乘以2的31以上次方,换算到图6f中只有32个整数位的数,一定会向上溢出。如果图7的中间数据格式的9位指数位对应的数值小于等于254,则确定向下溢出。254-255=-1。图7的中间数据
格式的9位指数位对应的数值小于等于254,实际上意味着将图7的中间数据格式的数据表示成小数点在图7的位30之前的数乘以2的-1以下次方的形式,转换不成图6d中的整数,确定向下溢出。
[0173]
如果目标数据格式是16位带符号整数,图7的中间数据格式的9位指数位对应的数值大于等于270且符号位为0,则确定向上溢出。图7的中间数据格式的9位指数位的中间值是255。270-255=15。图7的中间数据格式的9位指数位对应的数值大于等于270,实际上意味着将图7的中间数据格式的数据表示成小数点在图7的位30之前的数乘以2的15以上次方的形式。乘以2的15以上次方,换算到图6g中只有15个整数位的数,一定会溢出。如果符号为0,说明是正数,因此向上溢出。如果图7的中间数据格式的9位指数位对应的数值大于等于270且符号位为1,则确定向下溢出。
[0174]
如果目标数据格式是16位无符号整数,图7的中间数据格式的9位指数位对应的数值大于等于271,则确定向上溢出。图7的中间数据格式的9位指数位的中间值是255。271-255=16。图7的中间数据格式的9位指数位对应的数值大于等于271,实际上意味着将图7的中间数据格式的数据表示成小数点在图7的位30之前的数乘以2的16以上次方的形式。乘以2的16以上次方,换算到图6h中只有16个整数位的数,一定会向上溢出。如果图7的中间数据格式的9位指数位对应的数值小于等于254,则确定向下溢出。254-255=-1。图7的中间数据格式的9位指数位对应的数值小于等于254,实际上意味着将图7的中间数据格式的数据表示成小数点在图7的位30之前的数乘以2的-1以下次方的形式,转换不成图6h中的整数,确定向下溢出。
[0175]
如果目标数据格式是8位带符号整数,图7的中间数据格式的9位指数位对应的数值大于等于262且符号位为0,则确定向上溢出。图7的中间数据格式的9位指数位的中间值是255。262-255=7。图7的中间数据格式的9位指数位对应的数值大于等于262,实际上意味着将图7的中间数据格式的数据表示成小数点在图7的位30之前的数乘以2的7以上次方的形式。乘以2的7以上次方,换算到图6i中只有7个整数位的数,一定会溢出。如果符号为0,说明是正数,因此向上溢出。如果图7的中间数据格式的9位指数位对应的数值大于等于262且符号位为1,则确定向下溢出。
[0176]
如果目标数据格式是8位无符号整数,图7的中间数据格式的9位指数位对应的数值大于等于263,则确定向上溢出。图7的中间数据格式的9位指数位的中间值是255。263-255=8。图7的中间数据格式的9位指数位对应的数值大于等于263,实际上意味着将图7的中间数据格式的数据表示成小数点在图7的位30之前的数乘以2的8以上次方的形式。乘以2的8以上次方,换算到图6j中只有8个整数位的数,一定会向上溢出。如果图7的中间数据格式的9位指数位对应的数值小于等于254,则确定向下溢出。254-255=-1。图7的中间数据格式的9位指数位对应的数值小于等于254,实际上意味着将图7的中间数据格式的数据表示成小数点在图7的位30之前的数乘以2的-1以下次方的形式,转换不成图6j中的整数,确定向下溢出。
[0177]
溢出处理单元416对溢出的目标数据格式的数据进行预定处理。该预定处理可以是将指数位设置成某一预留数值。例如,可以预留全1的指数位表示溢出的情况。这样,全1的指数位就不能表达正常的指数数值,使得指数位能够表达的指数数值范围缩减。
[0178]
另外,在一个实施例中,需要让中间数据格式的数据转换到目标数据格式后成为
规格化数据,从而使转换成各种目标数据格式时都是统一的,即转换成某一种目标数据格式得到的是唯一结果,提高结果的统一性。
[0179]
在该实施例中,转换后非规格化确定单元417确定所述中间数据格式的数据转换成目标数据格式的数据后是否为非规格化数据或整数。确定的方法可以是,按照公式(-1)^sign*2^(exponent-255)*(integer[0]+fraction*2^-31-2*integer[1])确定中间数据格式表示的值,然后根据上文描述的图6a-j中各第二数据结构的数据值计算公式,确定各第二数据结构中的各字段,判断其中的指数位是否为全0,如果是全0,则是规格化数据,否则是非规格化数据或整数。
[0180]
然后,右移位单元418根据是否为非规格化数据或整数的确定结果,对所述中间数据格式的尾数位进行向右移位,使得中间数据格式移位并转换成目标数据格式的数据之后为规格化数据。
[0181]
下面介绍右移位单元418根据是否为非规格化数据或整数的确定结果,对所述中间数据格式的尾数位进行向右移位的一种实施方式。本领域技术人员应当理解,还可以有其它方式进行向右移位。
[0182]
移位的数值需要确保不同的目标数据格式需要的有意义的数据位是右对齐的,即图6a-d的尾数位中的有效数据位靠尾数位的右侧对齐,图6e-j的整数位中的有效数据位靠整数位的右侧对齐。这样做是为了做舍入时可以用统一的加法。
[0183]
在该实施方式中,如果目标数据格式是32位浮点数或32位张量浮点数,在确定是非规格化数据的情况下,所述指数位对应的数值为t,将所述中间数据格式向右移(137-t)位;在确定是规格化数据的情况下,将所述中间数据格式向右移8位。这是因为,图7的中间数据格式的尾数位是31位,而图6a-b中尾数位是23位,中间差了8位。如上所述,需要保证有效数据位向右侧对齐,因此,无论是规格化数据还是非规格化数据,都需要向右移8位。如果是非规格化数据,还需要在此基础上多移(129-t)位。如上所述,中间格式数据的指数位表示的值t中,128是中间偏移量,从而保证最后形成的a=m
×
b^e中的b^e大于1的概率和小于1的概率均衡。e=t-128。当确定所述中间数据格式的数据转换成目标数据格式的数据后是非规格化数据,应该将中间数据格式的尾数位除了右移固定的8位后,再右移1-e位(由于转换到目标数据格式后是非规格化数据,因此,这里的e大多数情况是负数),从而将转换后成为规格化数据。将e=t-128代入1-e,得到应将所述中间数据格式向右移(137-t)位。在此基础上转换成目标数据格式才能使得到的数值为规格化浮点数。
[0184]
在该实施方式中,如果目标数据格式是16位浮点数,在确定是非规格化数据的情况下,所述指数位对应的数值为t,将所述中间数据格式向右移(262-t)位;在确定是规格化数据的情况下,将所述中间数据格式向右移21位。这是因为,图7的中间数据格式的尾数位是31位,而图6c中尾数位是10位,中间差了21位。如上所述,需要保证有效数据位向右侧对齐,因此,无论是规格化数据还是非规格化数据,都需要向右移21位。如果是非规格化数据,还需要在此基础上多移(241-t)位。推导出多右移(241-t)位的过程与上述针对32位浮点数或32位张量浮点数推导出多右移(129-t)位的过程类似,故不赘述。
[0185]
在该实施方式中,如果目标数据格式是16位人脑浮点数,在确定是非规格化数据的情况下,所述指数位对应的数值为t,将所述中间数据格式向右移(153-t)位;在确定是规格化数据的情况下,将所述中间数据格式向右移24位。这是因为,图7的中间数据格式的尾
数位是31位,而图6d中尾数位是7位,中间差了24位。如上所述,需要保证有效数据位向右侧对齐,因此,无论是规格化数据还是非规格化数据,都需要向右移24位。如果是非规格化数据,还需要在此基础上多移(129-t)位。推导出多右移(129-t)位的过程与上述针对32位浮点数或32位张量浮点数推导出多右移(129-t)位的过程类似,故不赘述。
[0186]
在该实施方式中,如果目标数据格式是32位带符号整数、32位无符号整数、16位带符号整数、16位无符号整数、8位带符号整数、或8位无符号整数,所述指数位对应的数值为t,将所述中间数据格式向右移(286-t)位。其推导过程与上述类似,故不赘述。
[0187]
右移位单元418将中间数据格式的尾数位向右移位时,可能要损失精度。因为中间数据格式的尾数位向右移位时,一些尾数位可能就移出了图7的31位尾数位的右边界,造成精度的损失。例如,将尾数0.1100010011000001100000101110101向右移5位,变成0.0000011000100110000011000001011,最右面的5位10101移出了字段外。如果将移出字段外的所有位自动忽视,精度损失较大。因此,在一个实施例中,由舍入单元419进行舍入处理,以减少精度的损失。
[0188]
舍入单元419基于所述右移位单元418向右移出所述中间数据格式的尾数位,确定是否为所述中间数据格式中留下的尾数位进行进位操作。进位操作是指在中间数据格式中留下的最低尾数位上加1。如何根据向右移出的尾数位,确定是否进行进位操作,属于已有技术。例如,将尾数0.1100010011000001100000101110101向右移5位,变成0.0000011000100110000011000001011,移出中间数据格式右边界的5位是10101。根据这5位的值,可以按照已有不同准则,决定是否进行进行操作。这些不同准则是已有的,在这里不赘述。如果决定进位,在0.0000011000100110000011000001011最后一位上加1后,变成0.0000011000100110000011000001100。
[0189]
第二格式转换单元421将中间数据格式的数据按照第二规则转换成目标数据格式的数据。所述中间数据格式的数据可以是上述经过了规格化、溢出检测及相应处理、转换后非规格化处理的中间数据格式的数据,也可以是省略上述的一项或多项处理的中间数据格式的数据。
[0190]
下面将详细描述根据本公开一个实施例的第二规则。
[0191]
在该实施例中,如果目标数据格式是如图6a-b所示的32位浮点数或32位张量浮点数,将如图7所示的中间数据格式的符号位(图7的位42)填充到如图6a-b所示的32位浮点数或32位张量浮点数的符号位(图6a-b的位31)。将图7所示的中间数据格式的后7位指数位(图7的位33-39)填充到所述32位浮点数或32位张量浮点数的后7位指数位(图6a-b的位23-29)。将图7所示的中间数据格式的首位指数位(图7的位41)填充到图6a-b所示的32位浮点数或32位张量浮点数的首位指数位(图6a-b的位30)。将图7所示的中间数据格式的尾数位的最后23位(图7位0-22)作为所述32位浮点数的尾数位(图6a的位0-22),或将图7所示的中间数据格式的尾数位的最后10位(图7的位0-9)作为所述32位张量浮点数的尾数位(图6b的位0-9)。
[0192]
在该实施例中,如果目标数据格式是如图6c所示的16位浮点数,将如图7所示的中间数据格式的符号位(图7的位42)填充到如图6c所示的16位浮点数的符号位(图6c的位15)。将如图7所示的中间数据格式的后4位指数位(图7的位33-36)填充到如图6c所示的16位浮点数的后4位指数位(图6c的位10-13)。将如图7所示的中间数据格式的首位指数位(图
7的位41)填充到所述16位浮点数的首位指数位(图6c的位14)。将如图7所示的中间数据格式的尾数位的最后10位(图7的位0-9)作为所述16位浮点数的尾数位(图6c的位0-9)。
[0193]
在该实施例中,如果目标数据格式是图6d所示的16位人脑浮点数,将如图7所示的中间数据格式的符号位(图7的位42)填充到如图6d所示的16位人脑浮点数的符号位(图6d的位15)。将如图7所示的中间数据格式的后7位指数位(图7的位33-39)填充到图6d所示的16位人脑浮点数的后7位指数位(图6d的位7-13)。将如图7所示的中间数据格式的首位指数位(图7的位41)填充到图6d所示的16位人脑浮点数的首位指数位(图6d的位40)。将如图7所示的中间数据格式的尾数位的最后7位(图7的位0-6)作为图6d所示的16位人脑浮点数的尾数位(图6d的位0-6)。
[0194]
在该实施例中,如果目标数据格式是图6e所示的32位带符号整数,将图7所示的中间数据格式的整数位(图7的位31-32)和去掉前面的1位的尾数位(图7的位0-29)接续,作为图6e所示的32位带符号整数。图7的位32表示整数的符号,其与图6e的位31是一致的。
[0195]
在该实施例中,如果目标数据格式是图6f所示的32位无符号整数,将图7所示的中间数据格式的整数位和尾数位(图7的位0-32)取出,去掉首位(为32),作为图6f所示的32位无符号整数。
[0196]
在该实施例中,如果目标数据格式是图6g所示的16位带符号整数,将图7所示的中间数据格式的整数位(图7的位31-32)和去掉前面的17位的尾数位(图7的位0-13)接续,作为图6g所示的16位带符号整数。图7的位32表示整数的符号,其与图6g的位15是一致的。
[0197]
在该实施例中,如果目标数据格式是图6h所示的16位无符号整数,将图7所示的中间数据格式的去掉首位的整数位(图7的位31)、和去掉前面16位的尾数位(图7的位0-14)接续,作为图6h所示的16位无符号整数。
[0198]
在该实施例中,如果目标数据格式是图6i所示的8位带符号整数,将图7所示的中间数据格式的整数位(图7的位31-32)和去掉前面的25位的尾数位(图7的位0-5)接续,作为图6i所示的8位带符号整数。图7的位32表示整数的符号,其与图6i的位7是一致的。
[0199]
在该实施例中,如果目标数据格式是图6j所示的8位无符号整数,将图7所示的中间数据格式的去掉首位的整数位(图7的位31)、和去掉前面24位的尾数位(图7的位0-6)接续,作为图6j所示的8位无符号整数。
[0200]
在执行数据格式转换的运算单元是图3的指令执行单元226的情况下,源数据格式的数据从寄存器堆229中的寄存器430中由所述指令执行单元226读出。所述目标数据格式的数据由所述指令执行单元226写入该寄存器430。
[0201]
在执行数据格式转换的运算单元是图4的张量引擎310的情况下,源数据格式的数据从片上内存360中由所述张量引擎310读出。所述目标数据格式的数据由所述张量引擎310写入该片上内存360。
[0202]
另外,本公开实施例可以体现为片上系统的形式,它包括如图3所示的处理单元220、加速单元230中的至少一个。片上系统(soc:system-on-a-chip)指的是在单个芯片上集成的一个完整的系统,在该系统中对所有或部分必要的电子电路进行包分组。所谓完整的系统一般包括处理单元或加速单元、存储器、以及外围电路等。
[0203]
数据格式转换方法
[0204]
如图9所示,根据本公开的一个实施例,提供了一种数据格式转换方法,包括:
[0205]
步骤510、将源数据格式的数据按照第一规则转换成中间数据格式;
[0206]
步骤520、将所述中间数据格式的数据按照第二规则转换成目标数据格式的数据,其中,所述中间数据格式至少包括所述源数据格式所有的字段和所述目标数据格式所有的字段,且所述中间数据格式的字段中的位数不小于所述源数据格式和目标数据格式中任一个数据格式的相应字段的位数。
[0207]
可选地,所述中间数据格式包括符号位、指数位、整数位、尾数位,所述中间数据格式表示的值为:(-1)^sign*2^(exponent-255)*(integer[0]+fraction*2^-31-2*integer[1]),其中,^表示指数,sign表示符号位,sign=0表示正数,sign=1表示负数,exponent指数位对应的数值,integer[0]是整数位的最后一位,用0表示非规格化浮点数,用1表示规格化浮点数,fraction表示尾数位,integer[1]是整数位的倒数第2位,用0表示尾数为正数,用1表示尾数为负数。
[0208]
可选地,在将源数据格式的数据按照第一规则转换成中间数据格式之后,该方法还包括:
[0209]
检查所述整数位的最后一位和所述尾数位形成的序列中从最高位开始的连续0的个数;
[0210]
将所述个数的连续0向左移出所述中间数据格式;
[0211]
调整所述指数位,使所述指数位对应的数值减去所述个数。
[0212]
可选地,在调整所述指数位,使所述指数位对应的数值减去所述个数之后,所述方法还包括:
[0213]
确定所述中间数据格式的数据转换成目标数据格式的数据后溢出;
[0214]
对溢出的目标数据格式的数据进行预定处理。
[0215]
可选地,在对溢出的目标数据格式的数据进行预定处理之后,所述方法还包括:
[0216]
确定所述中间数据格式的数据转换成目标数据格式的数据后是否为非规格化数据或整数;
[0217]
根据是否为非规格化数据或整数的确定结果,对所述中间数据格式的尾数位进行向右移位,使得中间数据格式移位并转换成目标数据格式的数据之后为规格化数据。
[0218]
可选地,在根据是否为非规格化数据或整数的确定结果,对所述中间数据格式的尾数位进行向右移位之后,所述方法还包括:基于所述右移位单元向右移出所述中间数据格式的尾数位,确定是否为所述中间数据格式中留下的尾数位进行进位操作。
[0219]
本公开实施例的商业价值
[0220]
本公开实施例用一个数据路径支持多种数据类型之间任意转换,而且可以和已有的数据路径进行复用,而且能从范围大的数据类型转到数据范围小的数据类型,大大减少了芯片上用于数据格式转换部分的面积开销(减少到一半以上),具有良好的市场前景。
[0221]
应该理解,本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同或相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于方法实施例而言,由于其基本相似于装置和系统实施例中描述的方法,所以描述得比较简单,相关之处参见其他实施例的部分说明即可。
[0222]
应该理解,上述对本说明书特定实施例进行了描述。其它实施例在权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺
序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0223]
应该理解,本文用单数形式描述或者在附图中仅显示一个的元件并不代表将该元件的数量限于一个。此外,本文中被描述或示出为分开的模块或元件可被组合为单个模块或元件,且本文中被描述或示出为单个的模块或元件可被拆分为多个模块或元件。
[0224]
还应理解,本文采用的术语和表述方式只是用于描述,本说明书的一个或多个实施例并不应局限于这些术语和表述。使用这些术语和表述并不意味着排除任何示意和描述(或其中部分)的等效特征,应认识到可能存在的各种修改也应包含在权利要求范围内。其他修改、变化和替换也可能存在。相应的,权利要求应视为覆盖所有这些等效物。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1