首页 / 专利库 / 工业自动化和数控机床 / 精度 / 用于使用操作的混合精度分解的较高精度计算的计算机处理器

用于使用操作的混合精度分解的较高精度计算的计算机处理器

阅读:825发布:2020-09-30

专利汇可以提供用于使用操作的混合精度分解的较高精度计算的计算机处理器专利检索,专利查询,专利分析的服务。并且本文中详述的 实施例 关于浮点值的算术操作。示例性处理器包括解码 电路 ,该解码电路用于对指令解码,其中该指令 指定 多个操作数的 位置 ,这些操作数的值按照浮点格式。示例性处理器进一步包括执行电路,该执行电路用于执行经解码的指令,其中执行包括:转换每个操作数的值,每个值被转换为多个较低 精度 的值,其中为每个操作数存储指数;在从多个操作数的值转换而来的较低精度的值之间执行算术操作;以及通过将来自算术操作的所得到的值转换为浮点格式来生成浮点值,并存储浮点值。,下面是用于使用操作的混合精度分解的较高精度计算的计算机处理器专利的具体信息内容。

1.一种处理器,包括:
解码电路,用于对指令解码,其中,所述指令指定多个操作数的位置,所述多个操作数的值为浮点格式;以及
执行电路,用于执行经解码的指令,所述执行包括用于:
转换每个操作数的值,每个值被转换为多个较低精度的值,其中,将为每个操作数存储指数;
在从所述多个操作数的值转换而来的较低精度的值之间执行算术操作;以及通过将来自所述算术操作的所得到的值转换为所述浮点格式来生成浮点值,并存储所述浮点值。
2.如权利要求1所述的处理器,其中,转换操作数的值用于:
使用多个位来表示被转换为所述多个较低精度的值的每个值,所述多个位至少包括第一多个位和第二多个位;
标识所述多个位中的用于第一较低精度的值的所述第一多个位以对所述每个值进行逼近;以及
标识不与所述第一多个位重叠的用于第二较低精度的值的所述第二多个位以表示所述第一较低精度的值的所述逼近的其余部分,
其中,所述第一较低精度的值和所述第二较低精度的值用于与来自一个或多个其他操作数的较低精度的值执行所述算术操作。
3.如权利要求1或2所述的处理器,其中,转换操作数的值进一步用于:
基于值的值范围和所述多个较低精度的值来确定用于所述操作数的指数,所述多个较低精度的值各自都是整数值;以及
基于所述值范围将所述每个值量子化为整数值。
4.如权利要求3所述的处理器,其中,所述值范围基于检查所述操作数的所有值而被确定。
5.如权利要求2所述的处理器,其中,所述第一较低精度的值和所述第二较低精度的值中的每一个是较低精度的浮点值。
6.如权利要求1或2所述的处理器,其中,所述执行电路包括一个或多个专用乘法器-累加器MAC电路,并且所述一个或多个专用MAC电路用于执行整数乘法-累加操作。
7.如权利要求6所述的处理器,其中,每个MAC电路是融合乘加FMA电路。
8.如权利要求1或2所述的处理器,其中,每个操作数指定矩阵、向量、或多维张量或标量。
9.如权利要求1或2所述的处理器,其中,所述多个较低精度的值基于由所述指令指定的服务质量QoS来确定。
10.如权利要求1或2所述的处理器,其中,要执行的所述算术操作的数量基于由所述指令指定的服务质量QoS要求。
11.一种方法,包括:
对指令解码,其中,所述指令指定多个操作数的位置,所述多个操作数的值为浮点格式;以及
执行经解码的指令以用于:
转换每个操作数的值,每个值被转换为多个较低精度的值,其中,将为每个操作数存储指数;
在从所述多个操作数的值转换而来的较低精度的值之间执行算术操作;以及通过将来自所述算术操作的所得到的值转换为所述浮点格式来生成浮点值,并存储所述浮点值。
12.如权利要求11所述的方法,其中,转换操作数的值用于:
使用多个位来表示被转换为所述多个较低精度的值的每个值,所述多个位至少包括第一多个位和第二多个位;
标识所述多个位中的用于第一较低精度的值的所述第一多个位以对所述每个值进行逼近;以及
标识不与所述第一多个位重叠的用于第二较低精度的值的所述第二多个位以表示所述第一较低精度的值的所述逼近的其余部分,
其中,所述第一较低精度的值和所述第二较低精度的值用于与来自一个或多个其他操作数的较低精度的值执行所述算术操作。
13.如权利要求11或12所述的方法,转换操作数的值进一步用于:
基于值的值范围和所述多个较低精度的值来确定用于所述操作数的指数,所述多个较低精度的值各自都是整数值;以及
基于所述值范围将所述每个值量子化为整数值。
14.如权利要求13所述的方法,其中,所述值范围基于检查所述操作数的所有值而被确定。
15.如权利要求12所述的方法,其中,所述第一较低精度的值和所述第二较低精度的值中的每一个是较低精度的浮点值。
16.如权利要求11或12所述的方法,其中,每个操作数指定矩阵、向量、或多维张量或标量。
17.如权利要求11或12所述的方法,其中,所述多个较低精度的值基于由所述指令指定的服务质量QoS来确定。
18.如权利要求11或12所述的方法,其中,要执行的所述算术操作的数量基于由所述指令指定的服务质量QoS要求。
19.一种存储有指令的非暂态机器可读介质,所述指令当由处理器执行时使所述处理器执行方法,所述方法包括:
对指令解码,其中,所述指令指定多个操作数的位置,所述多个操作数的值为浮点格式;以及
执行经解码的指令以用于:
转换每个操作数的值,每个值被转换为多个较低精度的值,其中,将为每个操作数存储指数;
在从所述多个操作数的值转换而来的较低精度的值之间执行算术操作;以及通过将来自所述算术操作的所得到的值转换为所述浮点格式来生成浮点值,并存储所述浮点值。
20.如权利要求19所述的非暂态机器可读介质,其中,所述多个较低精度的值基于由所述指令指定的服务质量QoS来确定。

说明书全文

用于使用操作的混合精度分解的较高精度计算的计算机处

理器

技术领域

[0001] 本发明实施例关于计算机处理器架构领域,更具体地关于对用于计算机处理器架构内的算术操作的值的精度转换。

背景技术

[0002] 矩阵、向量和其他多维数据集在诸如机器学习和其他批量数据处理之类的许多计算任务中正日益重要。对这些多维数据集中的浮点数据元素执行算术操作可能是资源密集型的和/或在计算上耗时的。附图说明
[0003] 通过参考用于示出本发明的实施例的以下描述和所附附图,可最佳地理解本发明。在附图中:
[0004] 图1示出根据本发明的一个实施例的操作:将每个值从浮点值转换为多个整数以用于算术操作,并且将来自这些算术操作的所得到的值往回重构为浮点。
[0005] 图2A示出根据本发明的一个实施例的用于将FP32值转换为三个无符号8位整数的伪代码。
[0006] 图2B示出根据本发明的一个实施例的用于将FP32值转换为两个无符号16位整数的伪代码。
[0007] 图2C示出根据本发明的一个实施例的用于将FP32值转换为三个有符号8位整数的伪代码。
[0008] 图2D示出根据本发明的一个实施例的用于将FP32值转换为四个无符号8位整数的伪代码。
[0009] 图2E示出根据本发明的一个实施例的用于从四个有符号8位整数重构FP32值的伪代码。
[0010] 图3示出相比先前方式使用浮点到多个整数方式的本发明的实施例的数据准确性。
[0011] 图4示出根据本发明的一个实施例的操作:将每个值从值转换为多个较低精度的浮点以用于算术操作,并且将来自这些算术操作的所得到的值往回重构为浮点。
[0012] 图5A示出根据本发明的一个实施例的用于将FP32值转换为两个bfloat16值的伪代码。
[0013] 图5B示出根据本发明的一个实施例的用于从两个bfloat16值构造FP32值的伪代码。
[0014] 图6示出相比先前方式使用浮点到多个较低精度浮点方式的本发明的实施例的数据准确性。
[0015] 图7A是示出根据本发明的一个实施例的算术操作的流程图,该算术操作包括:将浮点值转换为多个较低精度的值,并且将所得到的值往回重构为浮点。
[0016] 图7B是示出根据本发明的一个实施例的从浮点值到多个较低精度的值的值转换的流程图。
[0017] 图8A是示出根据本发明的实施例的示例性有序流线和示例性的寄存器重命名的乱序发布/执行流水线两者的框图
[0018] 图8B是示出根据本发明的实施例的要包括在处理器中的有序架构核的示例性实施例和示例性的寄存器重命名的乱序发布/执行架构核两者的框图。
[0019] 图9是根据本发明的实施例的具有集成存储器控制器和图形器件的单核处理器和多核处理器的框图。
[0020] 图10示出根据本发明的一个实施例的系统的框图。
[0021] 图11示出根据本发明的实施例的第二系统的框图。
[0022] 图12示出根据本发明的实施例的第三系统的框图。
[0023] 图13示出根据本发明的实施例的芯片上系统(SoC)的框图。
[0024] 图14示出根据本发明的实施例的对照使用软件指令转换器将源指令集中的二进制指令转换成目标指令集中的二进制指令的框图。
[0025] 图15A和图15B是示出根据本发明的实施例的通用向量友好指令格式及其指令模板的框图。
[0026] 图16A-图16D是示出根据本发明的实施例的示例性专用向量友好指令格式的框图。
[0027] 图17是根据本发明的一个实施例的寄存器架构的框图。
[0028] 图18A是根据本发明的实施例的单个处理器核以及其到管芯上互连网络的连接以及它的第2级(L2)高速缓存的本地子集的框图;并且
[0029] 图18B是根据本发明的实施例的图18A中的处理器核的部分的展开图。
[0030] 图19图示经配置的片的实施例。
[0031] 图20图示矩阵存储的若干示例。
[0032] 图21图示利用矩阵(片)操作加速器的系统的实施例。
[0033] 图22和图23示出如何使用矩阵操作加速器来共享存储器的不同实施例。
[0034] 图24图示使用片的矩阵乘法累加操作(“TMMA”)的实施例。
[0035] 图25图示链式融合乘法累加指令的迭代的执行的子集的实施例。
[0036] 图26示出根据实施例的尺寸为2的幂的SIMD实现方式,其中,累加器使用比至乘法器的输入的尺寸大的尺寸。

具体实施方式

