从多维阵列预取多维元素块的硬件装置和方法与流程

文档序号:24160774发布日期:2021-03-05 16:31阅读:59来源:国知局
从多维阵列预取多维元素块的硬件装置和方法与流程

[0001]
本公开一般涉及电子设备,并且更具体地,本公开的实施例涉及从多维阵列预取多维元素块。


背景技术:

[0002]
一个处理器或处理器的集合执行来自指令集(例如指令集架构(isa))的指令。指令集是与编程相关的计算机架构的部分,并且一般包括本地数据类型、指令、寄存器架构、寻址模式、存储器架构、中断和异常处理以及外部输入和输出(i/o)。应当注意:本文中的术语指令可指代宏指令,例如提供给处理器以用于执行的指令,或者指代微指令,例如由解码宏指令的处理器的解码器生成的指令。
附图说明
[0003]
本公开通过附图的图中的示例而非限制的方式来图示,在附图中相同的附图标记指示相似的元件,并且在附图中:图1图示根据本公开的实施例的稀疏三维模版(stencil)。
[0004]
图2图示根据本公开的实施例的具有预取单元的多核硬件处理器的框图。
[0005]
图3图示根据本公开的实施例的预取单元的框图。
[0006]
图4图示根据本公开的实施例的从多维阵列预取多维元素块的流程图。
[0007]
图5图示根据本公开的实施例的从多维阵列预取多维元素块的流程图。
[0008]
图6a是图示根据本公开的实施例的通用向量友好指令格式及其a类指令模板的框图。
[0009]
图6b是图示根据本公开的实施例的通用向量友好指令格式及其b类指令模板的框图。
[0010]
图7a是图示根据本公开的实施例的用于图6a和6b中的通用向量友好指令格式的字段的框图。
[0011]
图7b是图示根据本公开的一个实施例的组成完整操作码字段的图7a中的特定向量友好指令格式的字段的框图。
[0012]
图7c是图示根据本公开的一个实施例的组成寄存器索引字段的图7a中的特定向量友好指令格式的字段的框图。
[0013]
图7d是图示根据本公开的一个实施例的组成增强操作字段650的图7a中的特定向量友好指令格式的字段的框图。
[0014]
图8是根据本公开的一个实施例的寄存器架构的框图。
[0015]
图9a是图示根据本公开的实施例的示范性有序流水线和示范性寄存器重命名、无序发布/执行流水线的框图。
[0016]
图9b是图示根据本公开的实施例的将包括在处理器中的有序架构核的示范性实施例和示范性寄存器重命名、无序发布/执行架构核的框图。
[0017]
图10a是根据本公开的实施例的单个处理器核、连同其到管芯上互连网络的连接并且连同2级(l2)高速缓存的其本地子集的框图。
[0018]
图10b是根据本公开的实施例的图10a中处理器核的部分的放大视图。
[0019]
图11是根据本公开的实施例的可具有多于一个核、可具有集成存储器控制器并且可具有集成图形的处理器的框图。
[0020]
图12是根据本公开的一个实施例的系统的框图。
[0021]
图13是根据本公开的实施例的更特定的示范性系统的框图。
[0022]
图14图示根据本公开的实施例的第二更特定的示范性系统的框图。
[0023]
图15图示根据本公开的实施例的片上系统(soc)的框图。
[0024]
图16是根据本公开的实施例的对比使用软件指令转换器将源指令集中的二进制指令转换成目标指令集中的二进制指令的框图。
具体实施方式
[0025]
在下面的描述中,阐述许多具体细节。然而,应当理解:可实践本公开的实施例而无需这些具体细节。在其它实例中,没有详细示出公知的电路、结构和技术,以便不模糊对该描述的理解。
[0026]
说明书中对“一个实施例”、“一实施例”、“示例性实施例”等等的参考指示所述的实施例可包括特殊特征、结构或特性,但是每个实施例可不一定包括特殊特征、结构或特性。此外,这样的短语不一定指代相同的实施例。此外,当结合实施例描述特殊特征、结构或特性时,认为结合无论是否明确描述的其它实施例来影响这样的特征、结构或特性在本领域技术人员的知识范围内。
[0027]
指令处理硬件(例如具有一个或多个核以解码和/或执行指令的硬件处理器)可对数据进行操作(例如在执行算术或逻辑功能时)。访问(例如加载或存储)数据的处理器可被迫等待数据到达,例如,其中处理器正在等待数据并且不处理任何内容(例如置于空闲)。在某些实施例中,硬件处理器可将要由处理器操作的数据从较慢的(例如通常在处理器周期中测量的访问和/或周期时间)存储器加载(例如复制)到较快的存储器,这一般可被称为预取(例如预取数据)。例如,可将要由处理器操作(例如经由稍后在程序命令指令中)的数据从系统(例如主)存储器加载到高速缓存(例如高速缓存存储器)中。高速缓存(例如级l1、l2、l3、4等等的所有或一个或多个级)可以是硬件处理器的部分(例如在管芯上)。在一个实施例中,高速缓存是静态随机存取存储器(sram)。系统存储器可以是与硬件处理器分离的组件,例如可由处理器经由总线访问的存储器。在一个实施例中,系统存储器是动态随机存取存储器(dram)和/或外部(来自处理器)的存储器(例如大容量存储设备)。系统存储器在访问和/或周期时间中(例如在完成请求的在其中加载和/或存储时)可比高速缓存慢(例如,至少1、2、3、4、5、6、7、8、9或10个数量级)。如本文所使用的,高速缓存行一般可指代可作为用于一致性目的的单元被管理的数据的块(例如扇区)。高速缓存行可包括多个离散的元素,例如向量的元素。
[0028]
预取数据(例如预取)到高速缓存(例如从系统存储器或从较低级的高速缓存到较高级的高速缓存,诸如从l3到l2或l1高速缓存)可最小化处理器等待该数据(例如处于闲置)所花费的时间。预取可减少硬件处理器中的存储器访问延迟。某些处理操作(例如模版
计算)可包括相对大量(例如大于高速缓存的或高速缓存级的容量)的数据。这可导致处理延迟,例如,其中硬件处理器对来自高速缓存的数据(例如高速缓存行数据)的请求是未命中(miss)(例如高速缓存行不在高速缓存中或请求的高速缓存级中),并且数据在比来自该高速缓存的加载慢的操作中被加载。高速缓存可比系统存储器小(例如,至少1、2、3、4、5、6、7、8、9、10、100或1000个数量级)。
[0029]
模版计算(例如操作)是通常在由硬件处理器执行的科学计算、金融服务和地震成像中发现的操作(例如向量计算)的一个示例。模版计算具有以下一般形式:
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(1)其中每个元素(例如节点)可具有其自己的数据,例如,以从某些相邻元素形成加权贡献。可对来自多维阵列的多维元素块(例如子集)执行模版计算,例如使用处理器来对向量数据进行操作(诸如但不限于用simd向量和/或simd硬件)。元素一般可指表示单个值的数据的离散部分。例如,512位高速缓存行可具有:对于每个元素具有32位的16个元素,对于每个元素具有8位的64个元素,等等。本文中的某些实施例可假设多维阵列或多维元素块被平坦化为存储器中的单维阵列或元素块。虽然参考模版讨论本公开的某些实施例,但这仅仅是本公开的一个应用的示例。以下讨论本公开的应用的附加的非限制性示例。图1图示根据本公开的实施例的稀疏三维(3d)模版100。例如,模版100可用于基于由该模版覆盖(例如在该模板中)的6*k个元素的值来为元素105计算新值(例如来自那些6*k个相邻元素的加权贡献),其中k是模版的半宽度。如参照图1所图示的,稀疏可指代不是由多维元素块(例如(2*k+1)*(2*k+1)个元素的立方体,它是如所描绘的9*9*9(729)个元素的立方体)的最外层元素定义的数据的整个块(例如这里的立方体将是那里的整个块)中存在的所有元素。
[0030]
多维(例如二维、三维、四维等等)阵列可以是任何大小(size),例如与模版的维度(dimension)相比在大小上是一个数量级或更多。例如,可将模版移动到多维阵列中的新元素,以基于先前(例如相邻)元素来为那些新元素计算新值。在一个实施例中,多维阵列由先前过程用元素填充(例如使用数据库填充方法)。在一个实施例中,多维阵列的每个元素是四个字节。在一个实施例中,多维阵列的每个元素是八个字节。在一个实施例中,多维阵列的每个元素是16个字节。在一个实施例中,多维阵列的每个元素与高速缓存行的元素的大小相同。在一个实施例中,多维元素块的每个元素与高速缓存行的元素的大小相同。在一个实施例中,多维元素块中的每个元素与多维阵列的每个元素的大小相同。
[0031]
(例如单个)预取指令(例如宏指令)可允许硬件处理器(例如其预取单元)将多维元素块从多维阵列预取到高速缓存中。这样的指令的一些非限制性格式如下。在某些实施例中,预取指令包括数据字段(例如一个或多个操作数),该数据字段指示(例如向处理器):多维元素块的(例如起始或中心)元素的系统(例如虚拟)存储器地址,多维元素块的步幅(例如在一个或多个维度中),多维元素块的边界(例如和形状),或者其任何组合。在一个实施例中,地址是模版的中心,例如图1中的元素105。在一个实施例中,地址是模版的边界元素,例如当k为4时,图1中的元素101x或109x。阵列的步幅(例如步长或增量)一般可指代在一个元素的开始与下一个元素的开始之间的存储器中的(例如虚拟或物理)地址的数量。步幅可被测量或以阵列的元素(例如单元)的大小为单位。在一个实施例中,步幅大于元素大
小,因此指示相邻元素之间的额外空间。在某些实施例中,预取指令可为多维元素块(例如合成阵列)和/或多维(例如源)阵列的所有或某些维度指示步幅,例如,步幅可由预取指令的数据字段(例如一个或多个操作数)指示。例如,在预取指令中的操作数字段中,第一维度中的步幅可按s1(步幅值)的形式,第二维度中的步幅可按形式s2(步幅值),等等,从而指示在每个维度中、在某些维度中或在一个维度中的步幅。在第一和第二维度中的均匀步幅可按s12(立即步幅值)的形式。在第一、第二和第三维度中的均匀步幅可按s123(立即步幅值)的形式。虽然这里使用括号,但是可利用任何格式的操作数。
[0032]
在一个实施例中,边界可以是多维块和/或多维阵列的最外层维度的地址。在一个实施例中,一个或多个边界可以是每个维度中的元素的数量,例如,如相对于已知系统存储器地址的一个或多个元素所测量的。例如,如果为图1中的中心元素105和维度k给出地址,可确定边界。此外,边界(或表示边界的代码的流)可用于确定多维元素块(例如图1中的稀疏模版100)中的其它元素的地址。边界在多个维度的每个维度中可能不同。
[0033]
在某些实施例中,预取指令可指示例如经由操作码和/或任何数据字段(例如一个或多个操作数)将多维元素块加载到哪级高速缓存(例如1级(l1)、2级(l2)、3级(l3)、4级(l4)等等)中。例如,可在预取指令中的操作数字段中包括“l1”、“l2”、“l3”、“l4”或其它操作数的文本,以指示高速缓存的目标级。在一个实施例中,预取可包括将数据从系统存储器预取(或为该数据预取系统存储器地址)到高速缓存或从一级高速缓存预取到较高级高速缓存(例如从l3到l2或l1)。
[0034]
以下在表1中提供预取指令(例如以编程语言而不是机器语言描绘)的示例性格式。
[0035]
注意:末尾处括号中的数字仅仅是为了帮助下面的讨论,而不是操作数字段的部分。操作码名称仅仅是示例,并且可使用其它名称。操作数可以是立即值、地址、寄存器(例如用于所有操作数的单个向量寄存器或用于一个或多个操作数的多个寄存器)等等。虽然一起列出某些操作数与某些操作码,但是本公开不限于此,例如,可在任何组合中利用操作码和一个或多个操作数。预取指令可使用存储器,例如系统存储器或寄存器(例如单指令多数据(simd)寄存器),以保持所有或各种操作数。在一个实施例中,操作数存储在多数据寄
存器的每个元素中。在一个实施例中,操作数存储在多个寄存器的每一个中。预取指令可包括指示关于区域的附加信息的操作数,该附加信息例如是数据类型大小(例如每个元素的位大小)。
[0036]
参考示例性指令格式(1),操作码prefetch2d可使得硬件处理器(例如,如本文所讨论的)从多维(例如2d或3d)阵列预取二维(2d)元素块。基的操作数字段可指示(例如编码)二维元素块的基(例如系统存储器)地址,该元素将通过指令的执行而被从位于系统存储器中的多维阵列提取到(例如目标)高速缓存中。在一个实施例中,基的操作数字段是起始元素,例如,不一定是边界上的元素。区域的操作数字段(其可在单个寄存器或多个寄存器等等中)可指示(例如编码)将通过指令的执行而被从位于系统存储器中的多维阵列提取到(例如目标)高速缓存中的2d区域的维度(例如高度和宽度)。在一个实施例中,区域的操作数字段是在宽度(例如笛卡尔坐标中的x方向)和高度(例如笛卡尔坐标中的y方向)的每一个中的位或元素的数量。步幅的操作数字段可指示(例如编码)待预取的多维元素块和/或系统存储器中的多维阵列的步幅(例如以位或元素数量为单位)。步幅在两个维度的每一个中可能不同,例如,步幅数据字段可包括用于一个维度(例如笛卡尔坐标中的x方向)的第一步幅和用于第二维度(例如笛卡尔坐标中的y方向)的第二步幅。目标高速缓存的操作数字段可指示(例如编码)(例如目标)高速缓存的标识(例如高速缓存级),二维元素块将通过指令的执行而被从位于系统存储器中的多维阵列提取(例如加载)到高速缓存中。在一个实施例中,目标高速缓存的操作数字段是最后一级高速缓存或l3。这样的指令的执行可将系统存储器区域的高度乘宽度的整个矩形预取到高速缓存中,该系统存储器区域以基地址开始并且使用矩形区域的对应行和/或列之间的一个或多个步幅。
[0037]
参考示例性指令格式(2),操作码prefetch3d可使得硬件处理器(例如,如本文所讨论的)从多维(例如3d或4d)阵列预取三维(3d)元素块。基的操作数字段可指示(例如编码)三维元素块的基(例如系统存储器)地址,该元素将通过指令的执行而被从位于系统中的多维阵列提取到(例如目标)高速缓存中。在一个实施例中,基的操作数字段是起始元素,例如,不一定是边界上的元素。区域的操作数字段(其可在单个寄存器或多个寄存器等等中)可指示(例如编码)将通过指令的执行而被从位于系统存储器中的多维阵列提取到(例如目标)高速缓存中的3d区域的维度(例如高度、宽度和深度)。在一个实施例中,区域的操作数字段是在高度(例如笛卡尔坐标中的z方向)、宽度(例如笛卡尔坐标中的x方向)和深度(例如笛卡尔坐标中的y方向)的每一个中的位或元素的数量。步幅的操作数字段可指示(例如编码)待预取的多维元素块和/或系统存储器中的多维阵列的步幅(例如以位或元素的数量为单位)。步幅在两个维度或三个维度的每一个中可能不同,例如,步幅数据区域可包括:用于一个维度(例如笛卡尔坐标中的x方向)的第一步幅,用于第二维度(例如笛卡尔坐标中的y方向)的第二步幅,以及用于第三维度(例如笛卡尔坐标中的z方向)的第三步幅。目标高速缓存的操作数字段可指示(例如编码)(例如目标)高速缓存的标识(例如高速缓存级),三维元素块将通过指令的执行而被从位于系统存储器中的多维阵列提取(例如加载)到高速缓存中。在一个实施例中,目标高速缓存的操作数字段是最后一级高速缓存或l3。这样的指令的执行可将系统存储器区域的高度乘宽度乘深度的整个立方体预取到高速缓存中,该系统存储器区域开始包括基地址并且使用矩形区域的对应元素之间的一个或多个步幅。
[0038]
参考示例性指令格式(3),操作码prefetch可使得硬件处理器(例如,如本文所讨
论的)用维度的数量从多维阵列预取多维元素块,维度的数量是操作数字段,例如,而不是操作码的部分。例如,具有维度为2的操作数字段的prefetch指令可充当以上的prefetch2d指令。例如,具有维度为3的操作数字段的prefetch指令可充当以上prefetch3d指令。维度的操作数字段可以是2、3、4、5、6、7、8、9等等,并且可包括缩放操作数,例如缩放(例如修改)一个或多个步幅操作数和/或区域操作数来定义待预取的多维元素块的边界。在一个实施例中,用于待预取的多维元素块的一个或多个维度(例如每个维度)的步幅可以是立即值和/或存储在存储器中,例如在寄存器中。
[0039]
参考示例性指令格式(4),操作码2d_block_prefetchx可使得硬件处理器(例如,如本文所讨论的)从多维(例如2d或3d)阵列预取二维(2d)元素块(例如正方形)。[a]的操作数字段可指示(例如编码)二维元素块的基(例如系统存储器)地址,该元素将通过指令的执行而被从位于系统存储器中的多维阵列提取到(例如目标)高速缓存中。在一个实施例中,[a]的操作数字段是起始元素,例如边界上的元素。例如可指代半宽度(或者对应于多维元素块的至少一个维度中的(2*k+1)的全宽度,例如,如在图1中的模版100中)的k的操作数字段可指示(例如编码)2d区域的维度(例如高度和宽度),该2d区域将通过指令的执行而被从位于系统存储器中的多维阵列提取到(例如目标)高速缓存中。在一个实施例中,k的操作数字段指示(2*k+1)是宽度(例如笛卡尔坐标中的x方向)和高度(例如笛卡尔坐标中的y方向)的每一个中的位或元素的数量。n1的操作数字段可指示(例如编码)待预取的多维元素块和/或系统存储器中的多维阵列的步幅(例如以位或元素的数量为单位)。步幅在两个维度的每一个中可能不同,例如,步幅数据字段n1可包括用于一个维度(例如笛卡尔坐标中的x方向)的第一步幅和用于第二维度(例如笛卡尔坐标中的y方向)的第二步幅。x的操作码字段可指示(例如编码)(例如目标)高速缓存的标识(例如高速缓存级),二维元素块将通过指令的执行而被从位于系统存储器中的多维阵列提取(例如加载)到高速缓存中。替代地,x可在操作数字段中。在一个实施例中,目标高速缓存的操作数字段是最后一级高速缓存或l3。这样的指令的执行可将系统存储器区域的高度乘宽度的整个正方形预取到高速缓存中,该系统存储器区域开始于基地址并且使用矩形区域的对应行和/或列之间的一个或多个步幅。例如,该指令可将从地址a(例如,如由第一操作数所指定)开始的数量2*k+1个元素(例如高速缓存行)预取到高速缓存级“x”中(其中x是变量)。预取的k个元素(例如高速缓存行)的集合可以是在每个维度中作为[a],[a+n1],[a+2*n1],...[a+(k-1)*n1]延伸的正方形。
[0040]
参考示例性指令格式(5),操作码2d_block_center_prefetchx可使得硬件处理器(例如,如本文所讨论的)从多维(例如2d或3d)阵列提取二维(2d)元素块(例如正方形)。[a]的操作数字段可指示(例如编码)二维元素块的基(例如系统存储器)地址,该元素将通过指令的执行而被从位于系统存储器中的多维阵列提取到(例如目标)高速缓存中。在一个实施例中,[a]的操作数字段是多维元素块的正方形的中心元素,例如图1中的元素105。可包括其它操作数,例如,如参考以上示例性指令格式(4)所讨论的。例如,该指令可将包括(例如在中心中)地址a(例如,如由第一操作数所指定)的数量k个元素(例如高速缓存行)预取到高速缓存级“x”中(其中x是变量)。预取的k个元素(例如高速缓存行)的集合可以是在每个维度中作为[a-k*n1]至[a+k*n1]延伸的正方形。
[0041]
例如操作数n1的数据字段可包括对于多维块朝着例如3d中的(+或-)x、y或z延伸的方向。
[0042]
参考示例性指令格式(6),操作码3d_block_sparse_prefetchx可使得硬件处理器(例如,如本文所讨论的)从多维(例如3d或4d)阵列预取稀疏三维(稀疏3d)元素块。[a]的操作数字段可指示(例如编码)(稀疏)三维元素块的基(例如系统存储器)地址,该元素将通过指令的执行而被从位于系统存储器中的多维阵列提取到(例如目标)高速缓存中。在一个实施例中,[a]的操作数字段是起始元素,例如稀疏块的中心中的元素。k的操作数字段(例如其可指代半宽度,或者指代在多维元素块的至少一个维度中的(2*k+1)的全宽度)可指示(例如编码)3d稀疏块的维度(例如高度、宽度和深度,例如全部具有相同的值),该3d稀疏块将通过指令的执行而被从位于系统存储器中的多维阵列提取到(例如目标)高速缓存中。在一个实施例中,(2*k+1)的操作数字段是在宽度(例如笛卡尔坐标中的x方向)、高度(例如笛卡尔坐标中的z方向)和深度(例如笛卡尔坐标中的y方向)的每一个中的位或元素的数量。n1和n2的操作数字段可指示(例如编码)在待预取的多维元素块和/或系统存储器中的多维阵列的分别在第一方向和第二方向中的步幅(例如以位或元素的数量为单位)。步幅在两个维度的每一个中可能不同,例如,步幅数据字段可包括用于一个维度(例如笛卡尔坐标中的x方向)的第一步幅n1和用于第二维度(例如笛卡尔坐标中的y方向)的第二步幅n2。第三方向中的步幅可以是n1*n2。例如,如果起始元素是a[x,y,z],并且要到的元素是a[x,y,z+1],它们之间的距离是a[x,y,z]+n1*n2*元素的大小。x的操作码字段可指示(例如编码)(例如目标)高速缓存的标识(例如高速缓存级),稀疏三维元素块将通过指令的执行而被从位于系统存储器中的多维阵列提取(例如加载)到高速缓存中。替代地,x可在操作数字段中。在一个实施例中,目标p0高速缓存的操作数字段是最后一级高速缓存或l3。这样的指令的执行可将系统存储器区域的高度乘宽度乘深度的三个相交的一维阵列(例如彼此成直角)预取到高速缓存中,该系统存储器区域包括基地址并且使用在区域的对应行和/或列之间的一个或多个步幅。例如,该指令可将包括地址a(例如,如由第一操作数指定的)的数量6*k+1的元素(例如高速缓存行)预取到高速缓存级“x”中(其中x是变量)。预取的k个元素(例如高速缓存行)的集合可以是在每个维度中作为[a-k*n1]至[a+k*n1]延伸的稀疏3d块,例如,如在图1中的模版100中。
[0043]
参考示例性指令格式(7),操作码3d_block_prefetchx可使得硬件处理器(例如,如本文所讨论的)从多维(例如3d或4d)块预取三维(3d)块。[a]的操作数字段可指示(例如编码)三维元素块的基(例如系统存储器)地址,该元素将通过指令的执行而被从位于系统存储器中的多维阵列提取到(例如目标)高速缓存中。在一个实施例中,[a]的操作数字段是起始元素,例如在稀疏块的中心中的元素。k的操作数字段(例如其可指代半宽度或者指代在多维元素块(例如模版)的至少一个维度中的(2*k+1)的全宽度)可指示(例如编码)3d块的大小(例如高度、宽度和深度,例如全部具有相同的值),3d块将通过指令的执行而被从位于系统存储器中的多维阵列提取到(例如目标)高速缓存中。在一个实施例中,k的操作数字段指示(2*k+1)是宽度(例如笛卡尔坐标中的x方向)、高度(例如笛卡尔坐标中的z方向)和深度(例如笛卡尔坐标中的y方向)的每一个中的位或元素的数量。n1和n2的操作数字段可指示(例如编码)在待预取的多维元素块和/或系统存储器中的多维阵列的分别在第一方向和第二方向中的步幅(例如以位或元素的数量为单位)。步幅在两个维度的每一个中可能不同,例如,步幅数据字段可包括用于一个维度(例如笛卡尔坐标中的x方向)的第一步幅n1和用于第二维度(例如笛卡尔坐标中的y方向)的第二步幅n2。到第三方向的步幅可以是n1*
n2。x的操作码字段可指示(例如编码)(例如目标)高速缓存的标识(例如高速缓存级),稀疏三维元素块将通过指令的执行而被从位于系统存储器中的多维阵列提取(例如加载)到高速缓存中。替代地,x可在操作数字段中。在一个实施例中,目标高速缓存的操作数字段是最后一级高速缓存或l3。这样的指令的执行可将系统存储器区域的高度乘宽度乘深度的立方体预取到高速缓存中,该系统存储器区域包括基地址并且使用区域的对应行和/或列之间的一个或多个步幅。例如,该指令可将开始于(例如角)地址a(例如,如由第一操作数指定)的数量(2*k+1)*(2*k+1)*(2*k+1)的元素(例如高速缓存行)预取到高速缓存级”x”中(其中x是变量)。预取的k个元素(例如高速缓存行)的集合可以是由[a],[a+n1],[a+2*n1]...,[a+(k-1)*n1],[a+n1*n2],[a+n1*n2+n1],...[a+(k-1)*n1*n2+(k-1)*n1]形成的立方体。替代地,该指令可由数量(2*k+1)的2d_block_prefetchx指令代替。
[0044]
虽然以上示出(例如作为目标高速缓存或x)目标高速缓存(例如将多维元素块加载到其中的高速缓存的标识),但是其不是所需的,例如可能不存在目标高速缓存字段。另外或替代地,目标高速缓存可隐含在操作数中,例如,预取操作码可向执行指令(例如在解码期间)的硬件处理器指示:目标高速缓存是某个高速缓存级(例如l1、l2、l3、l4等等)。在一个实施例中,用于指令的目标高速缓存对于特殊操作码向硬件处理器指示目标高速缓存的操作码是相同的,例如,目标高速缓存总是某个高速缓存级(例如l1、l2、l3、l4等等)。
[0045]
图2图示根据本公开的实施例的具有预取单元220的多核硬件处理器202的框图200。任何处理器可包括预取单元,例如下面讨论的处理器。图2图示例如在高速缓存一致性层次结构中的多个处理器核(核a和核b)和多个高速缓存级(l1、l2和l3)的实施例。虽然描绘两个核,但是可利用单个或多于两个核。虽然描绘多个高速缓存级,但是可利用单个或任何数量的高速缓存。一个或多个高速缓存可按任何方式组织,例如,作为物理或逻辑集中式或分布式的高速缓存。
[0046]
在实施例中,处理器可包括一个或多个高速缓存,该处理器诸如包括图中图示的处理器核的一个或多个处理器或者任何其它处理器。图2图示三级(例如1级(l1)、2级(l2)和3级(l3))高速缓存的实施例。处理器可包括至少一个核和至少一个非核。在一个实施例中,多个核(核a和b)属于单个处理器202。核(例如核a和核b)可包括处理器的组件以执行指令。非核可包括不在核中的所有逻辑。处理器核(例如核a)可包括组件,诸如1级指令高速缓存(l1i)208和1级数据高速缓存(l1d)210。核(例如核a)可包括组件,诸如地址生成单元(agu)212、转换后备(lookaside)缓冲器(tlb)214和2级高速缓存(l2)216。核可或可不与其它核共享高速缓存,例如,核a和核b可共享3级高速缓存(l3)218,而不是l2 216或l1(208.210)。核可包括这些组件的任何组合或者不包括这些组件中的任何一个。处理器202(例如核a和核b)可访问(例如加载和存储)系统存储器224中的数据,例如,如由箭头所指示。在一个实施例中,系统存储器224可通过总线与核通信,例如在比核访问高速缓存(例如处理器202上的高速缓存)慢的访问和/或周期时间。系统存储器224可包括多维阵列226,例如先前被加载到系统存储器224中以执行预取指令。
[0047]
例如地址计算单元(acu)的地址生成单元(例如agu 212)可指代在处理器(例如核)内部的执行单元,该执行单元计算用于访问存储器(例如系统存储器224)的地址,例如,以允许核访问系统存储器。在一个实施例中,agu采用地址流(例如等式)作为输入,并且为该流输出(例如虚拟)地址。agu(例如电路)可执行诸如加法、减法、模运算或位移之类的算
术运算(例如利用其加法器、乘法器、移位器、旋转器等等)。
[0048]
转换后备缓冲器(例如tlb 214)可将虚拟地址转换成(例如系统存储器的)物理地址。tlb可包括数据表以存储(例如最近使用的)虚拟到物理存储器地址转换,例如使得不必在存在的每个虚拟地址上执行转换以获得物理存储器地址。如果虚拟地址条目不在tlb中,处理器可执行页面移动以确定虚拟到物理存储器地址转换。
[0049]
预取单元220可以是分离的功能单元,例如不利用核的功能单元(例如执行单元、算术逻辑单元(alu)、agu、tlb等等)。预取单元可由预取指令(例如,如本文所公开的)使用。预取单元可包括线路和/或硬件逻辑以执行本文讨论的预取。预取单元可以是处理器的部分(例如在非核上)。预取单元可与处理器的一个或多个核通信,例如经由通信资源(未示出),诸如但不限于环形网络。处理器202可经由存储器控制器(例如作为处理器的部分)和/或互连来与系统存储器224和/或高速缓存(例如图2中的l1、l2或l3)通信。预取单元220可输出将被从系统存储器224中的多维阵列226加载(例如复制)到高速缓存(例如图2中的l1、l2或l3)的多维元素块的系统存储器地址。预取单元220可将系统存储器地址输出到处理器202的存储器控制器(未示出)。
[0050]
图3图示根据本公开的实施例的硬件预取单元320的框图。硬件预取单元可包括所示的元素的任何组合,或者不包括所示的元素中的任何一个。例如,预取单元可仅仅包括控制单元324(或控制单元逻辑),以采用多维元素块的规范(例如维度、基地址、区域边界、步幅和/或目标高速缓存)作为输入,以预取到高速缓存中和/或输出(例如经由逻辑或状态机,诸如有限状态机(fsm))多维元素块的(例如物理)系统存储器地址,例如,以将多维元素块的数据移动到高速缓存中。在一个实施例中,系统存储器地址(例如存储器请求)的输出被发送到存储器控制单元(例如存储器控制器)的队列或缓冲器,例如以完成那些请求。
[0051]
在一个实施例中,硬件预取单元可连接到系统存储器,并使得多维元素块移动到高速缓存中(例如,在不利用核的资源的情况下)。
[0052]
在一个实施例中,预取单元与执行单元和/或处理器流水线(例如图9中的900)分离。例如,预取指令可由执行单元执行(例如发起),并且之后利用预取单元来获得将被放在高速缓存中的多维元素块的系统存储器地址,而不在处理器的(例如执行单元的)核中生成地址。
[0053]
在图3中,所描绘的预取单元320包括输入322。输入322可以是预取到高速缓存中的多维元素块的规范(例如维度、基地址、区域边界、步幅和/或目标高速缓存)。规范可以是来自预取指令的操作数和/或操作码数据。输入322a(可选)可直接连接到控制单元324以提供规范和/或包括队列。控制单元324可包括逻辑以将规范转换成虚拟地址。在一个实施例中,控制单元324包括有限状态机(fsm 325)以将规范转换成虚拟地址。例如,fsm具有用于每个多维块大小(例如2d、3d、4d等等)的状态(或状态的集合)并且利用fsm的某些状态来相应地为规范输出地址流(例如等式)。例如,参考用于2d_block_prefetchx操作码的示例性指令格式(4),地址流可包括[a],[a+n1],[a+2*n1],...[a+(k-1)*n1]并为a、k和n1供应值。
[0054]
地址流可被输出326到地址生成单元312。agu可以是预取单元的agu 312或者核的agu(例如图2中的agu 212)。agu可从地址流生成(例如虚拟)地址。如上所指出的,agu的硬件电路可包括算术或其它硬件组件,例如加法器、乘法器、移位寄存器等等。用于(例如整个)流的虚拟地址然后可被输出328(例如顺序地)到转变后备缓冲器(tlb)314(或者其它组
件以将虚拟地址转换成处理器可使用其来访问系统存储器(例如图2中的系统存储器224)的地址格式)中。在图3中,tlb 314可接收虚拟地址并将其转换成物理地址。在一个实施例中,tlb可以是预取单元的tlb 314或者核的tlb(例如图2中的tlb 214)。可例如经由输出330而从预取单元320或者经由300a而直接从tlb输出物理地址。在330或330a处可包括队列。作为可选部件,预取单元320可包括状态寄存器332(或其它状态指示符),使得组件或用户可查询状态寄存器332以确定预取单元的状态。在一个实施例中,状态寄存器332可例如经由输出334a指示当前预取操作正在进行、完成、失败等等。在一个实施例中,状态寄存器332可指示预取单元忙或不忙。在一个实施例中,来自状态寄存器和/或输入查询的输出可经由预取单元输出334发生。控制单元324可控制(例如更新)状态寄存器332。
[0055]
注意:在本文中用于通信的箭头的使用中,单个方向箭头可允许任一个方向中(例如发送和/或接收信号)的通信。
[0056]
图4图示根据本公开的实施例的从多维阵列预取多维元素块的流程图400。输入402可以是待预取的多维元素块的规范(例如维度、基地址、区域边界、步幅和/或目标高速缓存)。那些规范然后可用于创建地址流404(例如由控制单元324)。地址流然后可用于生成(例如虚拟)地址。流可在408处迭代,直到流的所有地址被预取410到高速缓存中,也就是说,直到完毕(例如完成)412。在一个实施例中,预取逻辑(例如fsm)可控制流程图400中的某些或所有动作的执行。
[0057]
作为进一步的示例,以下是三个可能的硬件逻辑(例如fsm)的实现方式。首先,逻辑(例如fsm)可包括:整数加法器(和/或乘法器等等)以计算地址(例如地址a(基地址)+64;参见以上用于其它示例的地址流),以及tlb以在发送到存储器子系统(例如控制器)之前将虚拟地址转换成物理地址。在该实现方式中,fsm可以是整装的(self-contained),并且可被开发为处理器内部的分离的功能单元。在一个实施例中,预取单元的tlb被保持与处理器的一个或多个tlb一致。其次,逻辑(例如fsm)可包含agu(例如整数加法器)以生成虚拟地址,并且虚拟地址然后可被馈送到处理器的存储器流水线中以用于虚拟到物理转换(例如经由tlb)和/或被排队以用于高速缓存和系统存储器访问(例如各自交替)。再次,逻辑(例如fsm)可包括控制单元以生成地址流,但是利用处理器核的agu来生成系统存储器的虚拟地址以及处理器核的tlb,以生成待排队用于高速缓存和系统存储器访问的物理系统存储器请求。
[0058]
图5图示根据本公开的实施例的从多维阵列预取多维元素块的流程图500。流程图包括:用解码单元解码预取指令以将多维元素块从多维阵列预取到高速缓存中,其中预取指令的至少一个操作数将指示多维元素块的元素的系统存储器地址、多维元素块的步幅和多维元素块的边界502,以及用执行单元执行预取指令以生成多维元素块的其它元素的系统存储器地址,并将多维元素块从系统存储器地址加载到高速缓存中504。
[0059]
可在规则形状(例如1d、2d或3d)数据块上使用这些块内的规则访问模式来利用本文公开的硬件预取方法和装置。相邻块可以是或者连续的(例如在卷积应用中)或者非连续的(例如在稀疏求解器、稀疏块矩阵向量乘法或地震建模和预测应用中)。
[0060]
在某些实施例中,预取指令可将多维元素块预取到一个或多个高速缓存级。在一个实施例中,高速缓存级是受害者高速缓存。受害者高速缓存可以是最后一级高速缓存(llc),例如图2中的l3 218。在一个示例中,(例如宏)指令将多维元素块从系统存储器预取
到受害者高速缓存中。因为处理器(例如核)可在访问(例如慢得多的)系统存储器之前仔细检查(look through)高速缓存(例如对于数据(例如高速缓存行),从最高(例如图2中的l1)到最低(例如图2中的l3)),对受害者高速缓存的预取可允许处理器访问数据而不访问系统存储器,并且不向处理器提供有问题的数据在高速缓存中的其它通知。在另一个实施例中,多维元素块的预取可包括通知处理器(例如核):多维元素块被加载到高速缓存中(例如使用高速缓存中的那些高速缓存行的标签目录)。
[0061]
在一个实施例中,其中推测性预取数据集可能已被生成并被放在高速缓存中,本文讨论的预取指令、方法和装置可用多维元素块来代替高速缓存中的推测性预取数据集。代替现有(例如不可利用的)高速缓存可能是有用的,例如,由于相对于(例如推测性预取数据集和/或)多维元素块的大小的有限的高速缓存大小、用于从系统存储器提取数据的有限的资源以及由不正确的预取引起的功耗。在一个实施例中,推测性预取数据集和多维元素块对应于将对该数据进行操作的相同的未来指令。
[0062]
在某些实施例中,本文公开的硬件预取方法和装置可在(例如虚拟)地址(例如,不仅仅是用于整个多维元素块的连续虚拟地址)之间生成具有非恒定差异的多个存储器请求。在某些实施例中,本文的硬件方法和装置不仅仅生成随机数,而是相反可瞄准特定的固定模式(例如,如本文所讨论的)。
[0063]
在某些实施例中,本文公开的硬件预取方法和装置可减少高速缓存未命中率并为操作改善性能,该操作对随机位于存储器中的(例如规则形状(1d、2d或3d)的)元素块(例如具有不同大小的块)进行操作。虽然每个块内的访问模式可以是规则的(例如顺序的或步幅的),但是随着操作(例如模版操作)移动到下一个这样的块,访问模式可变得中断,并且推测性预取引擎可需要学习新块内的另一个访问模式(例如使得新块中的正确数据不在高速缓存中),这与如本文所公开的允许预取(例如程序员)定义的多维元素块的预取指令相反。
[0064]
例如考虑需要看到相同步幅三次的预取,以便学习流并以该步幅开始推测性地预取。在移动到新块之后,操作可经历高速缓存中的三个数据未命中。如果数据来自存储器,假设对存储器访问的300个周期的延迟,处理器流水线可停滞多达1000个周期。如果块内的计算花费500个周期,与当到对该数据进行的操作正被执行的时间时或者在其之前,数据在高速缓存中可用时的情况相比,存在3个性能损失的因素(例如1500/500)。
[0065]
在一个实施例中,稀疏线性是求解等式m*x=b的稀疏系统的直接方法。在一个实现方式中,阵列(例如矩阵)m被重新排序。此外,重新排序的矩阵的列可被划分成超级块,例如,其中每个超级块是具有相同非零结构的连续列的小子集。由于相同的非零结构,这些超级块可被存储为相对长和窄的密集矩阵,例如,具有附加索引数据结构以访问超级块的单独的行/列。这些矩阵的宽度和高度可取决于非零结构以及它们在矩阵内的位置。在一侧(例如左)上的超级节点可比在另一侧(例如右)上的超级节点小(例如小得多)。在一个示例中,超级大小在1x1和512x16之间不同。为了在多核处理器上露出平行度,(例如更大的)超级节点可被进一步划分成(例如较小的)可变维度的密集矩阵。因为两个超级节点可按随机方式来访问,例如,如由消除树次序所规定的,推测性预取可能不预取正确的数据,例如,由于不捕获从一个超级节点到另一个的随机转变,并且因此预取在下一个超级节点开始。另外,超级节点的大小可以是小的和/或不同的。超级节点可包括三角形2d阵列。本文的某些实施例可允许超级节点数据的预取(例如对于三角形2d区域)。
[0066]
本公开的实施例允许预取用于以下的数据:几何多网格方法(例如以预取网格级的单元);基于卷积的内核,诸如但不限于intel
®
集成性能基元(ipp)中的基于卷积的内核;计算流体力学(cfd)中的高阶方法;以及基本线性代数子程序(例如blas3)密集线性代数内核的高性能实现方式。虽然本文的某些实施例的预取可用于卷积,但是本公开不限于此。例如,某些实施例可用于预取不展现顺序或几乎顺序访问模式的数据。
[0067]
在一个实施例中,根据本公开的用于多个预取指令的预取操作数存储在分离的存储器位置中(例如在寄存器中),并且每个预取指令可在其各自的操作数集合上被执行,以提供预取数据的每个结合(例如在期望的时间)。在某些实施例中,这可允许预取多维元素块,其中每个块是与其它(例如先前访问的)块不同的非顺序(例如不规则)访问模式。
[0068]
在又一个实施例中,3d中的空间适应性可由柔性非结构化多面体(例如四面体或六面体)网格来实现,例如在地震建模和预测应用中。四面体网格可形成多维阵列,例如四个三角形面的多维阵列。六面体网格可形成多维阵列,例如六个面的多维阵列。本文中的某些实施例可允许预取该数据(例如对于网格的面)。例如,本公开的方法和装置可提供用于全球运营商的预取算符和时间整合未知数。访问结构可由网格定义(例如它在运行时间是已知的,但在编译时间不是已知的)。当处理多面体(例如四面体或六面体)的第i面时,本公开可提供对于第(i+1)面所需的矩阵的范围预取。因为所需的矩阵可具有不同的大小(例如取决于矩阵的稀疏模式),所以可利用2d预取。
[0069]
在一个实施例中,使用块压缩行(bcr)格式和多个右手侧的稀疏矩阵向量乘法可包括多维阵列的非连续块。本文中的某些实施例可允许预取该非连续数据。
[0070]
在一个实施例中,硬件处理器包括解码器和执行单元,该解码器解码预取指令以将多维元素块从多维阵列预取到高速缓存中,其中预取指令的至少一个操作数将指示多维元素块的元素的系统存储器地址、多维元素块的步幅和多维元素块的边界,该执行单元执行预取指令以生成多维元素块的其它元素的系统存储器地址,并将多维元素块从系统存储器地址加载到高速缓存中。执行单元可执行预取指令以使得硬件预取单元:生成多维元素块的其它元素的系统存储器地址,和/或从系统存储器地址将多维元素块加载到高速缓存中。硬件处理器可包括预取单元,以从状态机生成多维元素块的其它元素的系统存储器地址。预取单元可包括加法器,以生成多维元素块的其它元素的系统存储器地址。预取单元可包括地址生成单元,以生成多维元素块的其它元素的系统存储器地址。指令的至少一个操作数可指示高速缓存的级以加载多维元素块。步幅可包括第一维度中的第一步幅和第二维度中的不同的第二步幅。执行单元可将多维元素块加载到受害者高速缓存中。执行单元可用多维元素块代替高速缓存中的推测性预取数据集。
[0071]
在另一个实施例中,一种方法包括:用解码单元解码预取指令以将多维元素块从多维阵列预取到高速缓存中,其中预取指令的至少一个操作数将指示多维元素块的元素的系统存储器地址、多维元素块的步幅和多维元素块的边界,并且用执行单元执行预取指令以生成多维元素块的其它元素的系统存储器地址,以及将多维元素块从系统存储器地址加载到高速缓存中。该方法可包括提供预取单元,以从状态机生成多维元素块的其它元素的系统存储器地址。预取单元可包括加法器,以生成多维元素块的其它元素的系统存储器地址。预取单元可包括地址生成单元,以生成多维元素块的其它元素的系统存储器地址。指令的至少一个操作数可指示高速缓存的级以加载多维元素块。步幅可包括第一维度中的第一
步幅和第二维度中的不同的第二步幅。执行单元可将多维元素块加载到受害者高速缓存中。执行单元可用多维元素块代替高速缓存中的推测性预取数据集。
[0072]
在又一个实施例中,一种装置包括:一个或多个处理器的集合,以及存储代码的一个或多个数据存储设备的集合,该代码在由处理器的集合执行时使得一个或多个处理器的集合执行以下:用解码单元解码预取指令以将多维元素块从多维阵列预取到高速缓存中,其中预取指令的至少一个操作数将指示多维元素块的元素的系统存储器地址、多维元素块的步幅和多维元素块的边界,并且用执行单元执行预取指令以:生成多维元素块的其它元素的系统存储器地址,并将多维元素块从系统存储器地址加载到高速缓存中。数据存储设备的集合可进一步存储代码,该代码在由处理器的集合执行时使得处理器的集合执行以下:进一步包括提供预取单元以从状态机生成多维元素块的其它元素的系统存储器地址。数据存储设备的集合可进一步存储代码,该代码在由处理器的集合执行时使得处理器的集合执行以下:其中预取单元进一步包括加法器以生成多维元素块的其它元素的系统存储器地址。数据存储设备的集合可进一步存储代码,该代码在由处理器的集合执行时使得处理器的集合执行以下:其中预取单元进一步包括地址生成单元以生成多维元素块的其它元素的系统存储器地址。数据存储设备的集合可进一步存储代码,该代码在由处理器的集合执行时使得处理器的集合执行以下:其中指令的至少一个操作数将指示高速缓存的级以加载多维元素块。数据存储设备的集合可进一步存储代码,该代码在由处理器的集合执行时使得处理器的集合执行以下:其中步幅包括第一维度中的第一步幅和第二维度中的不同的第二步幅。数据存储设备的集合可进一步存储代码,该代码在由处理器的集合执行时使得处理器的集合执行以下:其中执行单元将加载多维元素块到受害者高速缓存中。数据存储设备的集合可进一步存储代码,该代码在由处理器的集合执行时使得处理器的集合执行以下:其中执行单元将用多维元素块代替高速缓存中的推测性预取数据集。
[0073]
在另一个实施例中,硬件处理器包括:解码预取指令以将多维元素块从多维阵列预取到高速缓存中的装置,其中预取指令的至少一个操作数将指示多维元素块的元素的系统存储器地址、多维元素块的步幅和多维元素块的边界,以及执行预取指令的装置,以生成多维元素块的其它元素的系统存储器地址,并将多维元素块从系统存储器地址加载到高速缓存中。
[0074]
在又一个实施例中,机器可读存储介质包括代码,该代码在被执行时使得机器执行本文公开的方法。
[0075]
指令集可包括一个或多个指令格式。给定的指令格式可定义各种字段(例如位数、位的位置),以除了其它项之外还指定待执行的操作(例如操作码)和将在其上执行该操作的一个或多个操作数和/或一个或多个其它数据字段(例如掩码)。通过指令模板(或子格式)的定义进一步细分一些指令格式。例如,给定指令格式的指令模板可被定义成具有指令格式的字段的不同子集(所包括的字段典型地以相同次序,但是至少一些具有不同的位的位置,因为存在较少的包括的字段)和/或被定义成具有不同地解释的给定字段。因此,isa的每个指令使用给定的指令格式(并且如果定义的话,以该指令格式的指令模板中的给定指令格式)来表达,并且包括用于指定操作和操作数的字段。例如,示范性add指令具有特定操作码和指令格式,该指令格式包括操作码字段以指定操作码和操作数字段来选择操作数(源1/目的地和源2);并且指令流中该add指令的出现将具有在选择特定操作数的操作数字
段中的特定内容。已经发布和/或公开了被称为高级向量扩展(avx)(avx1和avx2)并使用向量扩展(vex)编码方案的simd扩展的集合(例如参见inter
®ꢀ
64和ia-32架构软件开发人员的手册,2014年9月;以及参见intel
®
高级向量扩展编程参考,2014年10月)。
[0076]
示范性指令格式本文所述的一个或多个指令的实施例可按不同的格式来体现。另外,以下详细描述示范性系统、架构和流水线。可在这样的系统、架构和流水线上执行一个或多个指令的实施例,但不限于详细描述的那些。
[0077]
通用向量友好指令格式向量友好指令格式是适合于向量指令的指令格式(例如存在特定于向量运算的某些字段)。虽然描述在其中通过向量友好指令格式支持向量和标量运算两者的实施例,但是替代实施例仅仅使用向量运算向量友好指令格式。
[0078]
图6a-6b是图示根据本公开的实施例的通用向量友好指令格式及其指令模板的框图。图6a是图示根据本公开的实施例的通用向量友好指令格式及其a类指令模板的框图;而图6b是图示根据本公开的实施例的通用向量友好指令格式和其b类指令模板的框图。具体地,针对通用向量友好指令格式600定义了a类和b类指令模板,所述指令模板都不包括存储器访问605指令模板和存储器访问620指令模板。在向量友好指令格式的上下文中通用的术语指代不绑定到任何特定指令集的指令格式。
[0079]
虽然将描述该发明的实施例,其中向量友好指令格式支持以下:具有32位(4字节)或64位(8字节)数据元素宽度(或大小)的64字节向量操作数长度(或大小)(并且因此,64字节向量由16个双字大小的元素或者替代地由8个四字大小的元素组成);具有16位(2字节)或8位(1字节)数据元素宽度(或大小)的64字节向量操作数长度(或大小);具有32位(4字节)、64位(8字节)、16位(2字节)或8位(1字节)数据元素宽度(或大小)的32字节向量操作数长度(或大小);以及具有32位(4字节)、64位(8字节)、16位(2字节)或8位(1字节)数据元素宽度(或大小)的16字节向量操作数长度(或大小);但是替代实施例可支持具有更多、更少或不同的数据元素宽度(例如128位(16字节)数据元素宽度)的更多、更少和/或不同的向量操作数大小(例如256字节向量操作数)。
[0080]
图6a中的a类指令模板包括:1)在无存储器访问605指令模板内,示出有无存储器访问、完整舍入(round)控制类型操作610指令模板和无存储器访问、数据变换类型操作615指令模板;以及2)在存储器访问620指令模板内,示出有存储器访问、暂时625指令模板和存储器访问、非暂时630指令模板。图6b中的b类指令模板包括:1)在无存储器访问605指令模板内,示出有无存储器访问、写入掩码控制、部分舍入控制类型操作612指令模板和无存储器访问、写入掩码控制、vsize类型操作617指令模板;以及2)在存储器访问620指令模板内,示出有存储器访问、写入掩码控制627指令模板。
[0081]
通用向量友好指令格式600包括以下以在图6a-6b中所图示的次序列出的下面的字段。
[0082]
格式字段640-该字段中的特定值(指令格式标识符值)唯一地标识向量友好指令格式,以及因此在指令流中发生以向量友好指令格式的指令。因此,在对于仅仅具有通用向量友好指令格式的指令集不需要的意义上,该字段是可选的。
[0083]
基本操作字段642-其内容区分不同的基本操作。
[0084]
寄存器索引字段644-其内容直接地或通过地址生成指定源和目的地操作数的位置,不管它们在寄存器中还是在存储器中。这些包括足够数量的位以从pxq(例如32
×
512、16
×
128、32
×
1024、64
×
1024)个寄存器文件选择n个寄存器。虽然在一个实施例中,n可以是多达三个源和一个目的地寄存器,但是替代实施例可支持更多或更少的源和目的地寄存器(例如可支持多达两个源,其中这些源中的一个也充当目的地,可支持多达三个源,其中这些源中的一个也充当目的地,可支持多达两个源和一个目的地)。
[0085]
修饰符字段646-其内容将在指定存储器访问的通用向量指令格式中的指令的出现与不那样做的区分开来;也就是说,在无存储器访问605指令模板与存储器访问620指令模板之间。存储器访问操作读取和/或写入到存储器层次结构(在某些情况下,使用寄存器中的值指定源和/或目标地址),而非存储器访问操作不这样(例如源和目的地是寄存器)。虽然在一个实施例中,该字段还在三个不同的方式之间选择以执行存储器地址计算,但是替代实施例可支持更多、更少或不同的方式来执行存储器地址计算。
[0086]
增强操作字段650-其内容区分除了基本操作之外还将执行各种不同的操作中的哪一个。该字段是上下文特定的。在本公开的一个实施例中,该字段被划分成类字段668、α字段652和β字段654。增强操作字段650允许在单个指令而不是2、3或4个指令中执行常见的操作分组。
[0087]
缩放字段660-其内容允许索引字段的内容的缩放以用于存储器地址生成(例如用于使用“2
缩放
*索引+基本”的地址生成)。
[0088]
位移字段662a-其内容用作存储器地址生成的部分(例如用于使用“2
缩放
*索引+基本+位移”的地址生成)。
[0089]
位移因子字段662b(注意:位移字段662a直接并置在位移因子字段662b之上指示使用一个或另一个)——其内容用作地址生成的部分;其指定将按存储器访问的大小(n)缩放的位移因子——其中n是存储器访问中的字节数(例如用于使用“2
缩放
*索引+基本+缩放的位移”的地址生成)。冗余低阶位被忽略,并且所以位移因子字段的内容乘存储器操作数总大小(n),以便生成将在计算有效地址时使用的最终位移。基于完整操作码字段674(本文中稍后描述)和数据操纵字段654c,在运行时间时由处理器硬件确定n的值。在它们不用于无存储器访问605指令模板和/或不同的实施例可实现两者中的仅仅一个或者两个都不实现的意义上,位移字段662a和位移因子字段662b是可选的。
[0090]
数据元素宽度字段664-其内容区分将使用许多数据元素宽度中的哪一个(在一些实施例中用于所有指令;在其它实施例中仅仅用于指令中的一些)。在如果支持仅仅一个数据元素宽度和/或使用操作码的某个方面支持数据元素宽度则不需要该字段的意义上,该字段是可选的。
[0091]
写入掩码字段670-在每个数据元素位置的基础上,其内容控制目的地向量操作数中的数据元素位置是否反映基本操作和增强操作的结果。a类指令模板支持合并写入掩蔽,而b类指令模板支持合并和归零写入掩蔽两者。当合并时,向量掩码允许在任何操作的执行(由基本操作和增强操作指定)期间防止更新目的地中的任何元素集合;在另一个实施例中,保留目的地的每个元素的旧值,其中对应的掩码位具有0。相反,当归零向量掩码允许在任何操作(由基本操作和增强操作指定)的执行期间清零目的地中的任何元素集合;在一个实施例中,当对应的掩码位具有0值时,目的地的元素被设置成0。该功能性的一个子集是控
制正被执行的操作的向量长度(也就是说,正被从第一个到最后一个修改的元素的范围)的能力;然而,修改的元素不一定是连续的。因此,写入掩码字段670允许包括加载、存储、算术、逻辑等等的部分向量运算。虽然描述本公开的实施例,其中写入掩码字段的670内容选择包含待使用的写入掩码的许多写入掩码寄存器中的一个(并且因此写入掩码字段的670内容间接地标识待执行的掩蔽),但是替代实施例相反或另外允许掩码写入字段的670内容直接指定待执行的掩蔽。
[0092]
立即字段672-其内容允许立即的规范。在该字段不存在于不支持立即的通用向量友好格式的实现方式中并且该字段不存在于不使用立即的指令中的意义上,该字段是可选的。
[0093]
类字段668-其内容区分不同类的指令。参照图6a-b,该字段的内容在a类和b类指令之间选择。在图6a-b中,舍入角的正方形用于指示特定值存在于字段(例如,分别在图6a-b中用于类字段668的a类 668a和b类 668b)中。
[0094]
a类的指令模板在a类的非存储器访问605指令模板的情况下,α字段652被解释为rs字段652a,其内容区分将执行不同的增强操作类型中的哪一个(例如分别为无存储器访问、舍入类型操作610和无存储器访问、数据变换类型操作615指令模板指定舍入652a.1和数据变换652a.2),而β字段654区分将执行指定类型的操作中的哪一个。在无存储器访问605指令模板中,不存在缩放字段660、位移字段662a和位移缩放字段662b。
[0095]
无存储器访问指令模板-完整舍入控制类型操作在无存储器访问完整舍入控制类型操作610指令模板中,β字段654被解释为舍入控制字段654a,其一个或多个内容提供静态舍入。虽然在本公开的所述实施例中,舍入控制字段654a包括抑制所有浮点异常(sae)字段656和舍入操作控制字段658,但是替代实施例可支持、可将这两个概念编码成相同字段,或者仅仅具有这些概念/字段中的一个或另一个(例如可仅仅具有舍入操作控制字段658)。
[0096]
sae字段656-其内容区分是否禁用异常事件报告;当sae字段的656内容指示使能抑制时,给定的指令不报告任何类型的浮点异常标志,并且不引发任何浮点异常处理程序(handler)。
[0097]
舍入操作控制字段658-其内容区分将执行舍入操作的分组中的哪一个(例如上舍入、下舍入、朝零舍入以及舍入到最接近)。因此,舍入操作控制字段658允许在每个指令的基础上舍入模式的改变。在其中处理器包括用于指定舍入模式的控制寄存器的本公开的一个实施例中,舍入操作控制字段的650内容覆盖该寄存器值。
[0098]
无存储器访问指令模板-数据变换类型操作在无存储器访问数据变换类型操作615指令模板中,β字段654被解释为数据变换字段654b,其内容区分将执行许多数据变换中的哪一个(例如无数据变换、拌和(swizzle)、广播)。
[0099]
在a类的存储器访问620指令模板的情况下,α字段652被解释为驱逐提示字段652b,其内容区分将使用驱逐提示中的哪一个(在图6a中,分别为存储器访问、暂时625指令模板和存储器访问、非暂时630指令模板指定暂时652b.1和非暂时652b.2),而β字段654被解释为数据操纵字段654c,其内容区分将执行许多数据操纵操作(也被称为基元)中的哪一
个(例如无操纵;广播;源的上转换;以及目的地的下转换)。存储器访问620指令模板包括缩放字段660,并且可选地包括位移字段662a或位移缩放字段662b。
[0100]
向量存储器指令用转换支持执行从存储器的向量加载和到存储器的向量存储。与常规向量指令一样,向量存储器指令以数据元素的方式(data element-wise fashion)从/向存储器传送数据,同时实际传送的元素由被选为写入掩码的向量掩码的内容规定。
[0101]
存储器访问指令模板-暂时暂时数据是将可能被足够快地重新使用以从高速缓存受益的数据。然而,这是提示,并且不同的处理器可按不同的方式实现它,包括完全忽略提示。
[0102]
存储器访问指令模板-非暂时非暂时数据是将不太可能被足够快地重新使用以从一级高速缓存中的高速缓存受益并且应当被给予驱逐优先权的数据。然而,这是提示,并且不同的处理器可按不同的方式实现它,包括完全忽略提示。
[0103]
b类的指令模板在b类的指令模板的情况下,α字段652被解释为写入掩码控制(z)字段652c,其内容区分由写入掩码字段670控制的写入掩蔽应当是合并还是归零。
[0104]
在b类的非存储器访问605指令模板的情况下,β字段654的一部分被解释为rl字段657a,其内容区分将执行不同的增强操作类型中的哪一个(例如分别为无存储器访问、写入掩码控制、部分舍入控制类型操作612指令模板和无存储器访问、写入掩码控制、vsize类型操作617指令模板指定舍入657a.1和向量长度(vsize)657a.2),而β字段654的其余部分区分将执行指定类型的操作中的哪一个。在无存储器访问605指令模板中,不存在缩放字段660、位移字段662a和位移缩放字段662b。
[0105]
在无存储器访问、写入掩码控制、部分舍入控制类型操作610指令模板中,β字段654的其余部分被解释为舍入操作字段659a,并且异常事件报告被禁用(给定的指令不报告任何类型的浮点异常标志,并且不引发任何浮点异常处理程序)。
[0106]
舍入操作控制字段659a-就像舍入操作控制字段658一样,其内容区分将执行舍入操作的分组中的哪一个(例如上舍入、下舍入、朝零舍入以及舍入到最接近)。因此,舍入操作控制字段659a允许在每个指令的基础上的舍入模式的改变。在其中处理器包括用于指定舍入模式的控制寄存器的本公开的一个实施例中,舍入操作控制字段的650内容覆盖该寄存器值。
[0107]
在无存储器访问、写入掩码控制、vsize类型操作617指令模板中,β字段654的其余部分被解释为向量长度字段659b,其内容区分将在许多数据向量长度(例如128、256或512字节)中的哪一个上执行。
[0108]
在b类的存储器访问620指令模板的情况下,β字段654的部分被解释为广播字段657b,其内容区分是否将执行广播类型数据操纵操作,而β字段654的其余部分被解释为向量长度字段659b。存储器访问620指令模板包括缩放字段660,并且可选地包括位移字段662a或位移缩放字段662b。
[0109]
关于通用向量友好指令格式600,完整操作码字段674被示出为包括格式字段640、基本操作字段642和数据元素宽度字段664。虽然示出其中完整操作码字段674包括所有这些字段的一个实施例,但是在不支持它们中的所有的实施例中,完整操作码字段674包括少
于所有这些字段。完整操作码字段674提供操作代码(操作码)。
[0110]
增强操作字段650、数据元素宽度字段664和写入掩码字段670允许在每个指令的基础上以通用向量友好指令格式指定这些特征。
[0111]
写入掩码字段和数据元素宽度字段的组合创建类型化指令,因为它们允许基于不同的数据元素宽度来应用掩码。
[0112]
在a类和b类内发现的各种指令模板在不同情况下是有益的。在本公开的一些实施例中,处理器内的不同处理器或不同核可支持仅仅a类、仅仅b类或两类。例如,旨在用于通用计算的高性能通用无序核可仅仅支持b类,旨在主要用于图形和/或科学(吞吐量)计算的核可仅仅支持a类,并且旨在用于两者的核可支持两者(当然,具有来自两类的模板和指令的某种混合而不是来自两类的所有模板和指令的核在本公开的范围内)。此外,单个处理器可包括多个核,所有的多个核都支持相同的类,或者其中不同的核支持不同的类。例如,在具有分离的图形和通用核的处理器中,旨在主要用于图形和/或科学计算的图形核中的一个可仅仅支持a类,而通用核中的一个或多个可以是高性能通用核,其具有旨在用于仅仅支持b类的通用计算的无序执行和寄存器重命名。不具有分离的图形核的另一个处理器可包括支持a类和b类两者的一个或多个通用的有序或无序核。当然,在本公开的不同实施例中,来自一个类的特征也可被实现在其它类中。以高级语言编写的程序将被放(例如及时编译或静态编译)到各种不同的可执行表格中,所述表格包括:1)仅仅具有由目标处理器支持的一个或多个类的指令以用于执行的表格;或者2)具有使用所有类的指令的不同组合写入的替代例程并且具有基于由当前正在执行代码的处理器支持的指令来选择例程以执行的控制流程代码的表格。
[0113]
示范性特定向量友好指令格式图7是图示根据本公开的实施例的示范性特定向量友好指令格式的框图。图7示出特定向量友好指令格式700,在其指定字段的位置、大小、解释和次序以及用于那些字段中的一些的值的意义上,该格式是特定的。特定向量友好指令格式700可用于扩展x86指令集,并且因此字段中的一些与在现有的x86指令集及其扩展(例如avx)中使用的字段相似或相同。该格式与具有扩展(extension)的现有的x86指令集的前缀编码字段、真实操作码字节字段、mod r/m字段、sib字段、位移字段和立即字段保持一致。图示来自图7的字段映射到其中的来自图6的字段。
[0114]
应当理解:虽然为了说明的目的而在通用向量友好指令格式600的上下文中参照特定向量友好指令格式700描述本公开的实施例,但是本公开不限于特定向量友好指令格式700(除了在要求保护的情况下之外)。例如,通用向量友好指令格式600设想用于各种字段的各种可能的大小,而特定向量友好指令格式700被示为具有特定大小的字段。通过特定示例,虽然数据元素宽度字段664被图示为特定向量友好指令格式700中的一个位字段,但是本公开不限于此(也就是说,通用向量友好指令格式600设想其它大小的数据元素宽度字段664)。
[0115]
通用向量友好指令格式600包括以下以图7a中图示的次序列出的下面的字段。
[0116]
evex前缀(字节0-3)702-以四字节形式来编码。
[0117]
格式字段640(evex字节0,位[7:0])-第一字节(evex字节0)是格式字段640,并且其包含0x62(用于区分本公开的一个实施例中的向量友好指令格式的唯一的值)。
[0118]
第二至第四字节(evex字节1-3)包括提供特定能力的许多位字段。
[0119]
rex字段705(evex字节1,位[7-5])-由evex.r位字段(evex字节1,位[7]-r)、evex.x位字段(evex字节1,位[6]-x)和657bex字节1,位[5]-b)组成。evex.r、evex.x和evex.b位字段提供与对应的vex位字段相同的功能性,并且使用1s补码形式来编码,即zmm0被编码为1111b,zmm15被编码为0000b。指令的其它字段编码本领域中已知的寄存器索引的低3位(rrr、xxx和bbb),使得可通过添加evex.r、evex.x、evex.b来形成rrrr、xxxx和bbbb。
[0120]
rex’字段610-其是rex’字段610的第一部分,并且是用于编码扩展的32寄存器组中或者高16或者低16的evex.r’位字段(evex字节1,位[4]-r’)。在本公开的一个实施例中,该位以及如以下所指示的其它位以位反转格式来存储,以区分(在公知的x86 32位模式中)其真实操作码字节为62的bound指令,但是在mod r/m字段(以下所述)中不接受mod字段中的值11;本公开的替代实施例不存储这个和以下以反转格式的其它指示的位。值1用于编码低16个寄存器。换句话说,r’rrrr是通过组合evex.r’、evex.r和来自其它字段的其它rrr形成的。
[0121]
操作码映射字段715(evex字节1,位[3:0]-mmmm)-其内容编码隐含的前导操作码字节(0f、0f 38或0f 3)。
[0122]
数据元素宽度字段664(evex字节2,位[7]-w)-由符号evex.w表示。evex.w用于定义数据类型(或者32位数据元素或者64位数据元素)的粒度(大小)。
[0123]
evex.vvvv720(evex字节2,位[6:3]-vvvv)-evex.vvvv的作用可包括以下:1)evex.vvvv编码以反转(1s补码)形式指定的第一源寄存器操作数,并且对于具有2个或更多个源操作数的指令有效;2)evex.vvvv编码以1s补码形式指定的用于某些向量移位的目的地寄存器操作数;或者3)evex.vvvv不编码任何操作数,该字段被保留并且应当包含1111b。因此,evex.vvvv字段720编码以反转(1s补码)形式存储的第一源寄存器说明符的4个低阶位。取决于指令,额外不同的evex位字段用于将说明符大小扩展到32个寄存器。
[0124]
evex.u 668类字段(evex字节2,位[2]-u)-如果evex.u=0,其指示a类或evex.u0;如果evex.u=1,其指示b类或evex.u1。
[0125]
前缀编码字段725(evex字节2,位[1:0]-pp)-为基本操作字段提供附加位。除了为以evex前缀格式的传统sse指令提供支持之外,这还具有压缩simd前缀的益处(而不是要求一个字节来表达simd前缀,evex前缀仅仅需要2位)。在一个实施例中,为了支持使用以传统格式和以evex前缀格式两者的simd前缀(66h、f2h、f3h)的传统sse指令,这些传统simd前缀被编码到simd前缀编码字段中;并且在被提供给解码器的pla之前在运行时间被扩展到传统simd前缀中(所以pla可执行这些传统指令的传统和evex格式两者而无需修改)。虽然较新的指令可能将evex前缀编码字段的内容直接用作操作码扩展,但是为了一致性,某些实施例以类似的方式扩展,但允许不同的含义由这些传统simd前缀指定。替代实施例可重新设计pla以支持2位simd前缀编码,并且因此不需要扩展。
[0126]
α字段652(evex字节3,位[7]-eh;也被称为evex.eh,evex.rs,evex.rl,evex.写入掩码控制和evex.n;也用α来图示)-如先前所述,该字段是上下文特定的。
[0127]
β字段654(evex字节3,位[6:4]-sss,也被称为evex.s
2-0
,evex.r
2-0
,evex.rr1,evex.ll0,evex.llb;也用βββ来图示)-如先前所述,该字段是上下文特定的。
[0128]
rex’字段610-这是rex’字段的剩余部分,并且是可用于编码扩展的32寄存器组的
或者高16或者低16的evex.v’位字段(evex字节3,位[3]-v’)。该位以位反转格式来存储。值1可用于编码低16个寄存器。换句话说,v’vvvv是通过组合evex.v’、evex.vvvv形成的。
[0129]
写入掩码字段670(evex字节3,位[2:0]-kkk)-其内容指定如先前所述的在写入掩码寄存器中的寄存器的索引。在本公开的一个实施例中,特定值evex.kkk=000具有暗示没有写入掩码用于特殊指令的专门行为(这可按各种方式来实现,包括使用硬连线到所有一的写入掩码或绕过掩蔽硬件的硬件)。
[0130]
真实操作码字段730(字节4)也被称为操作码字节。在此字段中指定操作码的部分。
[0131]
mod r/m字段740(字节5)包括mod字段742、寄存器字段744和r/m字段746。如先前所述,mod字段的742内容区分存储器访问与非存储器访问操作。寄存器字段744的作用可被归纳为两种情况:编码或者目的地寄存器操作数或者源寄存器操作数,或被视为操作码扩展,并且不用于编码任何指令操作数。r/m字段746的作用可包括以下:编码参考存储器地址的指令操作数,或编码或者目的地寄存器操作数或者源寄存器操作数。
[0132]
缩放、索引、基本(sib)字节(字节6)-如先前所述,缩放字段的650内容用于存储器地址生成。sib.xxx754和sib.bbb756-这些字段的内容先前已经被提及关于寄存器索引xxxx和bbbb。
[0133]
位移字段662a(字节7-10)-当mod字段742包含10时,字节7-10是位移字段662a,并且它与传统32位位移(disp32)相同地工作,并且以字节粒度工作。
[0134]
位移因子字段662b(字节7)-当mod字段742包含01时,字节7是位移因子字段662b。该字段的位置与以字节粒度工作的传统x86指令集8位位移(disp8)的位置相同。由于disp8是扩展的符号,它仅仅可以在-128与127字节偏移之间寻址;在64字节高速缓存行方面,disp8使用8位,8位可以被设置成仅仅四个真正有用的值-128、-64、0和64;由于往往需要更大的范围,所以使用disp32;然而,disp32需要4个字节。与disp8和disp32对比,位移因子字段662b是disp8的重新解释;当使用位移因子字段662b时,实际位移由位移因子字段的内容乘存储器操作数访问的大小(n)确定。这种类型的位移被称为disp8*n。这减少平均指令长度(用于位移但是具有更大范围的单个字节)。这样压缩的位移基于有效位移是存储器访问的粒度的倍数的假设,并且所以不需要编码地址偏移的冗余低阶。换句话说,位移因子字段662b替换传统x86指令集8位位移。因此,用与x86指令集8位位移相同的方式编码位移因子字段662b(所以modrm/sib编码规则中没有变化),仅仅除了disp8被超载到disp8*n之外。换句话说,在编码规则或编码长度时不存在变化,但是仅仅在由硬件(其需要将位移缩放存储器操作数的大小来获得字节地址偏移)解释位移值时才存在变化。立即字段672如先前所述地操作。
[0135]
完整操作码字段图7b是图示根据本公开的一个实施例的组成完整操作码字段674的特定向量友好指令格式700的字段的框图。具体地,完整操作码字段674包括格式字段640、基本操作字段642和数据元素宽度(w)字段664。基本操作字段642包括前缀编码字段725、操作码映射字段715和真实操作码字段730。
[0136]
寄存器索引字段图7c是图示根据本公开的一个实施例的组成寄存器索引字段644的特定向量友好指令
格式700的字段的框图。具体地,寄存器索引字段644包括rex字段705、rex’字段710、mod r/m.reg字段744、modr/m.r/m字段746、vvvv字段720、xxx字段754和bbb字段756。
[0137]
增强操作字段图7d是图示根据本公开的一个实施例的组成增强操作区域650的特定向量友好指令格式700的字段的框图。当类(u)字段668包含0时,其象征evex.u0(a类 668a);当其包含1时,其象征evex.u1(b类 668b)。当u=0并且mod字段742包含11(象征无存储器访问操作)时,α字段652(evex字节3,位[7]-eh)被解释为rs字段652a。当rs字段652a包含1(舍入652a.1)时,β字段654(evex字节3,位[6:4]-sss)被解释为舍入控制字段654a。舍入控制字段654a包括一位sae字段656和两位舍入操作字段658。当rs字段652a包含0(数据变换652a.2)时,β字段654(evex字节3,位[6:4]-sss)被解释为三位数据变换字段654b。当u=0并且mod字段742包含00、01或10(象征存储器访问操作)时,α字段652(evex字节3,位[7]-eh)被解释为驱逐提示(eh)字段652b,并且β字段654(evex字节3,位[6:4]-sss)被解释为三位数据操纵字段654c。
[0138]
当u=1时,α字段652(evex字节3,位[7]-eh)被解释为写入掩码控制(z)字段652c。当u=1并且mod字段742包含11(象征无存储器访问操作)时,β字段654的部分(evex字节3,位[4]-s0)被解释为rl字段657a;当其包含1(舍入657a.1)时,β字段654的其余部分(evex字节3,位[6-5]-s
2-1
)被解释为舍入操作字段659a,而当rl字段657a包含0(vsize 657.a2)时,β字段654的其余部分(evex字节3,位[6-5]-s
2-1
)被解释为向量长度字段659b(evex字节3,位[6-5]-l
1-0
)。当u=1并且mod字段742包含00、01或10(象征存储器访问操作)时,β字段654(evex字节3,位[6:4]-sss)被解释为向量长度字段659b(evex字节3,位[6-5]-l
1-0
)和广播字段657b(evex字节3,位[4]-b)。
[0139]
示范性寄存器架构图8是根据本公开的一个实施例的寄存器架构800的框图。在所图示的实施例中,存在32个512位宽的向量寄存器810;这些寄存器被标注为zmm0至zmm31。低16个zmm寄存器的低阶256位覆盖在寄存器ymm0-16上。低16个zmm寄存器的低阶128位(ymm寄存器的低阶128位)覆盖在寄存器xmm0-15上。特定向量友好指令格式700对如在以下表中图示的这些重叠的寄存器文件进行操作。
[0140]
换句话说,向量长度字段659b在最大长度与一个或多个其它较短长度之间选择,其中每个这样的较短长度是前述长度的长度的一半;并且没有向量长度字段659b的指令模板对最大向量长度进行操作。此外,在一个实施例中,特定向量友好指令格式700的b类指令模板对打包或标量单/双精度浮点数据和打包或标量整数数据进行操作。标量操作是在zmm/ymm/xmm寄存器中的最低阶数据元素位置上执行的操作;较高阶数据元素位置或者被保留为与它们在指令之前相同,或者被归零,这取决于实施例。
[0141]
写入掩码寄存器815-在图示的实施例中,存在8个写入掩码寄存器(k0至k7),每个为64位大小。在替代实施例中,写入掩码寄存器815为16位大小。如先前所述,在本公开的一个实施例中,向量掩蔽寄存器k0不可以用作写入掩码;当将通常指示k0的编码用于写入掩码时,其选择0xffff的硬连线写入掩码,有效地为该指令禁用写入掩码。
[0142]
通用寄存器825-在图示实施例中,存在16个64位通用寄存器,该通用寄存器与现有的x86寻址模式一起用于寻址存储器操作数。这些寄存器由名称rax、rbx、rcx、rdx、rbp、rsi、rdi、rsp和r8至r15标注。
[0143]
标量浮点堆栈寄存器文件(x87堆栈)845,在其上混叠mmx打包整数平坦寄存器文件850-在图示实施例中,x87堆栈是用于使用x87指令集扩展执行关于32/64/80位浮点数据的标量浮点运算的八元素堆栈;而mmx寄存器用于执行关于64位打包整数数据的操作,以及为在mmx与xmm寄存器之间执行的一些操作保持操作数。
[0144]
本公开的替代实施例可使用更宽或更窄的寄存器。另外,本公开的替代实施例可使用更多、更少或不同的寄存器文件和寄存器。
[0145]
示范性核架构、处理器和计算机架构可以不同的方式、为了不同的目的和在不同的处理器中实现处理器核。例如,这样的核的实现方式可包括:1)旨在用于通用计算的通用有序核;2)旨在用于通用计算的高性能通用无序核;3)旨在主要用于图形和/或科学(吞吐量)计算的专用核。不同处理器的实现方式可包括:1)cpu,包括旨在用于通用计算的一个或多个通用有序核和/或旨在用于通用计算的一个或多个通用无序核;以及2)协处理器,包括旨在主要用于图形和/或科学(吞吐量)的一个或多个专用核。这样的不同处理器导致不同的计算机系统架构,其可包括:1)在与cpu分离的芯片上的协处理器;2)在与cpu相同的封装中的分离的管芯上的协处理器;3)在与cpu相同的管芯上的协处理器(在这种情况下,这样的协处理器有时被称为专用逻辑,诸如集成图形和/或科学(吞吐量)逻辑,或者被称为专用核);以及4)片上系统,其可包括在相同管芯上的所述cpu(有时被称为一个或多个应用核或一个或多个应用处理器)、上述协处理器和附加功能性。接下来描述示范性核架构,之后跟随示范性处理器和计算机架构的描述。
[0146]
示范性核架构有序和无序核框图图9a是图示根据本公开的实施例的示范性有序流水线和示范性寄存器重命名、无序发布/执行流水线两者的框图。图9b是图示根据本公开的实施例的将包括在处理器中的有序架构核的示范性实施例和示范性寄存器重命名、无序发布/执行架构核两者的框图。图9a-b中的实线框图示有序流水线和有序核,而虚线框的可选添加图示寄存器重命名、无序发布/执行流水线和核。假定有序方面是无序方面的子集,将描述无序方面。
[0147]
在图9a中,处理器流水线900包括提取级902、长度解码级904、解码级906、分配级
908、重命名级910、调度(也被称为分派或发布)级912、寄存器读取/存储器读取级914、执行级916、反写/存储器写入级918、异常处理级922和提交级924。
[0148]
图9b示出处理器核990,处理器核990包括耦合到执行引擎单元950的前端单元930,并且引擎单元950和前端单元930两者都耦合到存储器单元970。核990可以是精简指令集计算(risc)核、复杂指令集计算(cisc)核、超长指令字(vliw)核或者混合或替代核类型。作为又一个选择,核990可以是专用核,诸如例如网络或通信核、压缩引擎、协处理器核、通用计算图形处理单元(gpgpu)核、图形核等等。
[0149]
前端单元930包括耦合到指令高速缓存单元934的分支预测单元932,该指令高速缓存单元934耦合到指令转换后备缓冲器(tlb)936,该指令转换后备缓冲器(tlb)936耦合到指令提取单元938,该指令提取单元938耦合到解码单元940。解码单元940(或解码器或解码器单元)可解码指令(例如宏指令),并且生成从原始指令解码或以其它方式反映原始指令或衍生自原始指令的一个或多个微操作、微代码入口点、微指令、其它指令或其它控制信号作为输出。解码单元940可使用各种不同的机制来实现。合适的机制的示例包括但不限于查找表、硬件实现方式、可编程逻辑阵列(pla)、微代码只读存储器(rom)等等。在一个实施例中,核990包括为某些宏指令存储微代码的微代码rom或其它介质(例如在解码单元940中或以其它方式在前端单元930内)。解码单元940耦合到执行引擎单元950中的重命名/分配器单元952。
[0150]
执行引擎单元950包括重命名/分配器单元952,该重命名/分配器单元952耦合到退出单元954以及一个或多个调度器单元956的集合。一个或多个调度器单元956表示任何数量的不同调度器,包括保留站、中央指令窗口等等。一个或多个调度器单元956耦合到一个或多个物理寄存器文件单元958。一个或多个物理寄存器文件单元958中的每一个表示一个或多个物理寄存器文件,其中的不同的物理寄存器文件存储一个或多个不同的数据类型,诸如标量整数、标量浮点、打包整数、打包浮点、向量整数、向量浮点、状态(例如指令指针,其是待执行的下一条指令的地址)等等。在一个实施例中,一个或多个物理寄存器文件单元958包括向量寄存器单元、写入掩码寄存器单元和标量寄存器单元。这些寄存器单元可提供架构向量寄存器、向量掩码寄存器和通用寄存器。一个或多个物理寄存器单元958由退出单元954重叠以图示可以其实现寄存器重命名和无序执行的各种方式(例如使用一个或多个重新排序缓冲器和一个或多个退出寄存器文件;使用一个或多个未来文件、一个或多个历史缓冲器以及一个或多个退出寄存器文件;使用寄存器映射和寄存器池;等等)。退出单元954和一个或多个物理寄存器文件单元958耦合到一个或多个执行群集960。一个或多个执行群集960包括一个或多个执行单元962的集合以及一个或多个存储器访问单元964的集合。执行单元962可执行各种操作(例如移位、加法、减法、乘法),并对各种类型的数据(例如标量浮点、打包整数、打包浮点、向量整数、向量浮点)进行操作。虽然一些实施例可包括专用于特定功能或功能集合的许多执行单元,但是其它实施例可仅仅包括一个执行单元或者全部执行所有功能的多个执行单元。一个或多个调度器单元956、一个或多个物理寄存器文件单元958和一个或多个执行群集960被示为可能是复数的,因为某些实施例为某些类型的数据/操作创建分离的流水线(例如各自具有它们自己的调度器单元、一个或多个物理寄存器文件单元和/或执行群集的标量整数流水线、标量浮点/打包整数/打包浮点/向量整数/向量浮点流水线和/或存储器访问流水线-并且在分离的存储器访问流水线的情况下,
实现其中仅仅该流水线的执行群集具有一个或多个存储器访问单元964的某些实施例)。还应当理解:在使用分离的流水线的情况下,这些流水线中的一个或多个可以是无序发布/执行,并且其余的是有序的。
[0151]
存储器访问单元964的集合耦合到存储器单元970,该存储器单元970包括耦合到数据高速缓存单元974的数据tlb单元972,该数据高速缓存单元974耦合到2级(l2)高速缓存单元976。在一个示范性实施例中,存储器访问单元964可包括加载单元、存储地址单元和存储数据单元,其中的每一个都耦合到存储器单元970中的数据tlb单元972。指令高速缓存单元934进一步耦合到存储器单元970中的2级(l2)高速缓存单元976。l2高速缓存单元976耦合到一个或多个其它级的高速缓存并且最终耦合到主存储器。
[0152]
通过示例的方式,示范性寄存器重命名、无序发布/执行核架构可如下实现流水线900:1)指令提取938执行提取和长度解码级902和904;2)解码单元940执行解码级906;3)重命名/分配器单元952执行分配级908和重命名级910;4)一个或多个调度器单元956执行调度级912;5)一个或多个物理寄存器文件单元958和存储器单元970执行寄存器读取/存储器读取级914;执行群集960执行执行级916;6)存储器单元970和一个或多个物理寄存器文件单元958执行反写/存储器写入级918;7)各种单元可涉及异常处理级922;以及8)退出单元954和一个或多个物理寄存器文件单元958执行提交级924。
[0153]
核990可支持一个或多个指令集(例如x86指令集(具有已经添加有较新版本的一些扩展);ca sunnyvale的mips technologies的mips指令集;ca sunnyvale的arm holdings的arm指令集(具有可选的附加扩展,诸如neon),包括本文所述的一个或多个指令。在一个实施例中,核990包括逻辑以支持打包数据指令集扩展(例如avx、avx2),从而允许使用打包数据执行由许多多媒体应用使用的操作。
[0154]
应当理解:核可支持进行多线程(执行两个或更多个并行组的操作或线程),并且可按各种方式这样做,各种方式包括时分片进行多线程、同时进行多线程(其中单个物理核为物理核正在同时进行多线程的线程中的每一个提供逻辑核)或其组合(例如其后的时分片提取和解码以及同时进行多线程,诸如在intel
®ꢀ
hyperthreading技术中)。
[0155]
虽然在无序执行的上下文中描述寄存器重命名,但是应当理解:寄存器重命名可用在有序架构中。虽然处理器的图示的实施例还包括分离的指令和数据高速缓存单元934/974以及共享的l2高速缓存单元976,但是替代实施例可具有用于指令和数据两者的单个内部高速缓存,诸如例如1级(l1)内部高速缓存,或者多级内部高速缓存。在一些实施例中,系统可包括内部高速缓存和在核和/或处理器外部的外部高速缓存的组合。替代地,所有高速缓存可在核和/或处理器外部。
[0156]
特定的示范性有序核架构图10a-b图示更特定的示范性有序核架构的框图,该核将是芯片中的几个逻辑块(包括相同类型和/或不同类型的其它核)之一。逻辑块通过高带宽互连网络(例如环形网络)与某个固定功能逻辑、存储器i/o接口和其它必要i/o逻辑通信,这取决于应用。
[0157]
图10a是根据本公开的实施例的单个处理器核、连同其到管芯上互连网络1002的连接并且连同2级(l2)高速缓存1004的其本地子集的框图。在一个实施例中,指令解码单元1000支持具有打包数据指令集扩展的x86指令集。l1高速缓存1006允许对高速缓存存储器到标量和向量单元中的低延迟访问。虽然在一个实施例中(为了简化设计),标量单元1008
n之间保持一致性。
[0163]
在一些实施例中,核1102a-n中的一个或多个能够进行多线程。系统代理1110包括协调和操作核1102a-n的那些组件。系统代理单元1110例如可包括功率控制单元(pcu)和显示单元。pcu可以是或包括用于调节核1102a-n和集成图形逻辑1108的功率状态所需的逻辑和组件。显示单元用于驱动一个或多个外部连接的显示器。
[0164]
在架构指令集方面,核1102a-n可以是同质的或异质的;也就是说,核1102a-n中的两个或更多个可能能够执行相同的指令集,而其它的可能仅仅能够执行该指令集的子集或不同的指令集。
[0165]
示范性计算机架构图12、13、14和15是示范性计算机架构的框图。本领域中已知的用于膝上型电脑、台式机、手持pc、个人数字助理、工程工作站、服务器、网络设备、网络集线器、交换机、嵌入式处理器、数字信号处理器(dsp)、图形设备、视频游戏设备、机顶盒、微控制器、蜂窝电话、便携式媒体播放器、手持设备和各种其它电子设备的其它系统设计和配置也是合适的。通常,能够并入如本文所公开的处理器和/或其它执行逻辑的各种各样的系统或电子设备通常是合适的。
[0166]
现在参考图12,示出根据本公开的一个实施例的系统1200的框图。系统1200可包括耦合到控制器集线器1220的一个或多个处理器1210、1215。在一个实施例中,控制器集线器1220包括图形存储器控制器集线器(gmch)1290和输入/输出集线器(ioh)1250(其可在分离的芯片上);gmch 1290包括存储器1240和协处理器1245所耦合到的存储器和图形控制器;ioh 1250将输入/输出(i/o)设备1260耦合到gmch 1290。替代地,存储器和图形控制器中的一个或两个集成在处理器内(如本文所述),存储器1240和协处理器1245直接耦合到处理器1210和控制器集线器1220(在单个芯片中具有ioh 1250)。
[0167]
附加处理器1215的可选性质在图12中用虚线标志。每个处理器1210、1215可包括本文所述的处理核中的一个或多个,并且可以是处理器1100的某个版本。
[0168]
存储器1240例如可以是动态随机存取存储器(dram)、相变存储器(pcm)或两者的组合。对于至少一个实施例,控制器集线器1220经由诸如前端总线(fsb)之类的多点总线、诸如快速路径互连(qpi)之类的点对点接口或者类似的连接1295来与一个或多个处理器1210、1215通信。
[0169]
在一个实施例中,协处理器1245是专用处理器,诸如例如高吞吐量mic处理器、网络或通信处理器、压缩引擎、图形处理器、gpgpu、嵌入式处理器等等。在一个实施例中,控制器集线器1220可包括集成图形加速器。
[0170]
在包括架构、微架构、热量、功耗特性等等的指标的一系列度量方面,在物理资源1210、1215之间可能存在各种差异。
[0171]
在一个实施例中,处理器1210执行控制通常类型的数据处理操作的指令。指令内嵌入的可以是协处理器指令。处理器1210将这些协处理器指令识别为是应当由附连的协处理器1245执行的类型。相应地,处理器1210在协处理器总线或其它互连上将这些协处理器指令(或表示协处理器指令的控制信号)发布给协处理器1245。一个或多个协处理器1245接受并执行接收的协处理器指令。
[0172]
现在参考图13,示出根据本公开的实施例的第一更特定的示范性系统1300的框
图。如图13中所示,多处理器系统1300是点对点互连系统,并且包括经由点对点互连1350耦合的第一处理器1370和第二处理器1380。处理器1370和1380中的每一个可以是处理器1100的某个版本。在本公开的一个实施例中,处理器1370和1380分别是处理器1210和1215,而协处理器1338是协处理器1245。在另一个实施例中,处理器1370和1380分别是处理器1210、协处理器1245。
[0173]
处理器1370和1380被分别示出包括集成存储器控制器(imc)单元1372和1382。处理器1370还包括点对点(p-p)接口1376和1378作为其总线控制器单元的部分;类似地,第二处理器1380包括p-p接口1386和1388。处理器1370、1380可经由点对点(p-p)接口1350、使用p-p接口电路1378、1388交换信息。如图13中所示,imc 1372和1382将处理器耦合到各自的存储器,即存储器1332和存储器1334,各自的存储器可以是本地附连到各自的处理器的主存储器的部分。
[0174]
处理器1370、1380可各自经由单独的p-p接口1352、1354、使用点对点接口电路1376、1394、1386、1398与芯片组1390交换信息。芯片组1390可经由高性能接口1339可选地与协处理器1338交换信息。在一个实施例中,协处理器1338是专用处理器,诸如例如高吞吐量mic处理器、网络或通信处理器、压缩引擎、图形处理器、gpgpu、嵌入式处理器等等。
[0175]
共享高速缓存(未示出)可包括在任一处理器中或两个处理器的外部,但经由p-p互连与处理器连接,使得如果处理器被置于低功耗模式中,任一个或两个处理器的本地高速缓存信息可存储在共享高速缓存中。
[0176]
芯片组1390可经由接口1396耦合到第一总线1316。在一个实施例中,第一总线1316可以是外围组件互连(pci)总线,或者诸如pci express总线之类的总线,或者另一个第三代i/o互连总线,但是本公开的范围不限于此。
[0177]
如图13中所示,各种i/o设备1314可连同总线桥1318耦合到第一总线1316,该总线桥1318将第一总线1316耦合到第二总线1320。在一个实施例中,诸如协处理器、高吞吐量mic处理器、gpgpu、加速器(诸如例如图形加速器或数字信号处理(dsp)单元)、现场可编程门阵列或任何其它处理器之类的一个或多个附加处理器1315耦合到第一总线1316。在一个实施例中,第二总线1320可以是低引脚数(lpc)总线。在一个实施例中,各种设备可耦合到第二总线1320,所述设备例如包括键盘和/或鼠标1322、通信设备1327和存储单元1328,该存储单元1328诸如磁盘驱动器或可包括指令/代码和数据1330的其它大容量存储设备。此外,音频i/o 1324可耦合到第二总线1320。注意:其它架构是可能的。例如,代替图13的点对点架构,系统可实现多点总线或其它这样的架构。
[0178]
现在参考图14,示出根据本公开的实施例的第二更特定的示范性系统1400的框图。图13和14中的相同元件具有相同的附图标记,并且已经从图14省略了图13的某些方面,以便避免模糊图14的其它方面。
[0179]
图14图示:处理器1370、1380可分别包括集成存储器和i/o控制逻辑(“cl”)1372和1382。因此,cl 1372、1382包括集成存储器控制器单元并且包括i/o控制逻辑。图14图示:不仅存储器1332、1334耦合到cl 1372、1382,而且i/o设备1414也耦合到控制逻辑1372、1382。传统i/o设备1415耦合到芯片组1390。
[0180]
现在参考图15,示出根据本公开的实施例的soc 1500的框图。图11中的相似元件具有相同的附图标记。此外,虚线框是更先进的soc上的可选特征。在图15中,一个或多个互
连单元1502耦合到:应用处理器1510,其包括一个或多个核202a-n的集合和一个或多个共享高速缓存单元1106;系统代理单元1110;一个或多个总线控制器单元1116;一个或多个集成存储器控制器单元1114;一组或者一个或多个协处理器1520,其可包括集成图形逻辑、图像处理器、音频处理器和视频处理器;静态随机存取存储器(sram)单元1530;直接存储器存取(dma)单元1532;以及用于耦合到一个或多个外部显示器的显示单元1540。在一个实施例中,一个或多个协处理器1520包括专用处理器,诸如例如网络或通信处理器、压缩引擎、gpgpu、高吞吐量mic处理器、嵌入式处理器等等。
[0181]
本文公开的实施例(例如机制)可按硬件、软件、固件或这些实现方法的组合来实现。本公开的实施例可被实现为在可编程系统上执行的计算机程序或程序代码,该可编程系统包括至少一个处理器、存储系统(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备和至少一个输出设备。
[0182]
诸如图13中图示的代码1330之类的程序代码可应用于输入指令以执行本文所述的功能并且生成输出信息。输出信息可按已知的方式应用于一个或多个输出设备。为了本申请的目的,处理系统包括具有处理器的任何系统,该处理器诸如例如;数字信号处理器(dsp)、微控制器、专用集成电路(asic)或微处理器。
[0183]
程序代码可按高级程序或面向对象的编程语言来实现,以与处理系统通信。如果期望的话,程序代码也可按汇编或机器语言实现。事实上,本文所述的机制在范围上不限于任何特殊的编程语言。在任何情况下,语言可以是编译或解释语言。
[0184]
至少一个实施例的一个或多个方面可由存储在机器可读介质上的代表性指令来实现,该机器可读介质表示处理器内的各种逻辑,该逻辑在由机器读取时使得机器制造逻辑以执行本文所述的技术。被称为“ip核”的这样的表示可存储在有形的机器可读介质上,并被供应给各种客户或制造设施以加载到实际制造逻辑或处理器的制造机器中。
[0185]
这样的机器可读存储介质可包括而不限于由机器或设备制造或形成的物品的非暂时的、有形的布置,包括:诸如硬盘的存储介质,任何其它类型的盘(包括软盘、光盘、压缩盘只读存储器(cd-rom)、压缩盘可重写(cd-rw)和磁光盘),半导体器件,诸如只读存储器(rom)、随机存取存储器(ram)(诸如动态随机存取存储器(dram)、静态随机存取存储器(sram))、可擦除可编程只读存储器(eprom)、闪存、电可擦除可编程只读存储器(eeprom)、相变存储器(pcm),磁或光学卡,或者适合于存储电子指令的任何其它类型的介质。
[0186]
相应地,本公开的实施例还包括非暂时的、有形的机器可读介质,该介质包含指令或包含设计数据,诸如定义本文描述的结构、电路、装置、处理器和/或系统特征的硬件描述语言(hdl)。这样的实施例也可被称为程序产品。
[0187]
仿真(包括二进制转换、代码变形等等)在一些情况下,指令转换器可用于将指令从源指令集转换目标指令集。例如,指令转换器可将指令转换(例如使用静态二进制转换、包括动态编译的动态二进制转换)、变形、仿真或以其它方式转换成将由核处理的一个或多个其它指令。指令转换器可按软件、硬件、固件或其组合来实现。指令转换器可在处理器上、在处理器外、或者是处理器上的部件或处理器外的部件。
[0188]
图16是根据本公开的实施例的对比使用软件指令转换器将源指令集中的二进制指令转换成目标指令集中的二进制指令的框图。在图示的实施例中,指令转换器是软件指
令转换器,不过替代地,指令转换器可按软件、固件、硬件或其各种组合来实现。图16示出采用高级语言1602的程序可使用x86编译器1604来编译,以生成可由具有至少一个x86指令集核1616的处理器本地执行的x86二进制代码1606。具有至少一个x86指令集核1616的处理器表示任何处理器,任何处理器可通过兼容地执行或以其它方式处理以下各项来执行与具有至少一个x86指令集核的intel处理器基本上相同的功能:(1)intel x86指令集核的指令集的实质部分,或者(2)应用程序或其它软件的目标代码版本,其目的是在具有至少一个x86指令集核的intel处理器上运行,以便实现与具有至少一个x86指令集核的intel处理器基本上相同的结果。x86编译器1604表示可操作以生成x86二进制代码1606(例如目标代码)的编译器,该x86二进制代码1606可以用或无需附加链接处理来在具有至少一个x86指令集核1616的处理器上被执行。类似地,图16示出:可使用替代指令集编译器1608来编译采用高级语言1602的程序,以生成可由不具有至少一个x86指令集核1614(例如,具有执行ca sunnyvale的mips technologies的mips指令集和/或执行ca sunnyvale的arm holdings的arm指令集的核的处理器)的处理器本地执行的替代指令集二进制代码1610。指令转换器1612用于将x86二进制代码1606转换成可由不具有x86指令集核1614的处理器本地执行的代码。该转换的代码不太可能与替代指令集二进制代码1610相同,因为能够这样的指令转换器难以制作;然而,转换的代码将完成通常操作,并由来自替代指令集的指令组成。因此,指令转换器1612表示通过仿真、模拟或任何其它过程允许处理器或者不具有x86指令集处理器或核的其它电子设备执行x86二进制代码1606的软件、固件、硬件或其组合。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1