[0037] 在以下描述中,阐述了众多特定细节。然而,应当理解,可在没有这些特定细节的情况下实践本发明的实施例。在其他实例中,未详细示出公知的电路、结构和技术,以免使对本说明书的理解含糊。
[0038] 带括号的文本和具有虚线边界(诸如,长划线、短划线、点划线和点线)的框可用于图示任选操作,这些任选操作将附加特征添加至本发明的实施例。然而,此类标注法不应当认为意指这些是仅有的选项或仅有的任选操作,和/或在本发明的一些实施例中具有实线边界的框不是任选的。
[0039] 说明书中对“一个实施例”、“实施例”、“示例实施例”等等的引用表明所描述的实施例可包括特定的特征、结构或特性,但是每个实施例不一定都包括该特定的特征、结构或特性。此外,此类短语不一定是指同一个实施例。此外,当结合实施例描述特定的特征、结构或特性时,认为结合无论是否被明确描述的其他实施例而影响此类特征、结构或特性是在本领域技术人员的知识范围之内的。
[0040] 以下描述和权利要求书可使用术语“耦合的”和“连接的”及其衍生词。这些术语不旨在互为同义词。“耦合的”用于指示彼此可以或可以不直接物理接触或电气接触的两个或更多个元件彼此协作或相互作用。“连接的”用于指示彼此耦合的两个或更多个元件之间的通信的建立。如本文中所使用,“集合”是指包括一个项的任何正整数个项。值的精度
[0041] 在计算中,值经常以整数格式或浮点格式来表示。值占据计算机存储器中的多个位。取决于计算中使用的值的范围,可分配不同数量的位。例如,整数可占用8个位,如果其是有符号整数则具有-128至127的范围(-27至27-1),并且如果其是无符号整数则具有0至255的范围(0至28-1)。该8位的整数格式常简写为int8,例如,针对有符号整数的int8以及针对无符号整数的unit8。除了专被称为无符号或有符号的示例之外,每当我们写下“int”时,它也可用“uint”来替换。在计算中使用多种整数格式,并且表1示出示例性整数格式的列表。
表1.示例性整数格式
[0042] 整数格式的范围对于有符号整数为-2(n-1)至2(n-1)-1,并且对于无符号整数为0至2n-1。整数格式能以精确的精度表示整数,但是对于除整数之外的实数(其是不包括整数的无理数或有理数),以整数格式存储的值是这些值的逼近。要使用相同数量的位表示相同范围内的值,以整数格式对实数进行逼近经常不如以浮点格式对实数进行逼近那么精确。
[0043] 浮点(FP)格式将实数的公式化表示用作逼近以支持范围与精度之间的权衡。值可以逼近地被表示为固定数量的有效数位(有效数字,其也可称为“尾数”,并且这两个术语可互换地使用),并且使用以某个固定底数的指数来缩放(注意,指数也可称为比例或指数比例,并且这些术语可互换地使用);用于缩放的底数可以是2、10或16(或另一整数)。值能以以下形式来表示:有效数字×底数指数,其中,有效数字可以是整数值或浮点值,底数是大于或等于2的整数,并且指数是整数。利用固定数量的数位,浮点系统可用于在计算中表示不同数量级的值。在计算中使用多种浮点格式,并且表2示出示例性浮点格式的列表。表2.示例性浮点格式
[0044] 在表2中,浮点格式的精度从bfloat16浮点格式增加到八精度浮点格式,因为更多位被用于有效数字精度(从bfloat16中的8个位到八精度中的237个位)。
[0045] 在表2中的示例性浮点格式中,bfloat16是相对新的浮点格式,由于其在机器学习(ML)和人工智能(AI)算法中运行良好的能,其似乎正获得引领力。但是bfloat16可能具有比单精度浮点格式(FP32)低的准确性,因为如图2中所示,FP32值具有8位的指数和24位的有效数字(1个有效数字是隐式的),而bfloat16值具有8位的指数和8位的有效数字。减少的有效数字尺寸意味着在bfloat16格式中许多值(但不是所有值)不能够如在FP32格式中那样准确地被表示。
[0046] 由于专用电路/逻辑使用bfloat16格式被构建(例如,在机器学习中),因此,尤其是在向量/矩阵计算(例如,通用矩阵-矩阵乘法,GEMM)中期望使用bfloat16格式在计算中表示较高的精度值(例如,以FP32、FP64、FP128或FP256格式存储的值),并且随后使用bfloat16运行算术操作。本发明的一些实施例将多个(K个)bfloat16值组合在一起来表示较高精度的浮点值。由于多个bfloat16值具有8×K个有效数字精度位,因此它们可以通过增加倍数K在任意的较高精度值格式内表示单个值。因此,本发明的实施例可利用现有的bfloat16硬件单元(例如,电路),这些现有的bfloat16硬件单元(例如,电路)专门用于bfloat16算术操作,并且能够比使用FP32、FP64、FP128或FP256格式的经典浮点硬件单元/电路运行得快一个或多个数量级。使用bfloat16硬件单元/电路运行bfloat16算术操作可通过组合多个bfloat16值来接近和/或超过FP32/64/128/256准确性,并且可附加地实现比使用FP32、FP64、FP128或FP256格式的经典浮点硬件单元/电路更快的执行速率。
[0047] 除了bfloat16之外,机器学习(ML)和人工智能(AI)还广泛地使用诸如int4、int8、int16、int32、int64和inte128之类的整数格式。在ML和/或AI中,浮点值(例如,以FP32、FP64、FP128或FP256格式存储的浮点值)可被量子化(quantize)为以整数格式存储,并且整数格式的经量子化的值随后用于(例如,神经网络中的)ML和/或AI应用。量子化在该应用中是有帮助的,因为基于ML/AI的硬件常包括硬件单元(例如,电路),这些硬件单元(例如,电路)专门用于整数算术操作,并且能够比使用FP32、FP64、FP128或FP256格式的经典浮点硬件单元/电路运行得快一个或多个数量级。使用整数硬件单元/电路运行整数算术操作可通过组合多个整数值来接近和/或超过FP32/64/128/256准确性,并且可附加地实现比使用FP32、FP64、FP128或FP256格式的经典浮点硬件单元/电路更快的执行速率。
[0048] 将单个浮点值从FP32、FP64、FP128或FP256格式转换为bfloat16格式或诸如int8和int16之类的整数格式的多个值常导致这多个值中的每个值中按照比原始浮点值较低精度的多个值,因为更少的位被用于表示这多个值中的每个值(因此被称为较低精度的值)。但是针对bfloat16格式和整数格式的更快的硬件单元/电路(例如,比使用FP32、FP64、FP128或FP256格式的经典浮点硬件单元/电路快一个或多个数量级)存在于一些计算机架构中,并且经转换的值可用于多个算术操作中(例如,在向量或矩阵算术操作中,经转换的值常被使用多次),使得转换和重构的附加成本(例如,计算时间和硬件/软件资源)散布于多个算术操作,本发明的实施例可导致更快的总算术操作时间(因此产生更高的吞吐量)以及与不具有转换的算术操作大致相同的准确性或甚至比不具有转换的算术操作更好的准确性。
[0049] 本文中的以下本文中的本公开中提供的示例使用从FP32到bfloat16的转换以及从FP32到int8的转换。显然,本发明的实施例不限于此,并且一种浮点格式(例如,表2中的格式)的值中的每个值可使用本发明的实施例被转换为:(1)较低精度的浮点格式(例如,在表2中具有更少有效数字位的另一格式)的多个值;或者(2)整数格式(其按照较低精度,并且其可以是表1中的具有更小的位长度的格式)的多个整数值。此类转换可实现更快的总算术操作时间(因此产生更高的吞吐量)以及与不具有转换的算术操作逼近相同的准确性或甚至比不具有转换的算术操作更好的准确性。
[0050] 本发明的实施例可实现用于此类转换的新指令,并且这些不仅可用于机器学习(ML)和人工智能(AI),而且可用于高性能计算(HPC)应用和其他应用。本发明的实施例可利用专用于特定数据格式(例如,bfloat16或各种整数格式)的算术操作(例如,通用矩阵-矩阵乘法(GEMM))的硬件电路(例如,乘法器-累加器(MAC)电路、融合乘加(FMA)电路)。附加于和/或替代于如所讨论的更快的总算术操作时间,本发明的实施例可如下文更详细地所解释来调整算术操作的准确性。注意,虽然针对矩阵乘法给出示例,但是本发明的实施例可应用于在1D、2D、3D或其他维数组之间(诸如,矩阵与矩阵之间、矩阵与向量之间、或向量与矩阵之间)的其他算术操作(加法、减法、乘法和除法中的一个或多个)。将每一个从浮点转换为多个整数
[0051] 输入浮点值可通过量子化被转换为多个整数。输入浮点值的量子化增加了对于量子化支持的额外需求。但是量子化允许所得到的多个整数值使用整数单元,这些整数单元能比计算机处理器中使用FP32、FP64、FP128或FP256的经典浮点硬件单元/电路快一个或多个数量级地被执行。
[0052] 在一个实施例中,计算机处理器可取得指令,该指令指定至少两个操作数,每个操作数都包括浮点格式的参数。这些参数可与一维(1D)、二维(2D)、三维(3D)或任何其他维的数组的输入相对应。1D数组可被称为N个数据元素的向量,并且2D数组可被称为M*N个数据元素的矩阵或片(tile)(注意,在本公开中术语“矩阵”和“片”可互换地使用)。数据元素典型地按照相同浮点格式(例如,FP32、FP64、FP128或FP256格式中的一种)。指令用于执行两个操作数之间的一个或多个算术操作,并且算术操作可以是加法、减法、乘法和除法中的一个或多个。由操作数标识的浮点值中的每个浮点值可被量子化为多个整数,并且这多个整数的共享的指数可被存储在存储器或寄存器(例如,处理器的物理寄存器堆(PRF)内的寄存器)内。处理器可执行一系列整数算术操作并标识最终指数,最终在将执行结果存储在所得到的1D数组或2D数组中之前将该执行结果往回转换为浮点。
[0053] 量子化为整数以及往回转换为浮点值不遵照当前的针对值表示的电气与电子工程师协会(IEEE)标准,诸如,IEEE 754标准。但是这一系列整数算术操作可利用用于执行整数乘法-累加操作的整数算术硬件单元/电路,诸如,乘法器-累加器(MAC)电路(也称为乘-加电路或MADD电路)。在一个实施例中,MAC电路包括融合乘加(FMA)电路。MAC电路在它们的整数算术操作中可以比使用FP32、FP64、FP128或FP256格式的经典浮点硬件单元/电路运行得快一个或多个数量级。在一些实施例中,非遵照IEEE的计算提供相比不具有量子化和转换的浮点算术操作可比拟的或更好的准确性。
[0054] 图1示出根据本发明的一个实施例的操作:将每个值从浮点值转换为多个整数以用于算术操作,并且将来自这些算术操作的所得到的值往回重构为浮点。在标记102处,对指令解码。该指令指定至少两个操作数,每个操作数分别标识针对数组的位置(例如,存储器、高速缓存或寄存器),该数组分别为FP32格式的矩阵A{m,k}和FP32格式的矩阵B{k,n}。在本发明的实施例中,矩阵A和矩阵B可存储在寄存器、高速缓存或存储器中。
[0055] 在标记104和106处,随后将矩阵A和矩阵B中的值量子化。量子化产生矩阵A’和矩阵B’,它们包含针对矩阵A和矩阵B中的对应值的16位经量子化的值。随后,每个经量子化的值被分割为两部分:在标记112和116处,获取高8位值以形成矩阵A1和矩阵B1;并且在标记114和118处,获取低8位值以形成矩阵A2和B2。随后,在标记122至128处,执行整数算术操作。在该示例中,整数算术操作是矩阵之间的积。也可以在标记122至128处执行其他算术操作(例如,加法、减法、乘法和除法中的一个或多个)。执行四次积操作:A1*B1、A1*B2、A2*B1和A2*B2。取决于实现方式,可串行地或并行地执行积操作。随后,通过标记132处的去量子化将来自标记122至128的所得到的整数往回重构和转换为FP32。
[0056] 注意,如标记122至128处所示的积操作可被累加到输入值的位长度的多倍,使得结果的准确性被维持。在该示例中,两个输入int8值(各自为8位)可被累加在最少16个位(优选地24个或更多个位)中作为算术操作结果,因此存储积操作的结果的累加器对于每个积结果的位宽度为至少2*8=16位。在本发明的实施例中,理念在于用于存储经转换的较低精度值之间的算术操作的结果的累加器足够大,使得不损失算术操作的准确性。实现累加/累加器的整数算术操作硬件电路(例如,MAC和/或FMA电路)不遵从当前的IEEE标准,但是操作的混合精度分解允许本发明的实施例以较高精度执行算术操作。
[0057] 计算工作的一个衡量是计算复杂度,其可用大写的O记号O(x)来标记,其中,x是作业的最高数量级。在该示例中,处理器执行算术操作四次,每个整数计算具有计算复杂度O(mnk)。也就是说,计算的最高数量级是m*n*k(针对m*n个数据元素的k个乘积)的一倍或多倍。随后,处理器执行往回转换为FP32,这对于浮点计算具有计算复杂度O(mn)。如果在标记104-132中在不具有量子化和重构的情况下执行矩阵A与矩阵B之间的积,则矩阵A与矩阵B之间的浮点计算具有计算复杂度O(mnk)。但是,具有O(mnk)的整数计算可以比具有O(mnk)的浮点计算快十倍或更多倍(即,快一个或多个数量级)。因此,图1中示出的操作即便多执行四次内积也可比不具有量子化和重构过程的浮点积更高效。
[0058] 注意,在该示例中,图1中的矩阵的值被量子化,并且随后被分割为两部分。如以下示例所示,本发明的实施例包括将经量子化的值分割为多于两个部分。在一些实施例中,每个FP32值(24个有效数字精度位)被分割为三个int8是优选的(3*8位=24位)。一般而言,被分割部分的数量可取决于使用浮点值的量子化的逼近的期望准确性。
[0059] 可使用获得期望准确性所必需的那么多位来对浮点值量子化。例如,FP32的值17.1可使用int16或甚至int8被量子化为整数值17。但是为了实现更高的准确性,本发明的实施例可使用两个int16值或四个int8值(这两种情况都使用32位)来对值量子化。该量子化可使用较小的指数来将值量子化为较大的整数。以下示例说明了将原始的FP32值量子化和分割为多个整数值。
示例1:将FP32值转换为三个无符号整数uint8
[0060] 对于该转换,假定值的范围在[Minval,Maxval]([最小值,最大值])内。例如,数据数组的值的范围可以为[-19,19],并且FP32的值17.1将被量子化。图2A示出根据本发明的一个实施例的用于将FP32值转换为三个无符号8位整数的伪代码。在标记202处,确定比例,并且该比例基于整数格式(uint8)以及要使用的整数数量(三个)。因此,比例为(Maxval–Minval)/(2^(整数长度*整数数量)-1),其按十进制为38/(2^(8*3)-1)=38/16,777,215=2.2649766*(10^(-6))。该比例可存储在寄存器、高速缓存或存储器中。
[0061] 在标记204处,随后三个数被设置为掩码以从经量子化的FP32值获得三个部分的较低精度的值。first_8_bits将仅选取前8个位,因为255具有二进制的全1(位0-7);second_8_bits将选取中间8个位,因为65280在位8-15中具有全1并在位8-7中具有0;并且third_8_bits将仅选取第三组8个位,因为16,711,680在位16-23中具有全1并在位0-15中具有0。
[0062] 在标记206处,获得中介值v=17.1–(-19)=36.1。在标记208处,将该中介值量子化,其中,经量子化的值num=uint32_t 36.1/比例=15,938,354。经量子化的值是具有24个位的二进制数[11110011][00110011][00110010],其中添加了括号以示出三个部分的划分。在标记210处,使用在标记204处定义的掩码将经量子化的中介值分为三个部分。对于第二部分和第三部分,所得到的值是右移8位和16位的位,使得它们是使得q1=[00110010];q2=[00110011];q3=[11110011]的8位的值。这三个无符号整数随后可用于与通过对另一FP32值量子化而得到的其他无符号整数进行算术操作。算术操作可使用诸如乘法器-累加器(MAC)电路之类的整数算术操作电路,其中,每个8位的值基于其部分位置被分配至相应的MAC电路,并且计算的结果如本文中上文所讨论地被重构。虽然在该示例中使用掩码来获得三个部分的较低精度的值,但是人们也可使用其他方法来获得较低精度的值。例如,可使用移位和/或截断来获得较低精度的值。本发明的实施例涵盖获得/标识较低精度的值的各种方法。
[0063] 注意,量子化的精度基于比例的值,并且比例越小,就从量子化得到越好的逼近。比例值基于若干因素:值的范围、以及可用的位的数量。范围越小和/或可用于量子化的位越多,比例就越小且逼近就越好。
[0064] 可由用于请求算术操作的指令提供比例的值。例如,除了各自都包含数据元素的1D数组、2D数组、3D数组或其他维数组的两个或更多个操作数之外,该指令还可包括指定数组范围的一个或更多个操作数。替代地或附加地,处理器可在接收到该指令时扫描数组的数据元素并确定范围。
示例2-4:将FP32值转换为不同数量的整数
[0065] 示例2-4提供FP32值的量子化的更多示例。图2B示出根据本发明的一个实施例的用于将FP32值转换为两个无符号16位整数的伪代码。该伪代码与图2A中的伪代码类似,但是比例更小,并且两个16位的值q1和q2使用比三个8位的值q1、q2和q3更多的位,该量子化可能导致比图2A中的量子化更好的逼近。
[0066] 图2C示出根据本发明的一个实施例的用于将FP32值转换为三个有符号8位整数的伪代码。图2C与图2A类似,并且一个区别在于在标记230处生成三个8位的值,其中q1、q2和q3的值是以有符号8位整数的范围(从无符号整数的范围[0,28-1]到有符号整数的范围[-27,27-1])为基础而减去128(27)。
[0067] 图2D示出根据本发明的一个实施例的用于将FP32值转换为四个无符号8位整数的伪代码。图2D与图2A类似,并且一个区别在于,利用32个位(每个整数8个位*4个整数=32)用于量子化,比例更小,因此该量子化可能导致比图2A中的量子化更好的逼近。
[0068] 虽然在图2A-图2D中的示例中使用FP32,但是可使用类似的伪代码对诸如FP64、FP128或FP256之类的其他浮点格式的值进行量子化。例如,FP64具有用于其有效数字的53个位,通过使用7个8位的无符号整数(uint8),我们可以完成覆盖FP64有效数字的精度。该比例是甚至更小的值:比例=(maxval–minval)/(2^(8*7)-1。一般而言,可用于量子化的位的数量可以是相应浮点格式的有效数字的位长度或超过相应浮点格式的有效数字的位长度。在一些实施例中,可能期望刻意使用比相应浮点格式的有效数字的位长度小的位长度(例如,以实现服务质量妥协——相比原始的浮点格式较不准确但快得多)。
[0069] 注意,当软件例程可用且快速时,使用本发明的实施例的量子化可能不是必要的。例如,人们可将FP128值量子化为uint16的8长型串,但是软件双-双精度或软件四精度可比使用uint16的8长型串的算术操作操作得更快。确定是否进行量子化以及使用多少位进行量子化可取决于执行快速整数算术操作的硬件电路的可用性以及该硬件电路多快。计算速度增加的幅度应当补偿执行如本文中所讨论的量子化和重构所需的额外工作。
示例5:从四个有符号整数重构FP32值
[0070] 一旦来自量子化和分割的多个整数值执行了算术操作,就重构它们以便以初始值的浮点格式返回最终结果。图2E示出根据本发明的一个实施例的用于从四个有符号8位整数重构FP32值的伪代码。即便在此有符号整数在图2E中被使用,比例也保持与图2D中的转换为四个无符号整数的另一示例相同,因为相同数量的位(32个位)被用于量子化和重构。经重构的中介值为num,该num在标记240处通过以下方式被获得:基于有符号8位整数(int8)的范围调整范围,并且随后进行位移位,因为来自算术操作的四个有符号整数与最终结果的不同的位的位置相对应。在标记242处,随后使用最小值和比例将该中介值往回转换为FP32,该中介值是由四个有符号8位累加的结果的完整的32个位表示的整数,该结果可能已经是32位。
[0071] 注意,在一些实施例中,对较低精度的int8值的算术操作中的每个算术操作可能已经被累加为较大的int类型,诸如,int32值。随后组合int32值以形成算术操作的结果。随后,向FP32的重构可以是简单地将int32值转换为对应的FP32值(无需图2E中图示出的移位)。调整工作负载和准确性:浮点到整数
[0072] 在与图1有关的示例中,两个矩阵被分割为两个对项,并且对它们进行矩阵乘法产生了标记122-128中的任一标记中示出的整数操作的工作量的四倍。但是,在一些计算机架构中,由于按照整数的算术操作可显著地比按照浮点的相同算术操作运行得更快,因此执行附加的转换和重构可以比对原始的浮点值进行算术操作更高效。此外,可跳过整数操作中的一些整数操作以使本发明的实施例更高效。
[0073] 由于不同数量的整数被用于转换浮点,因此从两个矩阵之间的矩阵操作得到不同数量的项。例如,如果两个整数被用于分割矩阵的每个数据元素,则对于矩阵乘法执行四倍量的乘法(如在标记122-128中所示)。如果使用三个整数,则执行九倍量的乘法,并且如果使用四个整数,则执行16倍量的乘法。由于可精确地(没有来自算术操作的任何准确性损失)执行整数算术硬件电路(例如,MAC电路),因此对整个工作负载的计算可以是非常准确的(仅在量子化步骤损失准确性)。而如果我们在算术操作中牺牲一些准确性,则我们可以跳过多倍的工作负载中的一些。
[0074] 例如,在图1中,对A的量子化导致使用高8位形成的矩阵A1和使用低8位形成的矩阵A2,并且对B的量子化导致使用高8位形成的矩阵B1和使用低8位形成的矩阵B2。工作负载可被表达为int8x2_4p,其中“int8x”指示int8操作,“2”指示每个FP32值被分割为2个int8值,并且“4p”指示四个项被包括在计算中。替代四倍量的工作负载A1*B1、A1*B2、A2*B1和A2*B2,我们可跳过针对最低有效部分的乘法,即低8位之间的乘法A2*B2。工作负载可被示出为int8x2_3p(比包括A2*B2的int8x2_4p少一个项)。因此,替代四倍量的工作负载,我们可以(以一些准确性损失为代价)通过执行针对三个较高有效部分的乘法来节省大约25%工作负载。
[0075] 对于另一示例,对A的量子化得到三个矩阵A1至A3,每个矩阵都使用从最高有效的位到最低有效的位的8个位来形成(即,A1:位23-16;A2:位15-8;以及A3:位7:0),并且对B的量子化可以得到三个矩阵B1至B3,每个矩阵都使用从最高有效的位到最低有效的位的8个位来形成(即,B1:位23-16;B2:位15-8;以及B3:位7:0)。工作负载是九倍量的一个矩阵乘法:int8x3_9p,其为A1*B1+A1*B2+A1*B3+A2*B1+A2*B2+A2*B3+A3*B1+A3*B2+A3*B3。类似地,我们可以跳过针对最低有效部分的乘法,即最低的8位之间的乘法A3*B3,并获得int8x3_8p。
[0076] 此外,如果我们想要进一步移除工作负载,我们可以移除较低的一个或多个有效部分,由此降低准确性同时增加计算速度或减少计算资源使用。例如,我们可丢弃具有加到5或更大的系数的项,由此我们可以额外丢弃A2*B3和A3*B2。为了进一步增加计算速度或减少计算资源使用,我们可以进一步丢弃具有加到4或更大的系数的项:A1*B3、A2*B2、A3*B1。
丢弃的项越多,在对不具有量子化和重构的浮点值进行逼近时所得到的经重构的浮点值就越不准确,但是执行的工作负载也少。本发明的实施例提供用于调整工作负载和准确性的方法。
[0077] 使用本发明的实施例的应用可针对算术操作的准确性、工作负载限制、计算速度要求来确定一个或多个服务质量(QoS)要求,并且实现本发明的实施例的处理器可确定如何满足这些QoS要求。例如,处理器可确定:(1)多少个整数;(2)整数中的每个整数的位长度;(3)整数是有符号还是无符号的;和/或(4)用多少项来运行算术操作。该确定可基于所接收的指令。除了各自包含数据元素的数组的两个或更多操作数之外,该指令还可指定指明(1)至(4)中的一项或多项的一个或多个操作数。注意,确定(1)至(2)还对本文中上文关于示例1所讨论的比例的计算作出贡献。
[0078] 在一些实施例中,由处理器作出的确定也可在无需指令指定的情况下在内部被确定。处理器可基于可用的计算资源(例如,可用的电路、所需的带宽、和/或用于所需算术操作的寄存器/高速缓存/存储器中的存储空间)来确定(1)至(4)。注意,包括转换和重构的内部算术操作对于使用本发明的一些实施例的应用是不可见的。
[0079] 通过本发明的一些实施例中的任选的调整,应用可具有多于先前所讨论的选项:在算术操作中使用浮点(其可以是准确的但是慢);使用量子化以将每个浮点值量子化为单个整数(其可以是不精确的但是快);或者使用量子化以将每个浮点值量子化为多个整数,运行整数算术操作,并且往回重构为浮点(其可以是快且相对准确的,或甚至比原始的浮点值更准确)。本发明的实施例提供另一旋钮(knob)以调整工作负载来适应应用的QoS要求和/或更好地利用处理器的可用计算资源。
[0080] 注意,可存储本发明的实施例中的经量子化的结果用于指令的乱序执行。例如,如果在第一指令中对矩阵A的值进行量子化,则可将经量子化的结果存在PRF中的寄存器中。当后续的第二指令也使用矩阵A时,可从该寄存器获得矩阵A的所存储的经量子化的结果,并且无需重复的量子化。
浮点到整数方式相比先前方式的准确性
[0081] 如本文中上文所讨论,在没有本发明的实施例的情况下,人们能以浮点运行算术操作,这可以是准确的,但是慢。人们也能以整数运行算术操作,其中,以单个整数来量子化每个浮点值(与本发明的实施例中的使用多个整数进行量子化形成对照),这较不准确,但是快。另一方面,使用本发明的实施例可提供准确性和速度两者,或者提供期望的准确性和速度妥协。使用伪随机值的测试确认了本发明的实施例的特征。
[0082] 图3示出相比先前方式使用浮点到多个整数方式的本发明的实施例的数据准确性。输入数据是在[0,1]之间的单精度伪随机值。x轴是所执行的连续点积的数量(可被称为问题尺寸),并且y轴是所得到数据的准确性。如人们将会预期,序列中越多点积被执行,所得到的数据将越不准确,因为每个浮点点积仅可保持有限数量的位。例如,FP32具有用于有效数字精度的24个位,因此多于24个位的点积结果被截断,由此导致较低的准确性。当更多结果从左到右被累加在轴上时,示出更不精确的所得到的数据。
[0083] 在标记302处示出点积的基线准确性。数据未经量子化,并且使用FP32的输入数据来执行点积。该点积的准确性好于标记304处示出的准确性,在标记304处,每个数据被量子化为单个int16整数。考虑到由于量子化而损失的准确性,这并不令人意外。
[0084] 标记306示出使用本发明的实施例的点积的准确性,其中每个值被量子化为两个int16整数。本发明的实施例的准确性不仅相比量子化为单个值更好,而且相比无量子化更好。本发明的实施例相对于无量子化方式的改进可归结于在后者中运行FP32点积时的中介误差。在该示例中,第一点积的中介结果是对第二点积的输入,并且第二点积的中介结果是对第三点积的输入。点积的中介结果中的每个中介结果会截断多个位,因此会损失一些准确性。相比之下,在前者中,由于int16整数被累加到较宽的累加字段(例如,在该示例中,64位点积),因此在没有准确性损失的情况下完成积。
[0085] 也就是说,本发明的一些实施例在初始的量子化时损失准确性,但是此后将点积作为整数点积来执行,并且中介结果是整数,并且将这些整数存储在具有足够长的位宽的累加器中,由此不导致准确性的累积损失。一般而言,在本发明的一些实施例中,当算术操作包括一系列操作时,利用足够长而不损失准确性的位宽存储中介结果。例如,两个int16的第一点积的第一中介结果将被存储在32位(或更长)的累加字段中,并且(1)第一中介结果与(2)第三int16值之间的点积的下一中介结果将被存储在48位(或更长)的累加字段中。由于在本发明的这些实施例中链算术操作不损失准确性,因此当顺序地执行大量算术操作时,本发明的这些实施例的优势更明显。
将每一个从浮点转换为多个较低精度的浮点
[0086] 与从浮点转换到整数类似,本发明的实施例包括从浮点值的转换,每个浮点值转换为多个较低精度的浮点值,诸如bfloat16。
[0087] 图4示出根据本发明的一个实施例的操作:将每个值从浮点值转换为多个较低精度浮点以用于算术操作,并且将从这些算术操作得到的值往回重构为浮点。该示例将FP32的值转换为bfloat16,但是当然从较高精度的浮点到较低精度的浮点的其他转换也可使用本发明的实施例。
[0088] 操作开始于标记402,并且操作与图1中的标记102处的操作类似,因此在此不重复相关讨论。随后将值中的每个值转换为bfloat16格式的两个值。在标记404和406处,利用bfloat16格式的值来逼近FP32的A和B中的值。(bfloat16格式的)A1和B1的值是(FP32格式的)A和B的值的逼近,并且具有比A和B的值低的精度,因为bfloat16比FP32具有更少的尾数位(8位相对于24位)。如在标记412和416处所示,A1和B1具有由A和B中的值的最高有效的8位尾数表示的值。在标记414和416处,在减去A1和B1之后A和B的其余部分以bfloat16格式分别被逼近为A2和B2。在标记422-428处,执行两个矩阵对的bfloat16浮点积:A1*B1、A1*B2、A2*B1和A2*B2。取决于实现方式,可串行地或并行地执行积操作。在标记432处,随后将来自标记422至428的所得到的值往回重构和转换为FP32。
[0089] 注意,与本文中上文讨论的浮点到整数方式类似,如标记422至428处所示的积操作可被累加到输入值的位长度的多倍。累加位宽度比输入值的位宽度更宽,使得累加比在其中累加位宽度等于输入值的位宽度的情况更精确。在该示例中,这两个输入bfloat16值(各自具有8位的有效数字精度)可累加到FP32(其包括16位的有效数字精度)或更多以作为算术操作结果。例如,累加器可将积的算术操作结果存储为FP32值(具有24位的有效数字精度)。因此,标记422至428的结果可以已经为FP32格式,并且重构可以是标记422至428的结果的简单的和而无需往回转换。实现此类累加/累加器的浮点算术操作硬件电路(例如,MAC和/或FMA电路)不遵从当前的IEEE标准,但是操作的混合精度分解允许本发明的实施例以更高精度执行算术操作。
[0090] 与图1中的算术操作类似,处理器执行四次算术操作,每个bfloat16计算具有计算复杂度O(mnk)(针对m×n个数据元素的k个积),随后处理器执行往回转换为FP32,这对于FP32浮点计算具有计算复杂度O(mnk)。使用bfloat16算术操作的计算复杂度(其具有O(mnk)的四倍)显得比使用FP32算术操作的计算复杂度(其为O(mnk))更糟糕。但是可使用专门用于bfloat16算术操作的算术电路来执行标记422-428处的矩阵算术操作,并且可比使用FP32的经典浮点硬件单元/电路快一个或多个数量级地运行这些bfloat16算术电路。因此,通过执行图4中的操作(包括将FP32值各自转换为多个bfloat16值,随后使用bfloat16来运行算术操作,随后往回转换为FP32值)可以比对FP32值执行算术操作更高效。
[0091] 注意,向较低精度值的转换、算术操作的执行以及重构可不遵从用于值表示的电气与电子工程师协会(IEEE)标准,诸如,IEEE 754标准。但是对较低精度值的这一系列算术操作可利用算术硬件单元。示例6和示例7:将FP32值转换为多个bfloat16值,并从多个bfloat16值重构FP32值[0092] 在图4中,矩阵A和矩阵B内的每个FP32值被转换为两个bfloat16值。图5A示出根据本发明的一个实施例的用于将FP32值转换为两个bfloat16值的伪代码。在标记502处,使用bfloat16值b1来逼近FP32值x。在标记504处,x减去b1的其余部分被设置为FP32值tmp。随后在标记506处,使用bfloat16值b2来逼近FP32值tmp。如关于图4所讨论,这两个bfloat16值b1和b2随后用于数组(1D或2D)之间的算术操作。
[0093] 一旦完成了算术操作,就可返回bfloat16值。例如,标记422至428处的操作可得到bfloat16值(在一些实施例中,这些结果可已经为FP32,并且重构不需要如本文中上文所讨论的往回转换),并且可将这些bfloat16值往回转换为FP32格式。图5B示出根据本发明的一个实施例的用于从两个bfloat16值构造FP32值的伪代码。如标记510处所示,FP32值x的构造仅仅是将以FP32格式存储的两个bfloat16值相加。调整工作负载和准确性:浮点到较低精度的浮点
[0094] 虽然图4-图5示出一个FP32值转换为两个bfloat16值,但是显然人们可将该FP32值转换为多于两个bfloat16值。对每个FP32值使用不同数量的bfloat16值的差异在于计算复杂度。与本文中讨论的浮点到多个整数方式类似,当如图4中所示将每个FP32值分割为两个bfloat16值导致四倍量的乘法时,将每个FP32值分割为三个bfloat16值导致九倍量的乘法,并且将每个FP32值分割为四个bfloat16值导致16倍量的乘法。而如果我们在算术操作中牺牲一些准确性,则我们可以跳过多倍的工作负载中的一些。
[0095] 例如,我们可以按如下方式引用bfloat16乘法的四个内积:bx2_4p:由A1*B1+A1*B2+A2*B1+A2*B2给出
其中,“bx”指示bfloat16操作,“2”指示每个FP32值被分割为两个bfloat16值,并且“4p”指示四个项被包括在计算中。
[0096] 为了减少工作负载,我们可以跳过较低阶的项A2*B2,使得工作负载变成以下形式:bx2_3p:由A1*B1+A1*B2+A2*B1给出
[0097] 类似地,用于将每个FP32值分割为三个bfloat16值的工作负载可被示出为如下形式:bx3_9p:由A1*B1+A1*B2+A1*B3+A2*B1+A2*B2+A2*B3+A3*B1+A3*B2+A3*B3给出[0098] 人们可以通过跳过最低阶的项A3*B3(即,跳过具有加到6的系数的(多个)项)来减少工作负载:
bx3_8p:由A1*B1+A1*B2+A1*B3+A2*B1+A2*B2+A2*B3+A3*B1+A3*B2给出
[0099] 可通过丢弃具有加到5的系数的附加项A3*B2和A2*B3并得到bx3_6p来进一步减少工作负载。该过程可以继续。通过丢弃更多的项,减少了工作负载,这能以降低计算准确性为代价增加计算速度和/或减少计算资源使用。表3示出当值从FP32转换为bfloat16或int8时示例性项选择的列表。表3.针对从FP32到bfloat16和int8的转换的示例性项选择
[0100] 使用本发明的实施例的应用可针对算术操作的准确性、工作负载限制、计算速度要求来确定一个或多个服务质量(QoS)要求,并且实现本发明的实施例的处理器可确定如何满足这些QoS要求。例如,处理器可确定:(1)要使用什么较低精度的浮点格式(例如,bfloat16或相对于原始浮点格式的其他较低精度的格式);(2)要使用多少较低精度的浮点值来转换原始的浮点格式;和/或(3)用多少项来运行算术操作。该确定可基于所接收的指令。除了各自包含数据元素的数组的两个或更多操作数之外,该指令还可指定指明(1)至(3)中的一项或多项的一个或多个操作数。
[0101] 在一些实施例中,由处理器作出的确定也可在无需指令指定的情况下在内部被确定。处理器可基于可用的计算资源(例如,可用的电路、所需的带宽、和/或用于所需算术操作的寄存器/高速缓存/存储器中的存储空间)来确定(1)至(3)。注意,包括转换和重构的内部算术操作对于使用本发明的这些实施例的应用是不可见的。
[0102] 通过本发明的一些实施例中的任选的调整,应用可具有多于先前所讨论的两个选项:在算术操作中使用原始的浮点(这可以是准确的,但是慢);或将每个原始的浮点值转换为多个较低精度的浮点值,运行整数算术操作,并且往回重构为原始浮点格式的浮点(这可以是快的且相对准确,或甚至更准确)。本发明的实施例提供另一旋钮(knob)以调整工作负载来适应应用的QoS要求和/或更好地利用处理器的可用计算资源。
[0103] 注意,可存储本发明的实施例中的中介结果用于指令的乱序执行。例如,如果在第一指令中矩阵A的值被分割为两个较低精度的浮点值(例如,图4中的A1和A2),则可将这些较低精度的浮点值存储在PRF中的寄存器中(或存储在高速缓存或存储器中)。当后续的第二指令也使用矩阵A时,可从该寄存器获得矩阵A的所存储的较低精度的浮点值,并且无需重复的量子化。浮点到多个较低精度的浮点方式相比先前方式的准确性
[0104] 如本文中上文所讨论,在没有本发明的实施例的情况下,人们能以原始的浮点格式来运行算术操作,这可以是准确的,但是慢。人们也能以较低精度的浮点格式来运行算术操作,其中使用较低精度的浮点值来逼近每个原始的浮点值(与在本文中的实施例中将多个较低精度的浮点值用于单个原始的浮点值形成对照),这较不准确,但是快。另一方面,使用本发明的实施例可提供准确性和速度两者,或者提供期望的准确性和速度妥协。使用伪随机值的测试确认了本发明的实施例的特征。
[0105] 图6示出相比先前方式使用浮点到多个较低精度浮点方式的本发明的实施例的数据准确性。图6的布局与图3的布局类似,并且如在标记650处所解释,原始数据是在[-1.0,1.0]范围内的FP64的伪随机值。
[0106] 在标记602处示出原始的FP32的点积的基线准确性(如按照FP64准确性所衡量)。与图3类似,执行越多连续的点积,结果就越不准确,并且随着问题尺寸增加,曲线移向更不准确(在图中从左到右往上)。相比之下,每个FP32值可被转换为单个bfloat16值,并且由于bfloat16的较低精度,标记604处的准确性曲线显著地差于FP32的准确性曲线,如在标记
652处所解释。
[0107] 人们可将每个FP32值转换为两个bfloat16值,并使用点积的所有四个项(与上文所讨论的四个项类似:A1*B1、A1*B2、A2*B1和A2*B2)在标记612处被标注为bx2_4p点的准确性曲线是结果。点积可跳过最低阶的项(例如,A2*B2),这得到标记614处的准确性曲线(被标注为bx2_3p)。可以理解的是,bx2_4p点的准确性比bx2_3p的准确性好,并且这两者都不如FP32基线准确。bx2相对于基线的更差的准确性也是符合逻辑的,因为每个bfloat16具有8位有效数字精度,两个bfloat16总共具有16位有效数字精度。相比之下,每个FP32具有24位有效数字精度,因此使用两个bfloat16值来表示一个FP32值会导致显著的准确性损失。
初始转换中的准确性损失导致低于基线的转换和重构总准确性。
[0108] 人们也可将每个FP32分割为三个bfloat16,并且使用点积的所有九个项(与上文讨论的四个项类似:A1*B1、A1*B2、A1*B3、A2*B1、A2*B2、A2*B3、A3*B1、A3*B2和A3*B3)。标记622处的标注为bx3_9p点的准确性曲线是结果。点积可跳过其系数加到5或更大的最低阶项以得到六个项(即,丢弃A3*B2、B2*A3和A3*B3),这导致标记624处的准确性曲线(标注为bx3_6p)。能够理解的是,bx3_9p点的准确性比bx3_6p的准确性好。
[0109] 然而,似乎违反直觉的是,bx3_9p和bx3_6p两者的准确性示出为比FP32的基线准确性好。通过进一步的审视,该准确性改善也是符合逻辑的。三个bfloat16总共具有24位的有效数字精度,因此从FP32值(其也作为24位的有效数字精度)向三个bfloat16值的转换不损失准确性。在使用原始的FP32值的连续点积期间,中间误差如本文中在上文关于图3所讨论的那样累积。相比之下,可在不损失准确性的情况下执行从FP32值向三个bfloat16值的转换,并且使用bfloat16的点积可在中介算术操作期间维持更好的准确性,因为用于中介算术操作结果的累加器具有的位宽是输入值的位宽的多倍(例如,输入bfloat16值的8位有效数字精度相比用于存储中介算术操作结果的FP32累加器的24位有效数字精度)。因此,bx3_9p和bx3_6p的准确性比原始的FP32的准确性好。在那种情况下,本发明的实施例可实现更好的准确性和快的执行速度两者(假定专用bfloat16运行得比FP32快一个或多个数量级)。本发明的一些实施例
[0110] 图7A是示出根据本发明的一个实施例的算术操作的流程图,该算术操作包括:将浮点值转换为多个较低精度的值,并且将从算术操作所得到的值往回重构为浮点。可在包含解码电路和执行电路的处理器上执行方法700。在标记702处,解码电路对指令解码,其中该指令指定多个操作数的位置,这些操作数的值按照浮点格式。该指令可指定至少两个操作数,每个操作数包括供数据元素执行算术操作的一个或多个参数。指令的操作码(opcode)可指示要执行的算术操作。此外,操作码和/或操作数可指示多个操作数的值为浮点格式。
[0111] 例如,操作数中的每个操作数可指示浮点格式的向量(1D数组)、矩阵(2D数组)。每个操作数还可指示也按照浮点格式的多维张量(描述几何向量、标量和其他张量之间的线性关系的几何对象)或标量。浮点格式可以是标准FP16、FP32、FP64、FP128或FP256中的一种,或者可以是具有其自身的对指数宽度、有效数字精度和/或符号位的定义的专属浮点格式。每个向量或矩阵可包含多个数据元素,每个数据元素被存在诸如寄存器、高速缓存或计算机存储器之类的一个或多个存储单元中。操作数可指向存储单元(例如,存储器、高速缓存或寄存器)的位置,使得解码电路可获得向量或矩阵的数据元素。算术操作可以是对数据元素的加法、减法、乘法和除法中的一个或多个。
[0112] 在一个实施例中,一个或多个附加的操作数可指定针对算术操作的一个或多个服务质量(QoS)要求。QoS要求可以是以下一项或多项:算术操作的准确性(指令所要求的预期在算术操作后维持的准确性水平)、工作负载限制(预期在算术操作期间消耗的计算资源)、计算速度要求(预期完成算术操作的执行时间)。在一个实施例中,QoS要求确定执行电路如何执行经解码的指令。替代地或附加地,在一个实施例中,操作码可指定针对算术操作的一个或多个服务质量(QoS)要求。此外,操作码和一个或多个附加的操作数可指定用于存储算术操作结果的经累加的位长度(例如,如本文中上文所讨论,作为输入值的多倍的位长度)。
[0113] 在标记704处,执行电路执行经解码的指令。该执行包括:在标记712处,对于每个操作数转换值,每个值被转换为多个较低精度的值,其中,将对于每个操作数存储指数。用于每个操作数的指数可被存储在寄存器、高速缓存或存储器中。在一个实施例中,较低精度的值按照整数格式,诸如,int4、int8、int16、int32、int64、int128或另一n位的整数。该整数格式具有比由向量或矩阵使用的浮点格式的有效数字精度位更少的位。在另一实施例中,较低精度的值为另一浮点格式,该另一浮点格式具有比由向量或矩阵使用的浮点格式的有效数字精度位更少的位。当较低精度的值为该另一较低精度的浮点格式时,所存储的指数是针对操作数的较低精度的值中的一个。
[0114] 在一个实施例中,针对每个值的经转换的较低精度的值的数量可取决于针对QoS要求的附加操作数。例如,当预期算术操作的准确性为高时,可将每个值转换为更多较低精度的值(例如,可将每个A转换为A1、A2和A3,而不是如图1和图4中的示例中那样转换为A1和A2)。此外,当更多计算资源可用于执行时,也可将每个值转换为更多较低精度的值。此外,当预期执行时间为短(例如,低于快速执行的所指定阈值或通用指示)时,可将每个值转换为更少较低精度的值。
[0115] 执行进一步包括:在标记714处,在从多个操作数的值转换而来的较低精度的值之间执行算术操作。算术操作包括在图1和图4中示出并且在本文中上文的相关的段落中讨论的算术操作。可在专用于特定算术操作的电路中执行算术操作。例如,当执行电路包括一个或多个专用乘法器-累加器(MAC)电路时,这一个或多个专用MAC电路用于执行整数乘法-累加操作。在一个实施例中,每个MAC电路是融合乘加(FMA)电路。在一个实施例中,电路可专用于bfloat16格式的低精度浮点值。例如,在机器学习(ML)和人工智能(AI)应用中已为bfloat16算术操作构建了专用电路。
[0116] 在一个实施例中,算术操作的数量可取决于针对QoS要求的附加操作数。例如,当预期算术操作的准确性为高时,执行更多算术操作;并且当预期算术操作的准确性为较低时,跳过一些操作(例如,与在图1中执行四个项的内积以获得高准确性相反,可跳过最低阶,由此导致较低的准确率)。此外,当预期所消耗的计算资源为高时,执行更多算术操作。此外,当预期执行时间为短(低于快速执行的所指定阈值或通用指示)时,跳过一些操作(例如,如图6中所示,执行bx3_8p而不是bx3_9p以跳过针对最低阶项的算术操作)。
[0117] 执行附加地包括:在标记716处,通过将从算术操作所得到的值转换为浮点格式来生成浮点值,并存储该浮点值。浮点值的生成包括在图1和图4中示出并且在本文中上文的相关段落中讨论的重构。可将浮点值存储在由指令指定的位置(例如,存储器、高速缓存或寄存器)中。在一个实施例中,将浮点值存储在已存储输入操作数的位置中。
[0118] 图7B是示出根据本发明的一个实施例的从浮点值到多个较低精度的值的值转换的流程图。操作可以是在图7A的标记712中的操作的实施例。
[0119] 当值转换用于将每个值转换为整数时,在标记722处,使按照浮点格式的每个值量子化。该量子化包括:在标记732处,基于值的值范围和多个整数值确定针对操作数的指数。
[0120] 在一个实施例中,量子化包括:在732处,基于值的值范围和多个较低精度的值确定针对操作数的指数,多个较低精度值中的每一个都是整数值。随后在标记734处,基于值范围将每个值量子化为整数值(例如,示例1-4中的值num)。本文中在上文中关于示例1-4更详细地讨论了量子化。
[0121] 在一个实施例中,指令可具有针对指示按照浮点格式的值的每个操作数指示值的范围的一个或多个操作数。因此,在实施例中,量子化可使用来自指令的值的范围。在另一实施例中,值的范围不由指令提供,并且该范围通过检查操作数的所有值来确定。例如,处理器可扫描由操作数标识的所有数据元素并确定针对该操作数的范围。
[0122] 在标记723处,使用至少包括第一多个位和第二多个位的多个位来标识每个值(原始值或自原始值的量子化得到的值)。在标记724处,标识多个位中的用于第一较低精度的值的第一多个位以对每个值进行逼近;并且在标记724处,标识不与第一多个位重叠的、用于第二较低精度的值的第二多个位以表示对第一较低精度的值的逼近的其余部分,其中,第一较低精度的值和第二较低精度的值用于与来自一个或多个其他操作数的较低精度的值来执行算术操作。图1-图2提供标识第一多个位和第二多个位用于转换到整数方式的示例,并且图4-图5提供转换到较低精度的浮点方式的类似示例。
[0123] 使用本发明的实施例,可更高效地且具有可调整准确度选项地运行通用矩阵-矩阵乘法(GEMM)和其他向量/矩阵算术操作。本发明的实施例中的转换和重构方式可应用于机器学习(ML)和人工智能(AI)、高性能计算(HPC)应用以及其他应用。例如,可将向量和矩阵中的原始值转换为较低精度的值,并且使用这些较低精度的值来执行算术操作。当针对这些算术操作实现专用硬件电路时,可以比原始值快一个或多个数量级地运行算术操作。较低精度的值可使用硬件电路来生成对神经网络的权重,并且它们还可使用相同或不同的硬件电路来生成对激活函数的输入值。一旦算术操作利用了硬件电路,随后就可将所得到的值往回转换为原始的浮点格式。
[0124] 此外,在一些计算机架构中,使用硬件电路来以较高精度的浮点格式(例如,FP128、FP256等)执行算术操作可能是昂贵且不切实际的。本发明的实施例可将较高精度浮点格式的值各自都转换为大量较低精度格式(例如,int4、int8、bfloat16)的值,并且以该较低精度格式执行算术操作。随后可将较低精度格式的结果重构为较高精度的浮点格式,如在图1-图7中所讨论。因此,本发明的实施例可缓解对于构建硬件电路来以较高精度的浮点格式执行算术操作的需求。示例性处理器架构和数据类型
[0125] 图8A是示出本发明的实施例的示例性有序流水线和示例性的寄存器重命名的乱序发布/执行流水线两者的框图。图8B是示出根据本发明的实施例的要包括在处理器中的有序架构核的示例性实施例和示例性的寄存器重命名的乱序发布/执行架构核两者的框图。图8A-图8B中的实线框示出有序流水线和有序核,而虚线框的任选增加示出寄存器重命名的、乱序发布/执行流水线和核。考虑到有序方面是乱序方面的子集,将描述乱序方面。
[0126] 在图8A中,处理器流水线800包括取出级802、长度解码级804、解码级806、分配级808、重命名级810、调度(也被称为分派或发布)级812、寄存器读取/存储器读取级814、执行级816、写回/存储器写入级818、异常处置级822和提交级824。每个级可包括用于执行该级中的操作的电路,并且该电路可被称为取出电路、解码电路、调度电路、执行电路等,以指示硬件电路被用于实现这些级。
[0127] 图8B示出处理器核890,该处理器核890包括前端单元830,该前端单元830耦合到执行引擎单元850,并且前端单元830和执行引擎单元850两者都耦合到存储器单元870。核890可以是精简指令集计算(RISC)核、复杂指令集计算(CISC)核、超长指令字(VLIW)核、或混合或替代的核类型。作为又一选项,核890可以是专用核,诸如例如,网络或通信核、压缩引擎、协处理器核、通用计算图形处理单元(GPGPU)核、图形核,等等。
[0128] 前端单元830包括分支预测单元832,该分支预测单元832耦合到指令高速缓存单元834,该指令高速缓存单元834耦合到指令转换后备缓冲器(TLB)836,该指令转换后备缓冲器836耦合到指令取出单元838,该指令取出单元838耦合到解码单元840。解码单元840(或解码器)可对指令解码,并且生成从原始指令解码出的、或以其他方式反映原始指令的、或从原始指令导出的一个或多个微操作、微代码进入点、微指令、其他指令、或其他控制信号作为输出。解码单元840可使用各种不同的机制来实现。合适机制的示例包括但不限于,查找表、硬件实现、可编程逻辑阵列(PLA)、微代码只读存储器(ROM)等。在一个实施例中,核890包括存储用于某些宏指令的微代码的微代码ROM或其他介质(例如,在解码单元840中,或以其他方式在前端单元830内)。解码单元840耦合到执行引擎单元850中的重命名/分配器单元852。
[0129] 执行引擎单元850包括重命名/分配器单元852,该重命名/分配器单元852耦合到引退单元854和一个或多个调度器单元的集合856。(多个)调度器单元856表示任何数量的不同调度器,包括预留站、中央指令窗等。(多个)调度器单元856耦合到(多个)物理寄存器堆单元858。(多个)物理寄存器堆单元858中的每一个物理寄存器堆单元表示一个或多个物理寄存器堆,其中不同的物理寄存器堆存储一种或多种不同的数据类型,诸如,标量整数、标量浮点、紧缩整数、紧缩浮点、向量整数、向量浮点,状态(例如,作为要执行的下一条指令的地址的指令指针)等等。在一个实施例中,(多个)物理寄存器堆单元858包括向量寄存器单元、写掩码寄存器单元和标量寄存器单元。这些寄存器单元可以提供架构向量寄存器、向量掩码寄存器和通用寄存器。(多个)物理寄存器堆单元858由引退单元854重叠,以示出可实现寄存器重命名和乱序执行的各种方式(例如,使用(多个)重排序缓冲器和(多个)引退寄存器堆;使用(多个)未来文件、(多个)历史缓冲器、(多个)引退寄存器堆;使用寄存器映射和寄存器池,等等)。引退单元854和(多个)物理寄存器堆单元858耦合到(多个)执行集群860。(多个)执行集群860包括一个或多个执行单元的集合862以及一个或多个存储器访问单元的集合864。执行单元862可执行各种操作(例如,移位、加法、减法、乘法)并可对各种数据类型(例如,标量浮点、紧缩整数、紧缩浮点、向量整数、向量浮点)执行。尽管一些实施例可以包括专用于特定功能或功能集合的多个执行单元,但是其他实施例可包括仅一个执行单元或全都执行所有功能的多个执行单元。(多个)调度器单元856、(多个)物理寄存器堆单元858和(多个)执行集群860示出为可能有多个,因为某些实施例为某些类型的数据/操作创建分开的流水线(例如,标量整数流水线、标量浮点/紧缩整数/紧缩浮点/向量整数/向量浮点流水线,和/或各自具有其自身的调度器单元、(多个)物理寄存器堆单元和/或执行集群的存储器访问流水线——并且在分开的存储器访问流水线的情况下,实现其中仅该流水线的执行集群具有(多个)存储器访问单元864的某些实施例)。还应当理解,在使用分开的流水线的情况下,这些流水线中的一个或多个可以是乱序发布/执行,并且其余流水线可以是有序的。
[0130] 存储器访问单元的集合864耦合到存储器单元870,该存储器单元870包括数据TLB单元872,该数据TLB单元872耦合到数据高速缓存单元874,该数据高速缓存单元874耦合到第二级(L2)高速缓存单元876。在一个示例性实施例中,存储器访问单元864可包括加载单元、存储地址单元和存储数据单元,其中的每一个均耦合到存储器单元870中的数据TLB单元872。指令高速缓存单元834还耦合到存储器单元870中的第二级(L2)高速缓存单元876。L2高速缓存单元876耦合到一个或多个其他级别的高速缓存,并最终耦合到主存储器。
[0131] 作为示例,示例性寄存器重命名的乱序发布/执行核架构可如下所述地实现流水线800:1)指令取出838执行取出级802和长度解码级804;2)解码单元840执行解码级806;3)重命名/分配器单元852执行分配级808和重命名级810;4)(多个)调度器单元856执行调度级812;5)(多个)物理寄存器堆单元858和存储器单元870执行寄存器读取/存储器读取级814;执行集群860执行执行级816;6)存储器单元870和(多个)物理寄存器堆单元858执行写回/存储器写入级818;7)各单元可牵涉到异常处置级822;以及8)引退单元854和(多个)物理寄存器堆单元858执行提交级824。
[0132] 核890可支持一个或多个指令集(例如,x86指令集(具有已与较新版本一起添加的一些扩展);加利福尼亚州桑尼维尔市的MIPS技术公司的MIPS指令集;加利福尼亚州桑尼维尔市的ARM控股公司的ARM指令集(具有诸如NEON的任选的附加扩展)),其中包括本文中描述的(多条)指令。在一个实施例中,核890包括用于支持紧缩数据指令集扩展(例如,AVX1、AVX2、高级矩阵扩展(AMX)和/或下文描述的某种形式的通用向量友好指令格式(U=0和/或U=1))的逻辑,从而允许使用紧缩数据来执行由许多多媒体应用使用的操作。
[0133] 应当理解,核可支持多线程化(执行两个或更多个并行的操作或线程的集合),并且可以按各种方式来完成该多线程化,各种方式包括时分多线程化、同时多线程化(其中单个物理核为物理核正在同时多线程化的线程中的每一个线程提供逻辑核)、或其组合(例如,时分取出和解码以及此后的诸如 超线程化技术中的同时多线程化)。
[0134] 尽管在乱序执行的上下文中描述了寄存器重命名,但应当理解,可以在有序架构中使用寄存器重命名。尽管所图示的处理器的实施例还包括分开的指令和数据高速缓存单元834/874以及共享的L2高速缓存单元876,但是替代实施例可以具有用于指令和数据两者的单个内部高速缓存,诸如例如,第一级(L1)内部高速缓存或多个级别的内部高速缓存。在一些实施例中,该系统可包括内部高速缓存和在核和/或处理器外部的外部高速缓存的组合。或者,所有高速缓存都可以在核和/或处理器的外部。
[0135] 图9是根据本发明的实施例可具有多于一个核、可具有集成存储器控制器、以及可具有集成图形器件的处理器900的框图。图9中的实线框图示具有单个核902A、系统代理910、一个或多个总线控制器单元的集合916的处理器900,而虚线框的任选增加图示具有多个核902A-N、系统代理单元910中的一个或多个集成存储器控制器单元的集合914以及专用逻辑908(例如,集成图形逻辑)的替代处理器900。
[0136] 因此,处理器900的不同实现可包括:1)CPU,其中专用逻辑908是集成图形和/或科学(吞吐量)逻辑(其可包括一个或多个核),并且核902A-N是一个或多个通用核(例如,通用有序核、通用乱序核、这两者的组合);2)协处理器,其中核902A-N是旨在主要用于图形和/或科学(吞吐量)的大量专用核;以及3)协处理器,其中核902A-N是大量通用有序核。因此,处理器900可以是通用处理器、协处理器或专用处理器,诸如例如,网络或通信处理器、压缩引擎、图形处理器、GPGPU(通用图形处理单元)、高吞吐量的集成众核(MIC)协处理器(包括30个或更多核)、嵌入式处理器,等等。该处理器可以被实现在一个或多个芯片上。处理器
900可以是一个或多个基板的一部分,和/或可使用多种工艺技术(诸如例如,BiCMOS、CMOS、或NMOS)中的任何技术被实现在一个或多个基板上。
[0137] 存储器层次结构包括核内的一个或多个级别的高速缓存、一个或多个共享高速缓存单元的集合906、以及耦合到集成存储器控制器单元的集合914的外部存储器(未示出)。共享高速缓存单元的集合906可包括一个或多个中间级别的高速缓存,诸如,第二级(L2)、第三级(L3)、第四级(L4)或其他级别的高速缓存、末级高速缓存(LLC)和/或以上各项的组合。尽管在一个实施例中,基于环的互连单元912将专用逻辑908、共享高速缓存单元的集合
906以及系统代理单元910/(多个)集成存储器控制器单元914互连,但替代实施例可使用任何数量的公知技术来将此类单元互连。在一个实施例中,在一个或多个高速缓存单元906与核902A-N之间维持一致性。
[0138] 在一些实施例中,一个或多个核902A-N能够实现多线程化。系统代理910包括协调和操作核902A-N的那些组件。系统代理单元910可包括例如功率控制单元(PCU)和显示单元。PCU可以是对核902A-N以及集成图形逻辑908的功率状态进行调节所需的逻辑和组件,或可包括这些逻辑和组件。显示单元用于驱动一个或多个外部连接的显示器。
[0139] 核902A-N在架构指令集方面可以是同构的或异构的;即,核902A-N中的两个或更多个核可能能够执行相同的指令集,而其他核可能能够执行该指令集的仅仅子集或不同的指令集。
[0140] 图10-13是示例性计算机架构的框图。本领域中已知的对膝上型设备、台式机、手持PC、个人数字助理、工程工作站、服务器、网络设备、网络集线器、交换机、嵌入式处理器、数字信号处理器(DSP)、图形设备、视频游戏设备、机顶盒、微控制器、蜂窝电话、便携式媒体播放器、手持设备以及各种其他电子设备的其他系统设计和配置也是合适的。一般地,能够包含如本文中所公开的处理器和/或其他执行逻辑的各种各样的系统或电子设备一般都是合适的。
[0141] 现在参考图10,所示出的是根据本发明一个实施例的系统1000的框图。系统1000可以包括一个或多个处理器1010、1015,这些处理器耦合到控制器中枢1020。在一个实施例中,控制器中枢1020包括图形存储器控制器中枢(GMCH)1090和输入/输出中枢(IOH)1050(其可以在分开的芯片上);GMCH 1090包括存储器和图形控制器,存储器1040和协处理器1045耦合到该存储器和图形控制器;IOH  1050将输入/输出(I/O)设备1060耦合到GMCH1090。或者,存储器和图形控制器中的一个或这两者被集成在(如本文中所描述的)处理器内,存储器1040和协处理器1045直接耦合到处理器1010,并且控制器中枢1020与IOH 
1050处于单个芯片中。
[0142] 附加的处理器1015的任选性在图10中通过虚线来表示。每一处理器1010、1015可包括本文中描述的处理核中的一个或多个,并且可以是处理器900的某一版本。
[0143] 存储器1040可以是例如动态随机存取存储器(DRAM)、相变存储器(PCM)或这两者的组合。对于至少一个实施例,控制器中枢1020经由诸如前端总线(FSB)之类的多分支总线、诸如快速路径互连(QPI)之类的点对点接口、或者类似的连接1095来与(多个)处理器1010、1015进行通信。
[0144] 在一个实施例中,协处理器1045是专用处理器,诸如例如,高吞吐量MIC处理器、网络或通信处理器、压缩引擎、图形处理器、GPGPU、嵌入式处理器,等等。在一个实施例中,控制器中枢1020可以包括集成图形加速器
[0145] 在处理器1010、1015之间可以存在包括架构、微架构、热、功耗特性等一系列品质度量方面的各种差异。
[0146] 在一个实施例中,处理器1010执行控制一般类型的数据处理操作的指令。嵌入在这些指令内的可以是协处理器指令。处理器1010将这些协处理器指令识别为具有应当由附连的协处理器1045执行的类型。因此,处理器1010在协处理器总线或者其他互连上将这些协处理器指令(或者表示协处理器指令的控制信号)发布到协处理器1045。(多个)协处理器1045接受并执行所接收的协处理器指令。
[0147] 现在参见图11,所示出的是根据本发明的实施例的第一更具体的示例性系统1100的框图。如图11中所示,多处理器系统1100是点对点互连系统,并且包括经由点对点互连1150耦合的第一处理器1170和第二处理器1180。处理器1170和1180中的每一个都可以是处理器900的某一版本。在本发明的一个实施例中,处理器1170和1180分别是处理器1010和
1015,而协处理器1138是协处理器1045。在另一实施例中,处理器1170和1180分别是处理器
1010和协处理器1045。
[0148] 处理器1170和1180示出为分别包括集成存储器控制器(IMC)单元1172和1182。处理器1170还包括作为其总线控制器单元的一部分的点对点(P-P)接口1176和1178;类似地,第二处理器1180包括P-P接口1186和1188。处理器1170、1180可以经由使用点对点(P-P)接口电路1178、1188的P-P接口1150来交换信息。如图11中所示,IMC 1172和1182将处理器耦合到相应的存储器,即存储器1132和存储器1134,这些存储器可以是本地附连到相应处理器的主存储器的部分。
[0149] 处理器1170、1180可各自经由使用点对点接口电路1176、1194、1186、1198的各个P-P接口1152、1154来与芯片组1190交换信息。芯片组1190可以任选地经由高性能接口1139来与协处理器1138交换信息。在一个实施例中,协处理器1138是专用处理器,诸如例如,高吞吐量MIC处理器、网络或通信处理器、压缩引擎、图形处理器、GPGPU、嵌入式处理器,等等。
[0150] 共享高速缓存(未示出)可被包括在任一处理器中,或在这两个处理器的外部但经由P-P互连与这些处理器连接,使得如果处理器被置于低功率模式,则任一个或这两个处理器的本地高速缓存信息可被存储在共享高速缓存中。
[0151] 芯片组1190可以经由接口1196耦合到第一总线1116。在一个实施例中,第一总线1116可以是外围组件互连(PCI)总线或诸如PCI快速总线或另一第三代I/O互连总线之类的总线,但是本发明的范围不限于此。
[0152] 如图11中所示,各种I/O设备1114可连同总线桥1118一起耦合到第一总线1116,该总线桥1118将第一总线1116耦合到第二总线1120。在一个实施例中,诸如协处理器、高吞吐量MIC处理器、GPGPU、加速器(诸如例如,图形加速器或数字信号处理(DSP)单元)、现场可编程门阵列或任何其他处理器的一个或多个附加处理器1115耦合到第一总线1116。在一个实施例中,第二总线1120可以是低引脚数(LPC)总线。在一个实施例中,各种设备可耦合到第二总线1120,这些设备包括例如键盘和/或鼠标1122、通信设备1127以及存储单元1128,该存储单元1128诸如可包括指令/代码和数据1130的盘驱动器或者其他大容量存储设备。此外,音频I/O 1124可以被耦合到第二总线1120。注意,其他架构是可能的。例如,代替图11的点对点架构,系统可以实现多分支总线或其他此类架构。
[0153] 现在参考图12,示出的是根据本发明的实施例的第二更具体的示例性系统1200的框图。图11和12中的类似元件使用类似的附图标记,并且从图12中省略了图11的某些方面以避免混淆图12的其他方面。
[0154] 图12示出处理器1270、1280可分别包括集成存储器和I/O控制逻辑(“CL”)1272和1282。因此,CL 1272、1282包括集成存储器控制器单元,并包括I/O控制逻辑。图12图示不仅存储器1232、1234耦合到CL 1272、1282,而且I/O设备1214也耦合到控制逻辑1272、1282。传统I/O设备1215被耦合到芯片组1290。
[0155] 现在参考图13,示出的是根据本发明的实施例的SoC 1300的框图。图9中的类似要素使用类似的附图标记。另外,虚线框是更先进的SoC上的任选的特征。在图13中,(多个)互连单元1302被耦合到:应用处理器1310,其包括一个或多个核的集合902A-N的集合以及(多个)共享高速缓存单元906;系统代理单元910;(多个)总线控制器单元916;(多个)集成存储器控制器单元914;一个或多个协处理器的集合1320,其可包括集成图形逻辑、图像处理器、音频处理器和视频处理器;静态随机存取存储器(SRAM)单元1330;直接存储器存取(DMA)单元1332;以及用于耦合到一个或多个外部显示器的显示单元1340。在一个实施例中,(多个)协处理器1320包括专用处理器,诸如例如,网络或通信处理器、压缩引擎、GPGPU、高吞吐量MIC处理器、或嵌入式处理器,等等。
[0156] 本文公开的机制的各实施例可以被实现在硬件、软件、固件或此类实现方式的组合中。本发明的实施例可实现为在可编程系统上执行的计算机程序或程序代码,该可编程系统包括至少一个处理器、存储系统(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备以及至少一个输出设备。
[0157] 可将程序代码(诸如,图11中示出的代码1130)应用于输入指令,以执行本文中描述的功能并生成输出信息。可以按已知方式将输出信息应用于一个或多个输出设备。为了本申请的目的,处理系统包括具有处理器的任何系统,该处理器诸如例如,数字信号处理器(DSP)、微控制器、专用集成电路(ASIC)或微处理器
[0158] 程序代码可以用高级的面向过程的编程语言或面向对象的编程语言来实现,以便与处理系统通信。如果需要,也可用汇编语言或机器语言来实现程序代码。事实上,本文中描述的机制不限于任何特定的编程语言的范围。在任何情况下,该语言可以是编译语言或解释语言。
[0159] 至少一个实施例的一个或多个方面可以由存储在机器可读介质上的表示性指令来实现,该指令表示处理器中的各种逻辑,该指令在被机器读取时使得该机器制造用于执行本文中所述的技术的逻辑。被称为“IP核的此类表示可以被存储在有形的机器可读介质上,并可被供应给各个客户或生产设施以加载到实际制造该逻辑或处理器的制造机器中。”[0160] 此类机器可读存储介质可以包括但不限于通过机器或设备制造或形成的制品的非暂态、有形布置,其包括存储介质,诸如硬盘;任何其他类型的盘,包括软盘、光盘、紧致盘只读存储器(CD-ROM)、可重写紧致盘(CD-RW)、数字视频/多功能盘(DVD)、蓝光(BD)以及磁光盘;半导体器件,诸如,只读存储器(ROM)、诸如动态随机存取存储器(DRAM)和静态随机存取存储器(SRAM)的随机存取存储器(RAM)、可擦除可编程只读存储器(EPROM)、闪存、电可擦除可编程只读存储器(EEPROM);相变存储器(PCM);磁卡或光卡;或适于存储电子指令的任何其他类型的介质。
[0161] 因此,本发明的实施例还包括非暂态的有形机器可读介质,该介质包含指令或包含设计数据,诸如硬件描述语言(HDL),它定义本文中描述的结构、电路、装置、处理器和/或系统特征。这些实施例也被称为程序产品。
[0162] 在一些情况下,指令转换器可用于将指令从源指令集转换至目标指令集。例如,指令转换器可以将指令变换(例如,使用静态二进制变换、包括动态编译的动态二进制变换)、变形、仿真或以其他方式转换成要由核处理的一条或多条其他指令。指令转换器可以用软件、硬件、固件、或其组合来实现。指令转换器可以在处理器上、在处理器外、或者部分在处理器上且部分在处理器外。
[0163] 图14是根据本发明的实施例的对照使用软件指令转换器将源指令集中的二进制指令转换成目标指令集中的二进制指令的框图。在所图示的实施例中,指令转换器是软件指令转换器,但替代地,该指令转换器可以用软件、固件、硬件或其各种组合来实现。图14示出可使用x86编译器1404来编译高级语言1402形式的程序,以生成可由具有至少一个x86指令集核的处理器1416原生执行的x86二进制代码1406。具有至少一个x86指令集核的处理器1416表示通过兼容地执行或以其他方式处理以下各项来执行与具有至少一个x86指令集核的英特尔处理器基本相同的功能的任何处理器:(1)英特尔x86指令集核的指令集的实质部分,或(2)目标为在具有至少一个x86指令集核的英特尔处理器上运行以便取得与具有至少一个x86指令集核的英特尔处理器基本相同的结果的应用或其他软件的目标代码版本。x86编译器1404表示可操作用于生成x86二进制代码1406(例如,目标代码)的编译器,该二进制代码可通过或不通过附加的链接处理在具有至少一个x86指令集核的处理器1416上执行。
类似地,图14示出可以使用替代的指令集编译器1408来编译高级语言1402形式的程序,以生成可以由不具有至少一个x86指令集核的处理器1414(例如,具有执行加利福尼亚州桑尼维尔市的MIPS技术公司的MIPS指令集、和/或执行加利福尼亚州桑尼维尔市的ARM控股公司的ARM指令集的核的处理器)原生执行的替代的指令集二进制代码1410。指令转换器1412用于将x86二进制代码1406转换成可以由不具有x86指令集核的处理器1414原生执行的代码。
该转换后的代码不大可能与替代的指令集二进制代码1410相同,因为能够这样做的指令转换器难以制造;然而,转换后的代码将完成一般操作,并且由来自替代指令集的指令构成。
因此,指令转换器1412通过仿真、模拟或任何其他过程来表示允许不具有x86指令集处理器或核的处理器或其他电子设备执行x86二进制代码1406的软件、固件、硬件或其组合。
示例性指令格式
[0164] 本文中所描述的(多条)指令的实施例能以不同的格式体现。另外,在下文中详述示例性系统、架构和流水线。(多条)指令的实施例可在此类系统、架构和流水线上执行,但是不限于详述的那些系统、架构和流水线。
[0165] 向量友好指令格式是适于向量指令(例如,存在专用于向量操作的特定字段)的指令格式。尽管描述了其中通过向量友好指令格式支持向量和标量操作两者的实施例,但是替代实施例仅使用通过向量友好指令格式的向量操作。
[0166] 图15A-图15B是示出根据本发明的实施例的通用向量友好指令格式及其指令模板的框图。图15A是示出根据本发明的实施例的通用向量友好指令格式及其A类指令模板的框图;而图15B是示出根据本发明的实施例的通用向量友好指令格式及其B类指令模板的框图。具体地,针对通用向量友好指令格式1500定义A类和B类指令模板,这两者都包括无存储器访问1505的指令模板和存储器访问1520的指令模板。在向量友好指令格式的上下文中的术语“通用”是指不束缚于任何特定指令集的指令格式。
[0167] 尽管将描述其中向量友好指令格式支持以下情况的本发明的实施例:64字节向量操作数长度(或尺寸)与32位(4字节)或64位(8字节)数据元素宽度(或尺寸)(并且由此,64字节向量由16个双字尺寸的元素组成,或者替代地由8个四字尺寸的元素组成);64字节向量操作数长度(或尺寸)与16位(2字节)或8位(1字节)数据元素宽度(或尺寸);32字节向量操作数长度(或尺寸)与32位(4字节)、64位(8字节)、16位(2字节)或8位(1字节)数据元素宽度(或尺寸);以及16字节向量操作数长度(或尺寸)与32位(4字节)、64位(8字节)、16位(2字节)、或8位(1字节)数据元素宽度(或尺寸);但是替代实施例可支持更大、更小和/或不同的向量操作数尺寸(例如,256字节向量操作数)与更大、更小或不同的数据元素宽度(例如,128位(16字节)数据元素宽度)。
[0168] 图15A中的A类指令模板包括:1)在无存储器访问1505的指令模板内,示出无存储器访问的完全舍入控制型操作1510的指令模板、以及无存储器访问的数据变换型操作1515的指令模板;以及2)在存储器访问1520的指令模板内,示出存储器访问的时效性1525的指令模板和存储器访问的非时效性1530的指令模板。图15B中的B类指令模板包括:1)在无存储器访问1505的指令模板内,示出无存储器访问的写掩码控制的部分舍入控制型操作1512的指令模板以及无存储器访问的写掩码控制的vsize型操作1517的指令模板;以及2)在存储器访问1520的指令模板内,示出存储器访问的写掩码控制1527的指令模板。
[0169] 通用向量友好指令格式1500包括以下列出的按照在图15A-15B中示出的顺序的如下字段。
[0170] 格式字段1540——该字段中的特定值(指令格式标识符值)唯一地标识向量友好指令格式,并且由此标识指令在指令流中以向量友好指令格式出现。由此,该字段对于仅具有通用向量友好指令格式的指令集是不需要的,在这个意义上该字段是任选的。
[0171] 基础操作字段1542——其内容区分不同的基础操作。
[0172] 寄存器索引字段1544——其内容直接或者通过地址生成来指定源或目的地操作数在寄存器中或者在存储器中的位置。这些字段包括足够数量的位以从PxQ(例如,32x512、16x128、32x1024、64x1024)寄存器堆中选择N个寄存器。尽管在一个实施例中N可多达三个源寄存器和一个目的地寄存器,但是替代实施例可支持更多或更少的源和目的地寄存器(例如,可支持多达两个源,其中这些源中的一个源还用作目的地;可支持多达三个源,其中这些源中的一个源还用作目的地;可支持多达两个源和一个目的地)。
[0173] 修饰符(modifier)字段1546——其内容将指定存储器访问的以通用向量指令格式出现的指令与不指定存储器访问的以通用向量指令格式出现的指令区分开;即在无存储器访问1505的指令模板与存储器访问1520的指令模板之间进行区分。存储器访问操作读取和/或写入到存储器层次(在一些情况下,使用寄存器中的值来指定源和/或目的地地址),而非存储器访问操作不这样(例如,源和/或目的地是寄存器)。尽管在一个实施例中,该字段还在三种不同的方式之间选择以执行存储器地址计算,但是替代实施例可支持更多、更少或不同的方式来执行存储器地址计算。
[0174] 扩充操作字段1550——其内容区分除基础操作以外还要执行各种不同操作中的哪一个操作。该字段是针对上下文的。在本发明的一个实施例中,该字段被分成类字段1568、α字段1552和β字段1554。扩充操作字段1550允许在单条指令而非2条、3条或4条指令中执行多组共同的操作。
[0175] 比例字段1560——其内容允许用于存储器地址生成(例如,用于使用(2比例*索引+基址)的地址生成)的索引字段的内容的按比例缩放。
[0176] 位移字段1562A——其内容用作存储器地址生成的一部分(例如,用于使用(2比例*索引+基址+位移)的地址生成)。
[0177] 位移因数字段1562B(注意,位移字段1562A直接在位移因数字段1562B上的并置指示使用一个或另一个)——其内容用作地址生成的一部分;它指定将按比例缩放存储器访问的尺寸(N)的位移因数——其中N是存储器访问中的字节数量(例如,用于使用(2比例*索引+基址+按比例缩放的位移)的地址生成)。忽略冗余的低阶位,并且因此将位移因数字段的内容乘以存储器操作数总尺寸(N)以生成将在计算有效地址中使用的最终位移。N的值由处理器硬件在运行时基于完整操作码字段1574(在本文中描述)和数据操纵字段1554C确定。位移字段1562A和位移因数字段1562B不用于无存储器访问1505的指令模板和/或不同的实施例可实现这两者中的仅一个或不实现这两者中的任一个,在这个意义上,位移字段1562A和位移因数字段1562B是任选的。
[0178] 数据元素宽度字段1564——其内容区分将使用多个数据元素宽度中的哪一个(在一些实施例中用于所有指令;在其他实施例中只用于指令中的一些指令)。如果支持仅一个数据元素宽度和/或使用操作码的某一方面来支持数据元素宽度,则该字段是不需要的,在这个意义上,该字段是任选的。
[0179] 写掩码字段1570——其内容逐数据元素位置地控制目的地向量操作数中的数据元素位置是否反映基础操作和扩充操作的结果。A类指令模板支持合并-写掩码,而B类指令模板支持合并-写掩码和归零-写掩码两者。当合并时,向量掩码允许在执行(由基础操作和扩充操作指定的)任何操作期间保护目的地中的任何元素集免于更新;在另一实施例中,保持其中对应掩码位具有0的目的地的每一元素的旧值。相反,当归零时,向量掩码允许在执行(由基础操作和扩充操作指定的)任何操作期间使目的地中的任何元素集归零;在一个实施例中,目的地的元素在对应掩码位具有0值时被设为0。该功能的子集是控制正被执行的操作的向量长度的能力(即,从第一个到最后一个正被修改的元素的跨度),然而,被修改的元素不一定要是连续的。由此,写掩码字段1570允许部分向量操作,这包括加载、存储、算术、逻辑等。尽管描述了其中写掩码字段1570的内容选择了多个写掩码寄存器中的包含要使用的写掩码的一个写掩码寄存器(并且由此,写掩码字段1570的内容间接地标识要执行的掩码)的本发明的实施例,但是替代实施例替代地或附加地允许掩码写字段1570的内容直接指定要执行的掩码。
[0180] 立即数字段1572——其内容允许对立即数的指定。该字段在实现不支持立即数的通用向量友好格式中不存在且在不使用立即数的指令中不存在,在这个意义上,该字段是任选的。
[0181] 类字段1568——其内容在不同类的指令之间进行区分。参考图15A-图15B,该字段的内容在A类和B类指令之间进行选择。在图15A-图15B中,圆方形用于指示特定的值存在于字段中(例如,在图15A-图15B中分别用于类字段1568的A类1568A和B类1568B)。A类指令模板
[0182] 在A类非存储器访问1505的指令模板的情况下,α字段1552被解释为其内容区分要执行不同扩充操作类型中的哪一种(例如,针对无存储器访问的舍入型操作1510和无存储器访问的数据变换型操作1515的指令模板分别指定舍入1552A.1和数据变换1552A.2)的RS字段1552A,而β字段1554区分要执行所指定类型的操作中的哪一种。在无存储器访问1505的指令模板中,比例字段1560、位移字段1562A和位移比例字段1562B不存在。
[0183] 无存储器访问的指令模板——完全舍入控制型操作
[0184] 在无存储器访问的完全舍入控制型操作1510的指令模板中,β字段1554被解释为其(多个)内容提供静态舍入的舍入控制字段1554A。尽管在本发明的所述实施例中舍入控制字段1554A包括抑制所有浮点异常(SAE)字段1556和舍入操作控制字段1558,但是替代实施例可支持这两个概念,可将这两个概念编码为同一字段,或仅具有这些概念/字段中的一个或另一个(例如,可仅具有舍入操作控制字段1558)。
[0185] SAE字段1556——其内容区分是否禁用异常事件报告;当SAE字段1556的内容指示启用抑制时,给定的指令不报告任何种类的浮点异常标志,并且不唤起任何浮点异常处置程序。
[0186] 舍入操作控制字段1558——其内容区分要执行一组舍入操作中的哪一个(例如,向上舍入、向下舍入、向零舍入以及就近舍入)。由此,舍入操作控制字段1558允许逐指令地改变舍入模式。在其中处理器包括用于指定舍入模式的控制寄存器的本发明的一个实施例中,舍入操作控制字段1558的内容覆盖该寄存器值。无存储器访问的指令模板-数据变换型操作
[0187] 在无存储器访问的数据变换型操作1515的指令模板中,β字段1554被解释为数据变换字段1554B,其内容区分要执行多个数据变换中的哪一个(例如,无数据变换、混合、广播)。
[0188] 在A类存储器访问1520的指令模板的情况下,α字段1552被解释为驱逐提示字段1552B,其内容区分要使用驱逐提示中的哪一个(在图15A中,对于存储器访问时效性1525的指令模板和存储器访问非时效性1530的指令模板分别指定时效性的1552B.1和非时效性的
1552B.2),而β字段1554被解释为数据操纵字段1554C,其内容区分要执行多个数据操纵操作(也称为基元(primitive))中的哪一个(例如,无操纵、广播、源的向上转换以及目的地的向下转换)。存储器访问1520的指令模板包括比例字段1560,并任选地包括位移字段1562A或位移因数字段1562B(有时被称为位移比例字段)。
[0189] 向量存储器指令使用转换支持来执行来自存储器的向量加载以及向存储器的向量存储。如同寻常的向量指令,向量存储器指令以数据元素式的方式从/向存储器传输数据,其中实际被传输的元素由被选为写掩码的向量掩码的内容规定。
[0190] 存储器访问的指令模板——时效性的
[0191] 时效性的数据是可能足够快地被重新使用以从高速缓存操作受益的数据。然而,这是提示,并且不同的处理器能以不同的方式实现它,包括完全忽略该提示。存储器访问的指令模板——非时效性的
[0192] 非时效性的数据是不太可能足够快地被重新使用以从第一级高速缓存中的高速缓存操作受益且应当被给予驱逐优先级的数据。然而,这是提示,并且不同的处理器能以不同的方式实现它,包括完全忽略该提示。B类指令模板
[0193] 在B类指令模板的情况下,α字段1552被解释为写掩码控制(Z)字段1552C,其内容区分由写掩码字段1570控制的写掩码应当是合并还是归零。
[0194] 在B类非存储器访问1505的指令模板的情况下,β字段1554的一部分被解释为RL字段1557A,其内容区分要执行不同扩充操作类型中的哪一种(例如,针对无存储器访问的写掩码控制部分舍入控制类型操作1512的指令模板和无存储器访问的写掩码控制VSIZE型操作1317的指令模板分别指定舍入1557A.1和向量长度(VSIZE)1557A.2),而β字段1554的其余部分区分要执行所指定类型的操作中的哪一种。在无存储器访问1505的指令模板中,比例字段1560、位移字段1562A和位移比例字段1562B不存在。
[0195] 在无存储器访问的写掩码控制部分舍入控制型操作1510的指令模板中,β字段1554的其余部分被解释为舍入操作字段1559A,并且禁用异常事件报告(给定的指令不报告任何种类的浮点异常标志,并且不唤起任何浮点异常处置程序)。
[0196] 舍入操作控制字段1559A——正如舍入操作控制字段1558,其内容区分要执行一组舍入操作中的哪一个(例如,向上舍入、向下舍入、向零舍入以及就近舍入)。由此,舍入操作控制字段1559A允许逐指令地改变舍入模式。在其中处理器包括用于指定舍入模式的控制寄存器的本发明的一个实施例中,舍入操作控制字段1559的内容覆盖该寄存器值。
[0197] 在无存储器访问的写掩码控制VSIZE型操作1517的指令模板中,β字段1554的其余部分被解释为向量长度字段1559B,其内容区分要执行多个数据向量长度中的哪一个(例如,128字节、256字节或512字节)。
[0198] 在B类存储器访问1520的指令模板的情况下,β字段1554的一部分被解释为广播字段1557B,其内容区分是否要执行广播型数据操纵操作,而β字段1554的其余部分被解释为向量长度字段159B。存储器访问1520的指令模板包括比例字段1560,并任选地包括位移字段1562A或位移比例字段1562B。
[0199] 针对通用向量友好指令格式1500,示出完整操作码字段1574包括格式字段1540、基础操作字段1542和数据元素宽度字段1564。尽管示出了其中完整操作码字段1574包括所有这些字段的一个实施例,但是在不支持所有这些字段的实施例中,完整操作码字段1574包括少于所有的这些字段。完整操作码字段1574提供操作码(opcode)。
[0200] 扩充操作字段1550、数据元素宽度字段1564和写掩码字段1570允许逐指令地以通用向量友好指令格式指定这些特征。
[0201] 写掩码字段和数据元素宽度字段的组合创建各种类型的指令,因为这些指令允许基于不同的数据元素宽度应用该掩码。
[0202] 在A类和B类内出现的各种指令模板在不同的情形下是有益的。在本发明的一些实施例中,不同处理器或处理器内的不同核可支持仅A类、仅B类、或者可支持这两类。举例而言,旨在用于通用计算的高性能通用乱序核可仅支持B类,旨在主要用于图形和/或科学(吞吐量)计算的核可仅支持A类,并且旨在用于通用计算和图形和/或科学(吞吐量)计算两者的核可支持A类和B类两者(当然,具有来自这两类的模板和指令的一些混合、但是并非来自这两类的所有模板和指令的核在本发明的范围内)。同样,单个处理器可包括多个核,这多个核全部都支持相同的类,或者其中不同的核支持不同的类。举例而言,在具有单独的图形核和通用核的处理器中,图形核中的旨在主要用于图形和/或科学计算的一个核可仅支持A类,而通用核中的一个或多个可以是具有旨在用于通用计算的仅支持B类的乱序执行和寄存器重命名的高性能通用核。不具有单独的图形核的另一处理器可包括既支持A类又支持B类的一个或多个通用有序或乱序核。当然,在本发明的不同实施例中,来自一类的特征也可在其他类中实现。将使以高级语言编写的程序成为(例如,及时编译或静态编译)各种不同的可执行形式,这些可执行形式包括:1)仅具有由用于执行的目标处理器支持的(多个)类的指令的形式;或者2)具有替代例程并具有控制流代码的形式,该替代例程使用所有类的指令的不同组合来编写,该控制流代码选择这些例程以基于由当前正在执行代码的处理器支持的指令来执行。
[0203] 图16A-图16D是示出根据本发明的实施例的示例性专用向量友好指令格式的框图。图16A示出专用向量友好指令格式1600,其指定各字段的位置、尺寸、解释和次序、以及那些字段中的一些字段的值,在这个意义上,该专用向量友好指令格式1600是专用的。专用向量友好指令格式1600可用于扩展x86指令集,并且由此字段中的一些字段与如在现有的x86指令集及其扩展(例如,AVX)中所使用的那些字段类似或相同。该格式保持与具有扩展的现有x86指令集的前缀编码字段、实操作码字节字段、MOD R/M字段、SIB字段、位移字段和立即数字段一致。图示来自图15的字段,来自图16A-图16D的字段映射到来自图15的字段。
[0204] 应当理解,虽然出于说明的目的在通用向量友好指令格式1500的上下文中参考专用向量友好指令格式1600描述了本发明的实施例,但是本发明不限于专用向量友好指令格式1600,除非另有声明。例如,通用向量友好指令格式1500构想了各种字段的各种可能的尺寸,而专用向量友好指令格式1600示出为具有特定尺寸的字段。作为具体示例,尽管在专用向量友好指令格式1600中数据元素宽度字段1564被示出为一位字段,但是本发明不限于此(即,通用向量友好指令格式1500构想数据元素宽度字段1564的其他尺寸)。
[0205] 通用向量友好指令格式1500包括以下列出的按照图16A中示出的顺序的如下字段。
[0206] EVEX前缀(字节0-3)1602——以四字节形式进行编码。
[0207] 格式字段1540(EVEX字节0,位[7:0])——第一字节(EVEX字节0)是格式字段1540,并且它包含0x62(在本发明的一个实施例中,为用于区分向量友好指令格式的唯一值)。
[0208] 第二-第四字节(EVEX字节1-3)包括提供专用能力的多个位字段。
[0209] REX字段1605(EVEX字节1,位[7-5])——由EVEX.R位字段(EVEX字节1,位[7]–R)、EVEX.X位字段(EVEX字节1,位[6]–X)以及(1157BEX字节1,位[5]–B)组成。EVEX.R、EVEX.X和EVEX.B位字段提供与对应的VEX位字段相同的功能,并且使用1补码的形式进行编码,即ZMM0被编码为1111B,ZMM15被编码为0000B。这些指令的其他字段对如在本领域中已知的寄存器索引的较低三个位(rrr、xxx和bbb)进行编码,由此可通过对EVEX.R、EVEX.X和EVEX.B相加来形成Rrrr、Xxxx和Bbbb。
[0210] REX’字段1610——这是REX’字段1610的第一部分,并且是用于对扩展的32个寄存器集合的较高16个或较低16个寄存器进行编码的EVEX.R’位字段(EVEX字节1,位[4]–R’)。在本发明的一个实施例中,该位与以下指示的其他位一起以位反转的格式存储以(在公知x86的32位模式下)与BOUND指令进行区分,该BOUND指令的实操作码字节是62,但是在MODR/M字段(在下文中描述)中不接受MOD字段中的值11;本发明的替代实施例不以反转的格式存储该指示的位以及以下其他指示的位。值1用于对较低16个寄存器进行编码。换句话说,通过组合EVEX.R’、EVEX.R以及来自其他字段的其他RRR来形成R’Rrrr。
[0211] 操作码映射字段1615(EVEX字节1,位[3:0]–mmmm)——其内容对隐含的前导操作码字节(0F、0F 38或0F 3)进行编码。
[0212] 数据元素宽度字段1564(EVEX字节2,位[7]–W)——由记号EVEX.W表示。EVEX.W用于定义数据类型(32位数据元素或64位数据元素)的粒度(尺寸)。
[0213] EVEX.vvvv 1620(EVEX字节2,位[6:3]-vvvv)——EVEX.vvvv的作用可包括如下:1)EVEX.vvvv对以反转(1补码)形式指定的第一源寄存器操作数进行编码,并且对具有两个或更多个源操作数的指令有效;2)EVEX.vvvv对针对特定向量位移以1补码的形式指定的目的地寄存器操作数进行编码;或者3)EVEX.vvvv不对任何操作数进行编码,该字段被预留,并且应当包含1111b。由此,EVEX.vvvv字段1620对以反转(1补码)的形式存储的第一源寄存器指定符的4个低阶位进行编码。取决于该指令,额外不同的EVEX位字段用于将指定符尺寸扩展到32个寄存器。
[0214] EVEX.U 1568类字段(EVEX字节2,位[2]-U)——如果EVEX.U=0,则它指示A类或EVEX.U0;如果EVEX.U=1,则它指示B类或EVEX.U1。
[0215] 前缀编码字段1625(EVEX字节2,位[1:0]-pp)——提供了用于基础操作字段的附加位。除了对以EVEX前缀格式的传统SSE指令提供支持以外,这也具有压缩SIMD前缀的益处(EVEX前缀仅需要2位,而不是需要字节来表达SIMD前缀)。在一个实施例中,为了支持使用以传统格式和以EVEX前缀格式两者的SIMD前缀(66H、F2H、F3H)的传统SSE指令,将这些传统SIMD前缀编码成SIMD前缀编码字段;并且在运行时在被提供给解码器的PLA之前被扩展成传统SIMD前缀(因此,在无需修改的情况下,PLA既可执行传统格式的这些传统指令又可执行EVEX格式的这些传统指令)。虽然较新的指令可将EVEX前缀编码字段的内容直接用作操作码扩展,但是为了一致性,特定实施例以类似的方式扩展,但允许由这些传统SIMD前缀指定的不同含义。替代实施例可重新设计PLA以支持2位SIMD前缀编码,并且由此不需要扩展。
[0216] α字段1552(EVEX字节3,位[7]–EH,也称为EVEX.EH、EVEX.rs、EVEX.RL、EVEX.写掩码控制、以及EVEX.N;也以α示出)——如先前所述,该字段是针对上下文的。
[0217] β字段1554(EVEX字节3,位[6:4]-SSS,也称为EVEX.s2-0、EVEX.r2-0、EVEX.rr1、EVEX.LL0、EVEX.LLB,还以βββ示出)——如前所述,此字段是针对上下文的。
[0218] REX’字段1610——这是REX’字段的其余部分,并且是可用于对扩展的32个寄存器集合的较高16个或较低16个寄存器进行编码的EVEX.V’位字段(EVEX字节3,位[3]–V’)。该位以位反转的格式存储。值1用于对较低16个寄存器进行编码。换句话说,通过组合EVEX.V’、EVEX.vvvv来形成V’VVVV。
[0219] 写掩码字段1570(EVEX字节3,位[2:0]-kkk)——其内容指定写掩码寄存器中的寄存器的索引,如先前所述。在本发明的一个实施例中,特定值EVEX.kkk=000具有暗示没有写掩码用于特定指令的特殊行为(这能以各种方式实现,包括使用硬连线到所有对象的写掩码或绕过掩码硬件的硬件来实现)。
[0220] 实操作码字段1630(字节4)还被称为操作码字节。操作码的一部分在该字段中被指定。
[0221] MOD R/M字段1640(字节5)包括MOD字段1642、Reg字段1644和R/M字段1646。如先前所述的,MOD字段1642的内容将存储器访问操作和非存储器访问操作区分开。Reg字段1644的作用可被归结为两种情形:对目的地寄存器操作数或源寄存器操作数进行编码;或者被视为操作码扩展,并且不用于对任何指令操作数进行编码。R/M字段1646的作用可包括如下:对引用存储器地址的指令操作数进行编码;或者对目的地寄存器操作数或源寄存器操作数进行编码。
[0222] 比例、索引、基址(SIB)字节(字节6)——如先前所述的,比例字段1550的内容用于存储器地址生成。SIB.xxx 1654和SIB.bbb 1656——先前已经针对寄存器索引Xxxx和Bbbb提及了这些字段的内容。
[0223] 位移字段1562A(字节7-10)——当MOD字段1642包含10时,字节7-10是位移字段1562A,并且它与传统32位位移(disp32)一样地工作,并且以字节粒度工作。
[0224] 位移因数字段562B(字节7)——当MOD字段1642包含01时,字节7是位移因数字段1562B。该字段的位置与以字节粒度工作的传统x86指令集8位位移(disp8)的位置相同。由于disp8是符号扩展的,因此它仅能在-128和127字节偏移之间寻址;在64字节高速缓存行的方面,disp8使用可被设为仅四个真正有用的值-128、-64、0和64的8位;由于常常需要更大的范围,所以使用disp32;然而,disp32需要4个字节。与disp8和disp32对比,位移因数字段1562B是disp8的重新解释;当使用位移因数字段1562B时,通过将位移因数字段的内容乘以存储器操作数访问的尺寸(N)来确定实际位移。该类型的位移被称为disp8*N。这减小了平均指令长度(单个字节用于位移,但具有大得多的范围)。此类经压缩的位移基于有效位移是存储器访问的粒度的倍数的假设,并且由此地址偏移的冗余低阶位不需要被编码。换句话说,位移因数字段1562B替代传统x86指令集8位位移。由此,位移因数字段1562B以与x86指令集8位位移相同的方式被编码(因此,在ModRM/SIB编码规则中没有变化),唯一的不同在于,将disp8超载至disp8*N。换句话说,在编码规则或编码长度方面没有变化,而仅在有硬件对位移值的解释方面有变化(这需要将位移按比例缩放存储器操作数的尺寸以获得字节式地址偏移)。
[0225] 立即数字段1572如先前所述地操作。完整操作码字段
[0226] 图16B是图示根据本发明的一个实施例的构成完整操作码字段1574的具有专用向量友好指令格式1600的字段的框图。具体地,完整操作码字段1574包括格式字段1540、基础操作字段1542和数据元素宽度(W)字段1564。基础操作字段1542包括前缀编码字段1625、操作码映射字段1615和实操作码字段1630。寄存器索引字段
[0227] 图16C是示出根据本发明的一个实施例的构成寄存器索引字段1544的具有专用向量友好指令格式1600的字段的框图。具体地,寄存器索引字段1544包括REX字段1605、REX’字段1610、MODR/M.reg字段1644、MODR/M.r/m字段1646、VVVV字段1620、xxx字段1654和bbb字段1656。扩充操作字段
[0228] 图16D是示出根据本发明的一个实施例的构成扩充操作字段1550的具有专用向量友好指令格式1600的字段的框图。当类(U)字段1568包含0时,它表明EVEX.U0(A类1,568A);当它包含1时,它表明EVEX.U1(B类1568B)。当U=0且MOD字段1642包含11(表明无存储器访问操作)时,α字段1552(EVEX字节3,位[7]–EH)被解释为rs字段1552A。当rs字段1552A包含1(舍入1552A.1)时,β字段1554(EVEX字节3,位[6:4]–SSS)被解释为舍入控制字段1554A。舍入控制字段1554A包括一位SAE字段1556和两位舍入操作字段1558。当rs字段1552A包含0(数据变换1552A.2)时,β字段1554(EVEX字节3,位[6:4]–SSS)被解释为三位数据变换字段
1554B。当U=0且MOD字段1642包含00、01或10(表明存储器访问操作)时,α字段1552(EVEX字节3,位[7]–EH)被解释为驱逐提示(EH)字段1552B,并且β字段1554(EVEX字节3,位[6:4]–SSS)被解释为三位数据操纵字段1554C。
[0229] 当U=1时,α字段1552(EVEX字节3,位[7]–EH)被解释为写掩码控制(Z)字段1552C。当U=1且MOD字段1642包含11(表明无存储器访问操作)时,β字段1654的一部分(EVEX字节
3,位[4]–S0)被解释为RL字段1657A;当它包含1(舍入1557A.1)时,β字段1554的其余部分(EVEX字节3,位[6-5]–S2-1)被解释为舍入操作字段1559A,而当RL字段1557A包含0(VSIZE 
1557.A2)时,β字段1554的其余部分(EVEX字节3,位[6-5]-S2-1)被解释为向量长度字段
1559B(EVEX字节3,位[6-5]–L1-0)。当U=1且MOD字段1642包含00、01或10(表明存储器访问操作)时,β字段1554(EVEX字节3,位[6:4]–SSS)被解释为向量长度字段1559B(EVEX字节3,位[6-5]–L1-0)和广播字段1557B(EVEX字节3,位[4]–B)。
[0230] 图17是根据本发明的一个实施例的寄存器架构1700的框图。在所示出的实施例中,有32个512位宽的向量寄存器1710;这些寄存器被引用为zmm0到zmm31。较低的16个zmm寄存器的较低阶256个位覆盖(overlay)在寄存器ymm0-16上。较低的16个zmm寄存器的较低阶128个位(ymm寄存器的较低阶128个位)覆盖在寄存器xmm0-15上。专用向量友好指令格式1600对这些被覆盖的寄存器堆操作,如在以下表格中所示出。
[0231] 换句话说,向量长度字段1559B在最大长度与一个或多个其他较短长度之间进行选择,其中每一个此类较短长度是前一长度的一半,并且不具有向量长度字段1559B的指令模板在最大向量长度上操作。此外,在一个实施例中,专用向量友好指令格式1600的B类指令模板对紧缩或标量单/双精度浮点数据以及紧缩或标量整数数据操作。标量操作是对zmm/ymm/xmm寄存器中的最低阶数据元素位置执行的操作;取决于实施例,较高阶数据元素位置要么保持与在指令之前相同,要么归零。
[0232] 写掩码寄存器1715——在所示出的实施例中,存在8个写掩码寄存器(k0至k7),每一写掩码寄存器的尺寸是64位。在替代实施例中,写掩码寄存器1715的尺寸是16位。如先前所述,在本发明的一个实施例中,向量掩码寄存器k0无法用作写掩码;当将正常指示k0的编码用作写掩码时,它选择硬连线的写掩码0xFFFF,从而有效地禁止写掩码用于那条指令。
[0233] 通用寄存器1725——在所示出的实施例中,有十六个64位通用寄存器,这些寄存器与现有的x86寻址模式一起使用以对存储器操作数寻址。这些寄存器通过名称RAX、RBX、RCX、RDX、RBP、RSI、RDI、RSP以及R8到R15来引用。
[0234] 标量浮点栈寄存器堆(x87栈)1745,在其上面重叠了MMX紧缩整数平坦寄存器堆1750——在所示出的实施例中,x87栈是用于使用x87指令集扩展来对32/64/80位浮点数据执行标量浮点操作的八元素栈;而使用MMX寄存器来对64位紧缩整数数据执行操作,以及为在MMX与XMM寄存器之间执行的一些操作保存操作数。
[0235] 本发明的替代实施例可以使用更宽的或更窄的寄存器。另外,本发明的替代实施例可以使用更多、更少或不同的寄存器堆和寄存器。
[0236] 图18A-图18B示出更具体的示例性有序核架构的框图,该核将是芯片中的若干逻辑(包括相同类型和/或不同类型的其他核)中的一个逻辑块。取决于应用,逻辑块通过高带宽互连网络(例如,环形网络)与一些固定的功能逻辑、存储器I/O接口和其他必要的I/O逻辑进行通信。
[0237] 图18A是根据本发明的实施例的单个处理器核以及它至管芯上互连网络1802的连接及其第二级(L2)高速缓存的本地子集1804的框图。在一个实施例中,指令解码器1800支持具有紧缩数据指令集扩展的x86指令集。L1高速缓存1806允许对进入标量和向量单元中的、对高速缓存存储器的低等待时间访问。尽管在一个实施例中(为了简化设计),标量单元1808和向量单元1810使用分开的寄存器集合(分别为标量寄存器1812和向量寄存器1814),并且在这些寄存器之间传输的数据被写入到存储器,并随后从第一级(L1)高速缓存1806读回,但是本发明的替代实施例可以使用不同的方法(例如,使用单个寄存器集合或包括允许数据在这两个寄存器堆之间传输而无需被写入和读回的通信路径)。
[0238] L2高速缓存的本地子集1804是全局L2高速缓存的一部分,该全局L2高速缓存被划分成多个分开的本地子集,每个处理器核一个本地子集。每个处理器核具有到其自身的L2高速缓存的本地子集1804的直接访问路径。由处理器核读取的数据被存储在其L2高速缓存子集1804中,并且可以与其他处理器核访问其自身的本地L2高速缓存子集并行地被快速访问。由处理器核写入的数据被存储在其自身的L2高速缓存子集1804中,并在必要的情况下从其他子集转储清除。环形网络确保共享数据的一致性。环形网络是双向的,以允许诸如处理器核、L2高速缓存和其他逻辑块之类的代理在芯片内彼此通信。每个环形数据路径为每个方向1012位宽。
[0239] 图18B是根据本发明的实施例的图18A中的处理器核的一部分的展开图。图18B包括L1高速缓存1804的L1数据高速缓存1806A部分,以及关于向量单元1810和向量寄存器1814的更多细节。具体地,向量单元1810是16宽向量处理单元(VPU)(见16宽ALU 1828),该单元执行整数、单精度浮点以及双精度浮点指令中的一个或多个。该VPU通过混合单元1820支持对寄存器输入的混合,通过数值转换单元1822A-B支持数值转换,并且通过复制单元
1824支持对存储器输入的复制。写掩码寄存器1826允许断言所得的向量写入。
示例性片/矩阵操作和硬件
[0240] 图19图示经配置的片的实施例。如图所示,存在从应用存储器1901加载的四个片1911、1913、1915和1917。在该示例中,片T0 1911和T11913具有带有4元素字节(例如,单精度数据)的M行和N列。片T2 1915和片T3 1917具有带有8元素字节(例如,双精度数据)的M行和N/2列。由于双精度操作数的宽度是单精度操作数的两倍,因此该配置与用于提供片选项的调色板一致,将至少16*N*M字节的总存储提供给至少4个名称。取决于所使用的指令编码方案,可用的片的数量有所不同。
[0241] 在一些实施例中,片参数是可定义的。例如,“调色板”用于提供片选项。示例性选项包括但不限于:片名称的数量、存储的行中的字节数、片中的行数和列数,等等。例如,片的最大“高度”(行数)可定义为:
[0242] 片最大行=所构造的存储/(调色板名称的数量/每行的字节数)
[0243] 由此,可写入应用,使得名称的固定使用将能够利用跨实现方式的不同存储尺寸。
[0244] 使用片配置(“TILECONFIG”)指令完成对片的配置,其中,在所选择的调色板中定义特定的片使用。该声明包括要使用的片名称的数量、每个名称(片)的所请求的行数和列数,并且在一些实施例中包括每个片的所请求的数据类型。在一些实施例中,在TILECONFIG指令的执行期间执行一致性校验,以确定其匹配调色板条目的限制。
[0245] 图20图示矩阵存储的若干示例。在(A)中,片被存储在存储器中。如图所示,每“行”由四个紧缩数据元素组成。为了达到下一“行”,使用跨步值。注意,行可被连续地存储在存储器中。当片存储不映射底层存储器阵列行宽度时,跨步式存储器访问允许对一行以及随后对下一行的访问。
[0246] 从存储器的片加载以及向存储器的存储典型地是从应用存储器到紧缩的数据行的跨步式访问。示例性TILELOAD和TILESTORE指令或作为加载操作指令中的TILE(片)操作数的对应用存储器的其他指令参考在一些实施例中是可重新开始的,以处置(高达)2*行的页错误、未掩码的浮点异常和/或每条指令的中断。
[0247] 在(B)中,矩阵存储在由多个寄存器组成的片中,这些寄存器诸如,紧缩数据寄存器(单指令多数据(SIMD)或向量寄存器)。在该示例中,片被叠加在三个物理寄存器上。典型地,使用连续的寄存器,然而,情况不必是这样。
[0248] 在(C)中,矩阵被存储在可由在片操作中使用的融合乘法累加(FMA)电路访问的非寄存器存储中的片中。该存储可在FMA内部,或邻近FMA。此外,在一些实施例中,如下文所讨论,该存储可用于数据元素,而不是用于整行或片。
[0249] 经由CPUID报告TMMA架构的所支持的参数。在一些实施例中,信息列表包括最大高度和最大SIMD尺度。配置TMMA架构要求指定每个片的尺度、每个片的元素尺寸以及调色板标识符。通过执行TILECONFIG指令来完成该配置。
[0250] TILECONFIG指令的成功执行启用后续的TILE操作器。TILERELEASEALL指令清除片配置,并禁用TILE操作(直到下一TILECONFIG指令执行)。在一些实施例中,在使用片的上下文切换中使用XSAVE、XSTORE等。在一些实施例中,在XSAVE中使用2个XCR0位,一个用于TILECONFIG元数据,一个位与实际的片有效载荷数据对应。
[0251] TILECONFIG不仅配置片使用,还设置状态变量,该状态变量指示在片经配置的情况下程序在代码区域中。实现方式可枚举对可与片区域一起使用的其他指令的限制,诸如,没有对现有寄存器组的使用,等等。
[0252] 退出片区域典型地利用TILERELEASEALL指令来完成。该指令不取参数并迅速使所有片无效(指示数据不再需要任何保存或恢复),并且清除与处于片区域中对应的内部状态。
[0253] 在一些实施例中,片操作将使超出由片配置指定的尺度的任何行和任何列归零。例如,随着每一行被写入,片操作将使超出所配置的列数(将元素的尺寸考虑在内)的数据归零。例如,对于64字节的行以及配置有10行和12列的片,写入FP32元素的操作将以12*4字节向前10行中的每一行写入输出/结果数据,并且使每一行中的其余的4*4字节归零。片操作还对前10个经配置的行之后的任何行完全归零。当使用具有64字节的行的1K的片时,将会有16行,因此,在该示例中,最后6行也将被归零。
[0254] 在一些实施例中,当加载数据时,上下文恢复(例如,XRSTOR)强制使超出片的所配置的行的数据将被维持为零。如果没有有效配置,则所有行被归零。对片数据的XRSTOR能够加载超出那些所配置的列的列中的无用信息。XRSTOR对超出所配置的列数进行清除不应当是可能的,因为不存在与片配置相关联的元素宽度。
[0255] 当将整个TILE存储区写入存储器时,上下文保存(例如,XSAVE)暴露整个TILE存储区。如果XRSTOR将无用数据加载到片的最右边部分中,则将由XSAVE保存那个数据。对于超出为每个片指定的数量的行,XSAVE将写入零。
[0256] 在一些实施例中,片指令是可重新开始的。访问存储器的操作允许在页错误之后重新开始。凭借由控制和/或状态寄存器控制的对异常的掩码,处理浮点操作的计算指令也允许未掩码的浮点异常。
[0257] 为了支持在这些事件后重新开始指令,这些指令将信息存储在下文详述的开始寄存器中。
[0258] 图21图示利用矩阵(片)操作加速器的系统的实施例。在该图示中,主机处理器/处理系统2101将命令2111(例如,矩阵操纵操作,诸如,算术或矩阵操纵操作、或加载和存储操作)传递至矩阵操作加速器2107。然而,这以这种方式示出,仅用于讨论的目的。如稍后所详述,该加速器2107可以是处理核的部分。典型地,作为片操纵操作器指令的命令2111将片称为寄存器-寄存器(“reg-reg”)或寄存器-存储器(“reg-mem”)格式。诸如TILESTORE、TILELOAD、TILECONFIG等的其他命令不对片执行数据操作。命令可以是供加速器2107处置的经解码的指令(例如,微操作)或宏指令。
[0259] 在该示例中,一致性存储器接口2103耦合至主机处理器/处理系统2101和矩阵操作加速器2207,使得它们能够共享存储器。图22和图23示出如何使用矩阵操作加速器来共享存储器的不同实施例。如图22中所示,主机处理器2201和矩阵操作加速器电路2205共享同一存储器2203。图23图示其中主机处理器2301和矩阵操作加速器2305不共享存储器,但可访问彼此的存储器的实施例。例如,处理器2301可访问片存储器2307,并照常利用其主机存储器2303。类似地,矩阵操作加速器2305可访问主机存储器2303,但更典型地使用其自身的存储器2307。注意,这些存储器可以是不同类型的。
[0260] 矩阵操作加速器2107包括耦合至数据缓冲器2105的多个FMA2109(在一些实现方式中,这些缓冲器2105中的一个或多个被存储在如图所示的网格的FMA中)。数据缓冲器2105对(例如,使用片加载或片存储指令)从存储器加载的片和/或将向存储器存储的片进行缓冲。数据缓冲器可以是例如多个寄存器。典型地,这些FMA被布置为能够读取和写入片的链式FMA 2109的网格。在该示例中,矩阵操作加速器2107用于使用片T0、T1和T2来执行矩阵乘法操作。片中的至少一个片被容纳在FMA网格2109中。在一些实施例中,操作中的所有片都被存储在FMA网格2109中。在其他实施例中,仅子集被存储在FMA网格2109中。如图所示,T1被容纳,而T0和T2不被容纳。注意,A、B和C是指这些片的矩阵,这些片可以占据或可以不占据片的整个空间。
[0261] 本发明的实施例可使用专用矩阵操作电路。图24图示使用片的矩阵乘法累加操作(“TMMA”)的实施例。矩阵(片A 2401)中的行数与串联的(链式)FMA的数量匹配,这些串联的(链式)FMA包括计算的等待时间。实现方式可自由地在较小高度的网格上再循环,但是计算保持相同。
[0262] 源/目的地向量来自N行的片(片C 2405),并且FMA的网格2411执行N个向量-矩阵操作,从而导致执行片的矩阵乘法的完整指令。片B 2403是另一向量源,并将“广播”项提供给每一级中的FMA。
[0263] 在操作中,在一些实施例中(存储在片B 2403)中的矩阵B的元素跨矩形的FMA的网格散布。(存储在片A 2401中的)矩阵B使其行的元素被转置,以与矩形的FMA的网格的列尺度匹配。在网格中的每个FMA处,A和B的元素被相乘,并被加到(来自图中上方的)传入的被加数,并且传出的和被传递至FMA的下一行(或最终输出)。
[0264] 图25图示链式融合乘法累加指令的迭代的执行的子集的实施例。具体而言,这图示目的地的一个紧缩数据元素位置的迭代的执行电路。在该实施例中,链式融合乘法累加正对有符号源进行操作,其中,累加器2倍于输入数据的尺寸。
[0265] 第一有符号源(源1 2501)和第二有符号源(源2 2503)各自都具有四个紧缩数据元素。这些紧缩数据元素中的每一个都存储诸如浮点数据之类的有符号数据。第三有符号源(源3 2509)具有两个紧缩数据元素,其中的每一个都存储有符号数据。第一有符号源2501的尺寸和第二有符号源2503的尺寸是第三有符号源(初始值或先前结果)2509的尺寸的一半。例如,第一有符号源2501和第二有符号源2503可具有32位的紧缩数据元素(例如,单精度浮点),而第三有符号源2509可具有64位的紧缩数据元素(例如,双精度浮点)。
[0266] 在该图示中,仅示出第一有符号源2501和第二有符号源2503的最高有效的两个紧缩数据元素位置以及第三有符号源2509的最高有效的紧缩数据元素位置。当然,还将处理其他紧缩数据元素位置。
[0267] 如图所示,成对地处理紧缩数据元素。例如,使用乘法器电路2505将第一有符号源2501和第二有符号源2503的最高有效的紧缩数据元素位置的数据相乘,并且使用乘法器电路2507将来自第一有符号源2501和第二有符号源2503的次高有效的紧缩数据元素位置的数据相乘。在一些实施例中,这些乘法器电路2505和2507重新用于其他紧缩数据元素位置。
在其他实施例中,使用附加的乘法器电路,使得并行地处理紧缩数据元素。在一些上下文中,使用尺寸为有符号第三源2509的尺寸的通道来完成并行执行。使用加法电路2511将这些乘法中的每个乘法的结果相加。
[0268] (使用不同的加法器2513或同一加法器2511)将这些乘法结果的加法的结果加到来自有符号源3 2509的最高有效的紧缩数据元素位置的数据。
[0269] 最终,第二加法的结果被存储到与来自有符号第三源2509的所使用的紧缩数据元素位置对应的紧缩数据元素位置中的有符号目的地2515中,或者如果有下一迭代,则该第二加法的结果被继续传递到该下一迭代。在一些实施例中,将写掩码应用于此存储,使得如果对应的写掩码(位)被置位,则存储发生,如果对应的写掩码(位)未被置位,则存储不发生。
[0270] 图26示出根据实施例的尺寸为2的幂的SIMD实现方式,其中,累加器使用比至乘法器的输入的尺寸大的尺寸。注意,(至乘法器的)源和累加器值可以是有符号值或无符号值。对于具有2倍输入尺寸的累加器(换言之,累加器输入值被设置为尺寸是源的紧缩数据元素的尺寸的至少2倍),表2601图示不同的配置。对于字节(int8)尺寸的源,累加器使用尺寸为
16位的字或半精度浮点(HPFP)值。对于字(int16)尺寸的源,累加器使用尺寸为32位的32位整数或单精度浮点(SPFP)值。对于SPFP或32位整数尺寸的源,累加器使用尺寸为64位的64位整数或双精度浮点(DPFP)值。
[0271] 对于具有4倍尺寸的累加器(换言之,累加器输入值被设置为尺寸是源的紧缩数据元素的尺寸的至少4倍),表2603图示不同的配置。对于字节尺寸的源,累加器使用尺寸为32位的32位整数或单精度浮点(SPFP)值。在一些实施例中,对于字尺寸的源,累加器使用尺寸为64位的64位整数或双精度浮点(DPFP)值。
[0272] 对于具有8倍输入尺寸的累加器(换言之,累加器输入值的尺寸被设置为源的紧缩数据元素的尺寸的至少8倍),表2605图示配置。对于字节尺寸的源,累加器使用64位整数。
[0273] 在以上说明书中,已参照本发明的特定示例性实施例描述了本发明的实施例。然而,将显而易见的是,可对这些实施例作出各种修改和改变,而不背离如所附权利要求所述的本发明的更宽泛的精神和范围。因此,说明书和附图应被认为是说明性而非限制性意义。
[0274] 本发明的实施例可包括上文中已描述的各种步骤。可在机器可执行指令中具体化这些步骤,机器可执行指令可用于使通用或专用处理器执行步骤。或者,可由包含用于执行这些步骤的硬连线逻辑的专用硬件组件,或可由被编程的计算机组件和定制硬件组件的任何组合来执行这些步骤。
[0275] 如本文中所述,指令可以指硬件的特定配置,诸如,配置成用于执行某些操作或具有预定功能的专用集成电路(ASIC),或者可以指被存储在被具体化在非暂态计算机可读介质中的存储器中的软件指令。由此,附图中示出的技术可以使用存储在一个或多个电子设备(例如,终端站、网络元件等)上并在该一个或多个电子设备上执行的代码和数据来实现。此类电子设备通过使用计算机机器可读介质来(内部地和/或通过网络与其他电子设备)存储和传递代码和数据,该计算机机器可读介质诸如:非暂态计算机机器可读存储介质(例如,磁盘;光盘;随机存取存储器;只读存储器;闪存设备;相变存储器)、以及暂态计算机机器可读通信介质(例如,电、光、声或其他形式的传播信号——诸如,载波、红外信号、数字信号等)。此外,此类电子设备典型地包括耦合至一个或多个其他组件的一个或多个处理器的集合,这一个或多个其他组件诸如一个或多个存储设备(非暂态机器可读存储介质)、用户输入/输出设备(例如,键盘、触摸屏和/或显示器)以及网络连接。处理器的集合与其他组件的耦合典型地通过一个或多个总线和桥(也称为总线控制器)。存储设备和承载网络通信量的信号分别表示一种或多种机器可读存储介质和机器可读通信介质。由此,给定电子设备的存储设备典型地存储用于在该电子设备的一个或多个处理器的集合上执行的代码和/或数据。当然,本发明的实施例的一个或多个部分可使用软件、固件和/或硬件的不同组合来实现。贯穿此具体实施方式,为了进行解释,陈述了众多特定细节以提供对本发明的透彻理解。然而,对本领域技术人员显而易见的是,没有这些特定细节中的一些细节也可实施本发明。在某些实例中,未详细地描述公知的结构和功能,以免使本发明的主题模含糊。因此,本发明的范围和精神应根据所附权利要求书来判断。
相关专利内容
标题 发布/更新时间 阅读量
高精度水平板 2020-05-12 235
一种高精度天线 2020-05-12 245
高精度打孔设备 2020-05-12 466
高精度测试方法 2020-05-13 51
高精度振荡器 2020-05-13 372
高精度量杯 2020-05-11 108
高精度磨床 2020-05-11 940
高精度磨床 2020-05-12 446
高精度割刀 2020-05-11 822
多精度镜头 2020-05-11 306
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