用于访问矩阵操作数的多变量跨步读取操作的制作方法

文档序号:24157627发布日期:2021-03-05 12:53阅读:127来源:国知局
用于访问矩阵操作数的多变量跨步读取操作的制作方法

[0001]
本公开总体上涉及矩阵处理系统的领域,并且更具体地但非排他地涉及用于从存储器中提取矩阵操作数的多变量跨步(strided)读取操作。


背景技术:

[0002]
训练人工神经网络和/或使用神经网络执行推理通常需要涉及复杂的矩阵算术(例如许多大的多维度矩阵操作数的矩阵乘法和卷积)的许多计算密集型操作。这些矩阵操作数的存储器布局对于神经网络的整体性能非常重要。在某些情况下,例如,以特定格式存储在存储器中的矩阵操作数可能需要被提取和/或转换为不同格式,以对基础矩阵元素执行某些操作。例如,为了执行某些神经网络操作,矩阵操作数的维度可能需要被重新排列(shuffled)或重新排序,或者矩阵操作数的某些部分可能需要被提取、切片(sliced)、修剪和/或重新排序。在许多计算架构中,这要求将原始矩阵操作数从存储器中完整地读取、转换为适当的格式或顺序、作为新的矩阵操作数存储回存储器中,然后进行操作。这种方法可能效率极低,因为它增大了处理延迟、存储器访问延迟和存储器利用率。


技术实现要素:

[0003]
根据本申请的一方面,提供了一种矩阵处理器,包括:存储器,用于存储矩阵操作数和跨步读取序列,其中:所述矩阵操作数被乱序地存储在所述存储器中;并且所述跨步读取序列包括用于以正确的顺序从所述存储器中读取所述矩阵操作数的读取操作序列;控制电路,用于接收要由所述矩阵处理器执行的第一指令,其中,所述第一指令用于指示所述矩阵处理器对所述矩阵操作数执行第一操作;读取电路,用于基于所述跨步读取序列从所述存储器中读取所述矩阵操作数;以及执行电路,用于通过对所述矩阵操作数执行所述第一操作来执行所述第一指令。
[0004]
根据本申请的另一方面,提供了至少一种非暂态机器可访问存储介质,其上存储有指令,其中,所述指令在机器上被执行时使所述机器:接收要由矩阵处理器执行的第一指令,其中,所述第一指令用于指示所述矩阵处理器对矩阵操作数进行第一操作,其中,所述矩阵操作数被乱序地存储在所述矩阵处理器的存储器中;访问存储在所述存储器中的跨步读取序列,其中,所述跨步读取序列包括用于以正确的顺序从所述存储器中读取所述矩阵操作数的读取操作序列;基于所述跨步读取序列从所述存储器中读取所述矩阵操作数;以及使得所述第一指令由所述矩阵处理器执行,其中,所述第一指令要通过对所述矩阵操作数执行所述第一操作来执行。
[0005]
根据本申请的又一方面,提供了一种方法,包括:接收要由矩阵处理器执行的第一指令,其中,所述第一指令用于指示所述矩阵处理器对矩阵操作数进行第一操作,其中,所述矩阵操作数被乱序地存储在所述矩阵处理器的存储器中;访问存储在所述存储器中的跨步读取序列,其中,所述跨步读取序列包括用于以正确的顺序从所述存储器中读取所述矩阵操作数的读取操作序列;基于所述跨步读取序列从所述存储器中读取所述矩阵操作数;
以及使得所述第一指令由所述矩阵处理器执行,其中,所述第一指令要通过对所述矩阵操作数执行第一操作来执行。
[0006]
根据本申请的再一方面,提供了一种系统,包括:主机处理器;以及矩阵处理器,包括:存储器,用于存储矩阵操作数和跨步读取序列,其中:所述矩阵操作数被乱序地存储在所述存储器中,并且所述跨步读取序列包括用于以正确的顺序从所述存储器中读取所述矩阵操作数的读取操作序列;控制电路,用于接收要由所述矩阵处理器执行的第一指令,其中,所述第一指令用于指示所述矩阵处理器对所述矩阵操作数执行第一操作,并且其中,所述第一指令是要从所述主机处理器接收的;读取电路,用于基于所述跨步读取序列从所述存储器中读取所述矩阵操作数;以及执行电路,用于通过对所述矩阵操作数执行所述第一操作来执行所述第一指令。
附图说明
[0007]
当结合附图阅读时,根据以下详细描述最好地理解本公开。强调的是,根据行业中的标准实践,各种特征不一定按比例绘制,并且仅用于说明目的。在显式地或隐式地示出比例尺处,仅提供一个说明性示例。在其他实施例中,为了清楚的讨论,各种特征的维度可以任意地增大或减小。
[0008]
图1图示矩阵处理系统的示例实施例,该矩阵处理系统利用多变量跨步读取操作从存储器提取矩阵操作数。
[0009]
图2图示以维度71x71、元素类型bfloat16寄存的矩阵操作数的存储器布局的示例。
[0010]
图3图示以维度33
×
33、元素类型sp3寄存的矩阵操作数的存储器布局的示例。
[0011]
图4、5和6a-6b图示多变量跨步读取操作的示例。
[0012]
图7图示多变量跨步读取操作的示例实施例的流程图。
[0013]
图8a-8b是图示根据本公开的实施例的通用向量友好指令格式及其指令模板的框图。
[0014]
图9a-9d是图示根据本公开的实施例的示例性特定向量友好指令格式的框图。
[0015]
图10是根据本公开的一个实施例的寄存器架构的框图。
[0016]
图11a是图示根据本公开的实施例的示例性顺序流水线和示例性寄存器重命名、乱序发布/执行流水线两者的框图。
[0017]
图11b是图示根据本公开的实施例的要被包括在处理器中的顺序架构核的示例性实施例和示例性寄存器重命名、乱序发布/执行架构核两者的框图。
[0018]
图12a-12b图示更具体的示例性顺序核架构的框图,其核是芯片中的多个逻辑块之一(包括相同类型和/或不同类型的其他核)。
[0019]
图13是根据本公开的实施例的可以具有多于一个核、可以具有集成存储器控制器并且可以具有集成图形的处理器的框图。
[0020]
图14、15、16和17是示例性计算机架构的框图。
[0021]
图18是根据本公开的实施例的对照使用软件指令转换器将源指令集中的二进制指令转换为目标指令集中的二进制指令的框图。
具体实施例
[0022]
以下公开提供了用于实现本公开的不同特征的许多不同的实施例或示例。以下描述了组件和布置的特定示例以简化本公开。当然,这些仅是示例,并不旨在进行限制。此外,本公开可以在各个示例中重复附图标记和/或字母。该重复是出于简单和清楚的目的,并且其本身并不指示所讨论的各种实施例和/或配置之间的关系。不同的实施例可以具有不同的优点,并且任何实施例都不一定需要特定的优点。
[0023]
用于提取矩阵操作数的多变量跨步读取操作
[0024]
图1图示矩阵处理系统100的示例实施例,该矩阵处理系统100利用多变量跨步读取操作从存储器提取矩阵操作数。在一些情况下,例如,以特定格式存储在存储器中的矩阵操作数可能需要被提取和/或被转换为不同格式以执行特定的矩阵操作。因此,在所示实施例中,如下面进一步描述的,多变量跨步读取操作可以被执行,从而以特定矩阵操作所需的适当格式或顺序从存储器直接提取矩阵操作数。
[0025]
在所示实施例中,矩阵处理系统100包括经由通信接口或总线130可通信地耦合到主机计算设备120的矩阵处理器110。在一些实施例中,例如,矩阵处理器110可以是被设计为代表主机计算设备120加速人工智能(ai)、机器学习(ml)和/或深度学习(dl)功能的硬件加速器和/或神经网络处理器(nnp),其可以是运行人工智能应用的通用计算平台(例如,英特尔xeon平台)。例如,在一些情况下,矩阵处理器110可以用于代表主机计算设备120训练人工神经网络和/或执行推理,这通常需要要使用复杂矩阵算术(例如许多大的多维度矩阵操作数的矩阵乘法和卷积)来执行的许多计算密集型操作。
[0026]
这些矩阵操作数或张量的存储器布局对于神经网络的整体性能非常重要。在一些情况下,例如,以特定格式存储在存储器中的矩阵操作数可能需要被提取和/或被转换为不同格式以对基础矩阵元素执行某些操作。例如,为了执行某些神经网络操作,矩阵操作数的维度可能需要被重新排列或重新排序,或者矩阵操作数的某些部分可能需要被提取、切片、修剪和/或重新排序。
[0027]
在所示实施例中,例如,多维度矩阵操作数102可以使用直接存储器访问(dma)(例如,通过pcie接口130)以特定格式从主机计算设备120被传送到矩阵处理器110,但是矩阵处理器110可能随后需要将矩阵操作数102变换为另一格式104以执行某些操作。
[0028]
作为示例,对于神经网络的卷积层,用于表示图像数据的矩阵操作数可以在基础存储器布局中被组织为顺序为chw x n的维度,其中:
[0029]
c=通道深度(例如,每个输入图像中的通道数);
[0030]
h=高度(例如,每个输入图像的高度);
[0031]
w=宽度(例如,每个输入图像的宽度);以及
[0032]
n=输入图像的数量(例如,小批量大小)。
[0033]
然而,基于层描述和要执行的运算,矩阵处理器110通常需要在对矩阵操作数进行操作之前对矩阵操作数的维度进行重新排列或重新排序。例如,如果矩阵操作数以chw x n格式驻留在存储器中,则矩阵处理器110可能需要执行维度重新排列以将操作数转换为针对神经网络的特定层的nhw x c格式。
[0034]
作为另一示例,用于表示卷积过滤器集合的矩阵操作数可以在基础存储器布局中被组织为顺序为crs x k的维度,其中:
[0035]
c=通道深度;
[0036]
r=过滤器高度;
[0037]
s=过滤器宽度;以及
[0038]
k=过滤器数量。
[0039]
在一些情况下,矩阵处理器110可能需要卷积过滤器的某些部分以crs x k格式被存储在存储器中,以被提取、切片、修整和/或重新排序为另一格式。
[0040]
在许多计算架构中,对修改后的矩阵操作数执行操作需要从存储器中整体读取原始矩阵操作数、将其转换为适当的格式或顺序、作为新的矩阵操作数存储回存储器中,然后进行操作。该处理可能效率极低,因为它会增大处理延迟、存储器访问延迟和存储器利用率。
[0041]
因此,在所示实施例中,矩阵处理系统100能够以更加灵活且高效的方式对各种格式的矩阵操作数进行操作。具体地,矩阵处理器110可以执行多变量跨步(mvs)读取操作,从而以特定矩阵操作所需的适当格式或顺序从存储器中直接提取矩阵操作数104。以这种方式,乱序102存储在存储器的矩阵操作数可以使用mvs读取操作被提取和/或转换为正确的格式或顺序104。
[0042]
在一些实施例中,例如,mvs操作可以使用软件可编程的跨步读取序列从存储器中读取矩阵操作数。具体地,跨步读取序列可以利用跨步读取操作(例如跨步(stride)和带区(band)操作)的序列进行编程,这些操作被设计为以适当的格式或顺序从存储器中读取矩阵操作数。
[0043]
例如,跨步操作可以用于以相对于基本存储器地址的指定跨步或偏移量来读取存储器,例如从先前读取的存储器地址+n个跨步:
[0044]
跨步+n=读取存储器[先前地址+n]
[0045]
带区操作可以用于在相对于基本存储器地址的指定数量的顺序存储器地址处读取存储器,例如在先前读取的存储器地址之后的n个顺序存储器地址:
[0046]
带区+n=读取存储器[先前地址+1]
[0047]
读取存储器[先前地址+2]
[0048]
读取存储器[先前地址+

]
[0049]
读取存储器[先前地址+n]
[0050]
以这种方式,跨步读取序列可以利用跨步和带区操作的适当序列进行编程,从而以期望的格式或顺序从存储器中读取矩阵操作数。这种软件可编程的方法为应用提供了极大的灵活性,从而以多种不同的格式从存储器中以高效的方式提取矩阵操作数。
[0051]
在所示实施例中,例如,矩阵处理器110包括控制器112、矩阵元素存储和切片(mes)引擎114以及执行引擎118。控制器112从主机计算设备120接收指令并使这些指令由矩阵处理器110执行。
[0052]
矩阵元素存储和切片(mes)引擎114处理指令所使用的矩阵操作数的存储和提取。具体地,mes引擎114包括操作数存储器115和序列存储器116。操作数存储器115用于存储矩阵数据和操作数,而序列存储器116用于存储用于从操作数存储器115中提取矩阵操作数的跨步读取序列。在一些实施例中,例如,操作数存储器115可以包括封装上dram(例如,高带宽存储器(hbm))和/或片上sram(例如,特定计算集群的存储器资源块(mrb))等。
[0053]
执行引擎118处理指令的执行。在一些实施例中,例如,执行引擎118可以包括一个或多个矩阵处理单元(mpu),其被设计为对矩阵操作数执行矩阵算术,例如矩阵乘法、卷积、逐元素算术和逻辑(例如,加法(+)、减法(-)、乘法(*)、除法(/)、按位逻辑(and、or、xor、左/右移位)、比较(>、<、>=、<=、==、!=))以及列级、行级和矩阵范围的操作(例如,求和、最大值、最小值)等。
[0054]
在一些实施例中,为了使矩阵处理器110执行对多变量(mv)矩阵操作数(例如,将使用mvs读取操作访问的矩阵操作数)进行操作的指令,以下步骤作为前提被执行:(i)mv操作数被寄存(registered)到矩阵处理器110;(ii)访问mv操作数所需的跨步读取序列被编程到序列存储器116中。在一些实施例中,例如,矩阵处理器110可以支持用于执行这些步骤的某些指令(例如,主机计算设备120可以将其发布到矩阵处理器110的指令),例如寄存器多变量操作数指令(register multi-variate operand instruction,regop_mv)和序列存储器写入指令(sequence memory write instruction,seqmem_write)。
[0055]
例如,寄存器多变量操作数指令(regop_mv)可以指定共同标识和/或定义mv操作数的各种参数,例如句柄(handle)标识符(id)、起始存储器地址(例如,操作数存储器115中的基本存储器地址+偏移量)、维度、数字元素类型(例如bfloat16或sp32)以及各种跨步访问参数(例如,跨步读取序列在序列存储器116中的地址、读取操作大小、循环大小、超跨步)等。基于这些参数,矩阵处理器110将指定的句柄id分配给mv操作数,这使得后续的指令能够通过引用其分配的句柄id来对mv操作数进行操作。
[0056]
此外,序列存储器写入指令(seqmem_write)可以用于将mv操作数的跨步读取序列编程到序列存储器116中。
[0057]
对mv操作数进行操作的后续指令然后可以通过引用适当的句柄id被执行。在一些实施例中,例如,在接收到引用分配给mv操作数的句柄id的指令时,基于在regop_mv指令中指定的先前寄存的参数和被编程到序列存储器116中的相应的跨步读取序列,从操作数存储器115中检索mv操作数,然后对mv操作数执行适当的操作。
[0058]
结合其余附图进一步描述与多变量跨步读取操作有关的附加功能和实施例。因此,应当理解,可以利用贯穿本公开所描述的功能和实施例的任何方面来实现图1的矩阵处理系统100。
[0059]
矩阵操作数的寄存和存储
[0060]
在一些实施例中,图1的矩阵处理器110被设计为执行对二维(2d)矩阵操作数进行操作的指令,每个操作数均由相应的“句柄”标识。句柄用作指向存储器中的特定2d矩阵操作数的指针。此外,具有多于两个维度的矩阵操作数(例如,三维(3d)和二维(4d)操作数)可以通过将原始维度组织为维度的两个子集(每个子集被视为单个维度)而被支持。例如,维度为c x h x w x n(通道、高度、宽度、图像数量)的4d矩阵操作数可以被组织为chw x n的2d矩阵操作数,其中维度c、h和w被共同视为第一维度,维度n被视为第二维度。
[0061]
此外,在一些实施例中,矩阵处理器110可以支持用于表示矩阵操作数的基础元素的多种数字格式,诸如16位脑浮点格式(bfloat16或bf16)或32位单精度浮点格式(sp32)等。
[0062]
在一些实施例中,在要对矩阵操作数进行操作的任何指令被发布给矩阵处理器110之前,这些矩阵操作数的句柄由软件寄存。例如,在主机计算设备120上执行的软件可以
通过向矩阵处理器110发布寄存器操作数指令来寄存矩阵操作数的句柄。
[0063]
此外,在一些实施例中,取决于特定矩阵操作数如何被存储在存储器中,矩阵处理器110可以支持寄存器操作数指令的多种变化。例如,regop指令可以用于寄存按顺序或依次被存储在存储器中的普通矩阵操作数,而regop_mv指令可以用于寄存被乱序存储在存储器中的多变量(mv)跨步矩阵操作数。
[0064]
例如,针对按顺序或依次被存储在存储器中的普通矩阵操作数,regop指令可以包括用于寄存矩阵操作数的各种参数,例如句柄id、维度(例如,x和y维度的大小)、起始存储器地址和数字元素类型(例如bfloat16或sp32):
[0065]
regop handleid(sizex,sizey)addr ntype
[0066]
寄存的句柄id然后用作指向存储器中的矩阵操作数的指针。例如,基于regop指令中指定的参数,句柄标识符handleid被寄存到硬件以指向被存储在存储器中特定起始存储器地址(addr)处的矩阵,该矩阵的维度为sizex乘以sizey,并且总共包含sizex*sizey个ntype类型(例如bfloat16或sp32)的元素。
[0067]
图2-3图示根据某些实施例的使用regop指令寄存的各种矩阵操作数的存储器布局的示例。在一些实施例中,例如,用于存储矩阵操作数的存储器可以具有特定的深度和宽度,例如深度为4,000并且宽度为512位(或64字节)。以这种方式,存储器最多可以存储4,000行矩阵元素,每行最多包含32个bfloat16格式的元素(每行512b/每个元素16b=每行32个元素)或16个sp32格式的元素(每行512b/每个元素32b=每行16个元素)。此外,在一些实施例中,矩阵操作数可以被存储在特定大小的存储器块中,例如2千字节(kb)的块,每个块包括存储器的32行(例如,32行*每行512位=16,384位=2048字节≈2kb)。
[0068]
图2图示以维度71
×
71和元素类型bfloat16寄存的矩阵操作数的存储器布局的示例200。在一些实施例中,例如,示例200中的矩阵操作数可以使用上述的regop指令进行寄存。
[0069]
在所示示例中,示出了矩阵操作数210的逻辑视图和相应的存储器布局220。具体地,矩阵操作数210被逻辑布置为71行和71列(71x71)的bfloat16类型的元素。此外,出于将矩阵操作数210存储在存储器220中的目的,矩阵操作数210被划分为逻辑块(a-i),每个逻辑块包含多达32行和32列的元素(32
×
32)。由于矩阵操作数210没有包含足够的元素以完全填充右边缘和下边缘的逻辑块,因此这些块小于32x32的最大逻辑块大小。例如,虽然逻辑块a、b、d和e的大小均为32x32,但是逻辑块c、f、g、h和i较小,因为它们落在矩阵操作数210的右边缘和下边缘。
[0070]
此外,矩阵操作数210的各个逻辑块(a-i)被依次存储在存储器220的固定大小的块中。在所示实施例中,例如,每个存储器块的大小为2kb,并且包括宽度为512位(或64字节)的存储器220的32行,这意味着每行具有存储多达32个bfloat16类型的元素的能力。因此,物理存储器块的大小等于逻辑块的最大大小(例如,32行元素,每行32个元素)。此外,每个逻辑块(a-i)被存储在单独的物理存储器块中,而与逻辑块是否完全填充整个存储器块无关。例如,逻辑块a、b、d和e各自填充了整个32x32存储器块,而逻辑块c、f、g、h和i的大小较小,因此它们每个均仅部分地填充了32x32存储器块。
[0071]
图3图示以维度33
×
33和元素类型sp32寄存的矩阵操作数的存储器布局的示例300。在一些实施例中,例如,示例300中的矩阵操作数可以使用上述的regop指令进行寄存。
[0072]
在所示示例中,示出了矩阵操作数310的逻辑视图和相应存储器布局320。具体地,矩阵操作数310被逻辑地布置为33行和33列(33
×
33)的sp32类型的元素。此外,出于将矩阵操作数310存储在存储器320中的目的,矩阵操作数310被划分为逻辑块(a-d),每个逻辑块包含多达32行和32列的元素(32
×
32)。由于矩阵操作数310没有包含足够的元素以完全填充右边缘和下边缘的逻辑块,因此这些块小于最大逻辑块大小32x32。例如,虽然逻辑块a的最大大小为32x32,但是逻辑块b、c和d较小,因为它们落在矩阵操作数310的右边缘和下边缘。
[0073]
此外,矩阵操作数310的各个逻辑块(a-d)被依次存储在存储器320的固定大小的块中。在所示实施例中,例如,每个存储块的大小为2kb,并包括宽度为512位(或64字节)的存储器320的32行,这意味着每行具有存储多达16个sp32类型的元素(例如32
×
16)的能力。因此,物理存储器块的大小是逻辑块的最大大小的一半,因为物理存储器块的大小是32x16,而逻辑块的最大大小是32x32。结果,一些逻辑块将大于单个物理存储器块,这意味着它们将必须分开存储在两个物理存储器块上。因此,每个逻辑块(a-d)被存储在两个物理存储器块中,而与逻辑块是否完全填充这些存储器块无关。
[0074]
例如,逻辑块a的最大大小为32x32,这意味着它将完全填充两个物理存储器块。因此,逻辑块a被分成大小为32
×
16的左逻辑块a
l
和右逻辑块a
r
,它们分别被存储在单独的物理存储器块中。
[0075]
逻辑块b的大小为32x1,这意味着它可以容纳在单个物理存储器块中。然而,逻辑块b仍使用两个存储器块被存储在存储器320中,这意味着第一存储器块被逻辑块b部分地填充,而第二存储器块为空。
[0076]
逻辑块c的大小为1x32,这意味着它太大而无法容纳在单个物理存储器块中,因为逻辑块c的宽度为32个元素,而物理存储器块的宽度为16个元素。因此,逻辑块c被分成大小为1x16的左逻辑块c
l
和右逻辑块c
r
,它们分别被存储在仅被部分填充的单独的物理存储器块中。
[0077]
逻辑块d的大小为1x1,这意味着它可以容纳在单个物理存储器块中。尽管如此,逻辑块d仍使用两个存储器块被存储在存储器320中,这意味着第一存储器块被逻辑块d部分地填充,而第二存储器块为空。
[0078]
多变量跨步矩阵操作数
[0079]
如上所述,在一些情况下,以特定格式或顺序存储在存储器中的矩阵操作数可能需要被提取和/或转换为不同的格式或顺序以执行特定的矩阵操作。因此,在一些实施例中,矩阵处理器110可以支持“寄存器多变量操作数”指令(regop_mv),以寄存针对乱序和/或非连续地被存储在存储器的多变量(mv)操作数的句柄id。以这种方式,后续指令能够通过简单地引用其分配的句柄id来对mv操作数进行操作。例如,在接收到引用分配给mv操作数的句柄id的后续指令时,矩阵处理器110使用多变量跨步(mvs)读取操作以适当的格式或顺序从存储器中自动地提取mv操作数,并且然后对mv操作数执行与接收到的指令相对应的适当操作。
[0080]
在一些实施例中,例如,用于寄存mv操作数的regop_mv指令可以包括以下字段和/或参数:
[0081]
regop_mv handleid(sizex,sizey,rd_offset,operation_size,seqmem_offset,
superstride,loop_size)base_addr ntype
[0082]
一旦执行了regop_mv指令,寄存的句柄id用作指向存储器中的mv矩阵操作数的指针,并进一步指示应以跨步方式从存储器中读取操作数(例如,基于regop_mv指令中的指定的参数和相应的软件可编程跨步读取序列)。
[0083]
例如,基于regop_mv指令中指定的参数,句柄标识符“handleid”被寄存到硬件,并指向存储在存储器中开始于特定的起始存储器地址(base_addr+rd_offset)的矩阵,大小为“sizex”乘以“sizey”,并且包含“ntype”类型(例如bfloat16或sp32)的元素。寄存的“handleid”还指示矩阵是应当使用mvs读取操作而被访问的多变量(mv)操作数,因为矩阵可乱序地和/或非连续地被存储在存储器中。
[0084]
用于访问mv操作数的特定mvs读取操作涉及通过以下方式执行的指定数量(operation_size)的基础读取操作:循环通过特定大小(loop_size)的跨步读取序列、在跨步读取序列中执行跨步和/或带区读取操作,并在跨步读取序列的每次迭代之间应用“超跨步”(例如,直到执行了指定数量(operation_size)的基础读操作为止)。此外,在mvs读取操作中使用的特定跨步读取序列是从序列存储器中以指定的偏移量(seqmem_offset)进行检索的,该指定的偏移量通过软件(例如,使用seqmem_write指令)被预先编程到序列存储器中。
[0085]
以这种方式,regop_mv指令使软件能够通知硬件:应当经由软件规定的特定跨步读取序列以跨步方式从存储器中提取某些矩阵操作数(例如,因此允许软件选择以什么顺序从存储在存储器中的逻辑张量中读出哪些行和/或列等等)。
[0086]
在一些实施例中,例如,序列存储器用于存储跨步读取序列,其可以用于从存储器中提取mv操作数。例如,序列存储器中的特定跨步读取序列可以包括跨步和/或带区指令的序列。跨步指令用于以特定跨步偏移量n执行单个读取操作,而带区指令用于执行n个顺序读取操作。
[0087]
在一些实施例中,序列存储器的深度为256个条目(例如,存储器地址),宽度为9位(256个条目x 9位)。此外,序列存储器的每个条目或地址能够存储特定跨步读取序列的单个指令,例如跨步指令或带区指令。例如,序列存储器中的条目的最高有效位(msb)可以指示特定指令是跨步指令还是带区指令,而其余位可以指示特定跨步或带区指令的值(例如,跨步操作的偏移量n,或带区操作的顺序读取的数目n)。
[0088]
在下面的表1和之后的章节中提供了regop_mv指令的字段的更详细的描述。
[0089]
表1:“寄存器多变量操作数”(regop_mv)指令的字段
[0090][0091]
[0092]
[0093][0094]
在一些实施例中,例如,当接收到引用多变量(mv)矩阵操作数的寄存的“handleid”的指令(例如,经由regop_mv指令寄存的操作数)时,使用多变量跨步(mvs)读取操作以适当的格式或顺序从存储器中自动提取mv操作数(例如,基于regop_mv指令中指定的字段以及序列存储器中的相应跨步读取序列)。
[0095]
例如,针对特定mv操作数的mvs读取操作在由regop_mv指令的“base_addr”+“rd_offset”字段指示的存储器地址处执行存储器的第一读取。接下来发生什么取决于序列存储器的内容。具体地,针对特定mv操作数的跨步读取序列按regop_mv指令的“seqmem_offset”字段中指定的偏移量被编程到序列存储器中,并且该跨步读取序列中的指令数量由“loop_size”字段指定。
[0096]
因此,硬件将首先在由“seqmem_offset”给出的地址处读取序列存储器。如果msb[b8]=1,则这是带区指令,并且其指示应当对顺序存储器位置执行的附加读取的数量。如果msb[b8]=0,则这是跨步指令,并且其指示应当添加到当前存储器地址以查找要读取的下一期望存储器位置的偏移量。
[0097]
硬件将通过读取下一序列存储器位置并应用与之前相同的规则来继续该处理。如果之前的序列存储器指令是跨步指令,则立即应用下一序列存储器指令。然而,如果之前的序列存储器指令是带区指令,则仅在指定数量的带区读取操作完成后才应用下一序列存储器指令。因此,如果在跨步指令之后跟着带区指令,则第一读取操作在由跨步偏移量指示的存储器地址处执行,然后指定数量的带区读取操作在紧随其后的顺序存储器地址处执行。例如,跨步+n指令后面跟着带区+3指令将从4个连续的存储器位置读取:一个是由于跨步跳转到偏移量+n处的存储器地址,然后另外三个是由于在紧随其后的存储器地址处的带区读取。然而,任何跨步和/或带区指令的序列都是允许的。例如,可以有一个或多个连续的跨步指令和/或一个或多个连续的带区指令(尽管多个背对背带区指令效率很低,因为它们很容易组合成单个带区指令)。
[0098]
在针对mv操作数执行的每个存储器读取操作(例如,包含mv操作数的元素的存储器地址的读取)之后,与regop_mv指令的“operation_size”字段相关联的计数器递增1。类似地,在每次读取序列存储器中的指令(例如,跨步或带区指令)之后,与regop_mv指令的“loop_size”字段关联的计数器递增1。此处理继续指导检测到两个事件之一:达到“loop_
size”或“operation_size”。
[0099]
如果达到“loop_size”,则发生超跨步事件。这意味着超跨步被添加到起始存储器地址(例如base_addr+rd_offset+超跨步),并且读取操作然后在新的起始存储器地址处被执行。在读取完成之后,引擎将再次重复序列存储器循环。它通过再次读取第一序列存储器指令而开始(例如,位于序列存储器中的“seqmem_offset”处),并像以前一样应用它。它继续读取相同的序列存储器指令,直到第二次达到“loop_size”或第一次达到“operation_size”。如果在“operation_size”之前达到“loop_size”,则该处理在通过应用另一超跨步计算出的新的起始存储器地址处(例如base_addr+rd_offset+2*超跨步)重复。当达到“operation_size”时,mvs读取操作完成,并且从存储器中读取mv操作数。
[0100]
此外,在一些实施例中,mvs读取操作可以有多种变体或模式:直接和旋转。针对两种变体,计算用于从存储器中读取mv操作数的存储器地址的方法是相同的。区别在于是否将旋转存储器选择应用于从存储器读取的行(例如,基于“rd_width”字段)。例如,在直接模式中,从存储器中读取的行被视为得到的mv操作数中的行。然而,在旋转模式中,从存储器读取的行被旋转或转置为得到的mv操作数中的列。
[0101]
如上所述,序列存储器的内容通知硬件用于访问特定mv操作数的相应跨步读取序列。序列存储器可以由软件通过序列存储器写入(seqmem_write)指令进行编程。下表2中提供了seqmem_write指令的字段的描述。
[0102]
表2:“序列存储器写入”(seqmem_write)指令的字段
[0103][0104][0105]
在一些情况下,这种多变量矩阵操作数的概念可以用于执行维度重新排列操作。
例如,通常需要以下原函数(primitive)来支持对多维度张量的所有可能的维度重新排列操作:
[0106]
原函数1:ab x c->bax c
[0107]
原函数2:ab x c->ac x b
[0108]
原函数3:ab x c->c x ab
[0109]
然而,在所述实施例中,维度重新排列操作(例如,ab x c->bc x a)可以使用mvs读取操作直接执行。例如,多变量矩阵操作数可以使用被设计为对存储在存储器中的矩阵操作数的维度进行重新排列或重新排序的各种参数和跨步读取序列、经由regop_mv指令而被寄存。
[0110]
图4图示mvs读取操作400的示例。具体地,所示示例示出了存储在存储器410中的矩阵操作数的布局,以及被编程到序列存储器420中的跨步读取序列的指令(在该示例中,其仅包含跨步指令)。
[0111]
此外,示出的示例描述了mvs读取操作400如何基于(i)regop_mv指令中指定的各个字段和(ii)序列存储器420中的相应跨步读取序列而从存储器410中读取mv操作数。具体地,示出的示例描绘了由mvs读取操作400读取的存储器410的行,其包含mv操作数的元素。
[0112]
例如,以下伪代码图示mvs读取操作400如何从存储器410读取mv操作数:
[0113]
[0114][0115]
图5图示mvs读取操作500的另一示例。在示出的示例中,被编程到序列存储器520中的跨步读取序列包括跨步指令和带区指令。
[0116]
以下伪代码图示mvs读取操作500如何从存储器510读取mv操作数:
[0117]
[0118][0119]
图6a-6b图示mvs读取操作600的另一示例。在示出的示例中,mvs读取操作600用于提取以crs
×
k格式存储在存储器610中的3d卷积过滤器605的一部分。因此,mv操作数使用以下参数经由regop_mv指令进行寄存:
[0120]
i.基本存储器地址=如图所示;
[0121]
ii.存储器偏移量=7;
[0122]
iii.操作大小=36(例如,读取操作的总数=每行的像素数*行数(3*12=36));
[0123]
iv.序列存储器偏移量=如图所示;
[0124]
v.循环大小=7(序列存储器指令数,其确定每个过滤器的读取数);以及
[0125]
vi.超跨步=r*s。
[0126]
基于这些参数以及被编程到序列存储器620中的跨步访问序列,mvs读取操作600将执行读取操作的三次迭代以从存储器610读取mv操作数:
[0127]
总共36次读取(operation_size)/每次迭代12次读取(1次初始读取+跨步访问序列的11次读取)=3次迭代。
[0128]
迭代次数(3)对应于通道数(c)。
[0129]
图7图示多变量跨步(mvs)读取操作的示例实施例的流程图700。在一些实施例中,例如,可以使用图1的矩阵处理系统100实现流程图700。
[0130]
流程图开始于框702,在框702,接收用于寄存存储在存储器中的多变量跨步矩阵操作数的句柄的指令(例如,regop_mv指令)。例如,regop_mv指令可以包括能够用于从存储器中提取矩阵操作数的各种字段,例如句柄标识符(id)、基本存储器地址、存储器偏移量、维度、数字元素类型(例如bfloat16或sp32)、操作大小、序列存储器偏移量、循环大小和/或超跨步等。基于这些字段,指定的句柄id被分配给矩阵操作数,这使得后续指令能够通过引用其分配的句柄id对矩阵操作数进行操作。
[0131]
然后,流程图进行到框704,在框704,用于访问矩阵操作数的跨步读取序列被编程到序列存储器中。在一些实施例中,例如,可以接收一个或多个序列存储器写入指令(seqmem_write)以将跨步读取序列编程到序列存储器中。跨步读取序列可以包括跨步读取操作和/或带区读取操作的序列,其可以以由regop_mv指令的“序列存储器偏移量(sequence memory offset)”字段指定的偏移量被编程到序列存储器中。此外,跨步读取序列中的指令总数可以对应于regop_mv指令的“循环大小(loop size)”字段。
[0132]
流程图然后进行到框706,在框706,接收对跨步矩阵操作数执行操作的指令,所述操作例如矩阵乘法、卷积或存储器复制操作等。例如,指令可以引用矩阵操作数的句柄id。因此,为了执行指令所需的特定操作,将使用mvs读取操作以适当的格式或顺序从存储器中提取矩阵操作数(例如,基于regop_mv指令中指定的字段和序列存储器中的相应跨步读取
序列)。
[0133]
例如,mvs读取操作读取包含通过以下方式读取的矩阵操作数的元素的特定数量的存储器行(例如,基于“操作大小(operation size)”字段):循环通过特定大小的跨步读取序列(基于“循环大小”字段),执行跨步读取序列中的跨步和/或带区读取操作,并在跨步读取序列的每次迭代之间应用“超跨步”(例如,直到从存储器读取了“操作大小”字段所需的存储器的行数为止)。
[0134]
因此,流程图进行到框708以从序列存储器中检索矩阵操作数的跨步读取序列。例如,以regop_mv指令的“序列存储器偏移量”字段指示的偏移量从序列存储器中读取特定数量的条目。从序列存储器中读取的条目数与regop_mv指令的“循环大小”字段相对应,且每个条目可以包含用于执行跨步读取操作或带区读取操作的指令。
[0135]
流程图然后进行到框710,在框710中执行读取操作的迭代。例如,在第一迭代中,在对应于regop_mv指令的“基本存储器地址(base memory address)”+“存储器偏移量(memory offset)”字段的起始存储器地址处读取存储器的第一行。然后执行跨步读取序列(例如,在框708从序列存储器中检索)以读取相对于当前迭代的起始存储器地址的存储器的一个或多个附加行。例如,可以执行跨步读取序列中的一个或多个跨步读取操作和/或带区读取操作。
[0136]
流程图然后进行到框712,以确定mvs读取操作是否完成。例如,如果已读取的存储器的总行数等于regop_mv指令的“操作大小”字段中的值,则mvs读取操作完成-否则,需要进行mvs读取操作的一个或多个附加迭代以读取存储器的其余行。
[0137]
例如,如果在框712处确定mvs读取操作尚未完成,则流程图进行到框714,其中超跨步被应用于先前迭代的起始存储器地址,以计算下一迭代的新的起始存储器地址。
[0138]
流程图然后返回至框710,以执行相对于新的起始存储器地址的读取操作的另一迭代。例如,在新的起始存储器地址处读取存储器的行,然后通过相对于新的起始存储器地址重复跨步读取序列来读取存储器的一个或多个附加行。
[0139]
以这种方式重复该处理,直到已读取的存储器的总行数等于regop_mv指令的“操作大小”字段中的值。
[0140]
当在框712处确定mvs读取操作完成时,流程图进行到框716,其中,对矩阵操作数执行适当的操作(例如,在框706处接收的指令所需的操作)。
[0141]
至此,流程图可能完成。然而,在一些实施例中,流程图可以重新开始和/或某些框可以被重复。例如,在一些实施例中,流程图可以在框702处重新开始以继续寄存句柄以访问跨步矩阵操作数。
[0142]
示例计算架构
[0143]
贯穿以下各节描述的附图图示了根据本文公开的实施例可以使用的计算系统、架构和/或环境的示例实现方式。此外,在一些实施例中,贯穿本公开描述的某些硬件组件和/或指令可以被仿真或实现为软件模块(例如,以下面描述的方式)。
[0144]
示例性指令格式
[0145]
指令集可以包括一个或多个指令格式。给定指令格式可以定义各种字段(例如,位数、位的位置)以指定要执行的操作(例如,操作码)和将在其上执行该操作的操作数和/或其他数据字段(例如,掩码)等。一些指令格式通过指令模板(或子格式)的定义被进一步细
分。例如,给定指令格式的指令模板可以被定义为具有指令格式的字段的不同子集(所包括的字段通常具有相同的顺序,但是至少一些具有不同的位位置,因为包括较少的字段)和/或被定义为具有不同解释的给定字段。因此,isa的每个指令使用给定的指令格式表示(并且,如果定义,则在该指令格式的给定的一个指令模板中)并且包括用于指定操作和操作数的字段。例如,示例性add指令具有特定操作码和指令格式,该指令格式包括指定该操作码的操作码字段和选择操作数的操作数字段(源1/目的地和源2);并且在指令流中出现该add指令将在操作数字段中具有选择特定操作数的特定内容。已发布和/或公布了被称为高级向量扩展(avx)(avx1和avx2)并使用向量扩展(vex)编码方案的一组simd扩展(例如,参见64和ia-32架构软件开发人员手册,2014年9月;参见高级向量扩展编程参考,2014年10月)。
[0146]
本文描述的指令的实施例可以以不同的格式实现。在一些实施例中,例如,(一个或多个)指令可以以“通用向量友好指令格式”来体现,如下文进一步详述的。在其他实施例中,没有使用这种格式,而是使用了另一种指令格式,然而,以下对写掩码寄存器、各种数据变换(调配(swizzle)、广播等)、寻址等的描述通常适用于任何可能的指令格式。另外,以下详细描述示例性系统、架构和流水线。(一个或多个)指令的实施例可以在这样的系统、架构和流水线上执行,但不限于详细说明的那些。
[0147]
通用向量友好指令格式
[0148]
向量友好指令格式是适合于向量指令的指令格式(例如,存在特定于向量操作的某些字段)。虽然描述了通过向量友好指令格式支持向量和标量操作的实施例,但替代实施例仅使用向量友好指令格式的向量操作。
[0149]
图8a-8b是示出根据本发明示例的通用向量友好指令格式及其指令模板的框图。图8a是示出根据本公开实施例的通用向量友好指令格式及其a类指令模板的框图;图8b是示出根据本公开实施例的通用向量友好指令格式及其b类指令模板的框图。具体地,为通用向量友好指令格式800定义a类和b类指令模板,两者都包括无存储器访问805指令模板和存储器访问820指令模板。在向量友好指令格式的上下文中,术语“通用”是指不与任何特定指令集相捆绑的指令格式。
[0150]
虽然将描述本公开的示例,其中向量友好指令格式支持以下内容:具有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字节向量操作数)。
[0151]
图8a中的a类指令模板包括:1)在无存储器访问805指令模板内,示出了无存储器访问、全舍入控制类型操作810指令模板和无存储器访问、数据变换类型操作815指令模板;2)在存储器访问820指令模板内,示出了存储器访问、暂时(temporal)825指令模板和存储器访问、非暂时830指令模板。图8b中的b类指令模板包括:1)在无存储器访问805指令模板
内,示出了无存储器访问、写掩码控制、部分舍入控制类型操作812指令模板和无存储器访问、写掩码控制、vsize类型操作817指令模板;2)在存储器访问820指令模板内,示出了存储器访问、写掩码控制827指令模板。
[0152]
通用向量友好指令格式800包括以下以图8a-8b所示的顺序列出的以下字段。
[0153]
格式字段840-该字段中的特定值(指令格式标识符值)唯一地标识向量友好指令格式,因此标识指令在指令流中以向量友好指令格式出现。因此,该字段是可选的,仅具有通用向量友好指令格式的指令集是不需要该字段的。
[0154]
基本操作字段842-其内容区分不同的基本操作。
[0155]
寄存器索引字段844-其内容直接或通过地址生成来指定源和目标操作数的位置,无论它们在寄存器中还是在存储器中。这些包括足够数量的位以从pxq(例如32x512、16x128、32x1024、64x1024)寄存器文件中选择n个寄存器。虽然在一个实施例中,n可以是多达三个源和一个目的地寄存器,但是替代实施例可以支持更多或更少的源和目的地寄存器(例如,可以支持多达两个源,其中这些源中的一个也充当目的地,可以支持多达三个源,其中这些源中的一个也充当目的地,可能支持多达两个源和一个目的地)。
[0156]
修正符字段846-其内容区分通用向量指令格式中指定存储器访问的指令的出现与不指定存储器访问的指令的出现;即,区分无存储器访问805指令模板和存储器访问820指令模板。存储器访问操作读取和/或写入存储器层级结构(在一些情况下使用寄存器中的值指定源和/或目的地地址),而非存储器访问操作不这样做(例如,源和目的地是寄存器)。虽然在一个实施例中,该字段还在三种不同方式之间进行选择以执行存储器地址计算,但替代实施例可以支持更多、更少或不同的方式来执行存储器地址计算。
[0157]
增强操作字段850-其内容区分除基本操作之外还要执行各种不同操作中的哪一个。该字段是上下文特定的。在本公开的一个示例中,该字段被分成类字段868,α字段852和β字段854。增强操作字段850允许在单个指令中而不是2、3或4个指令中执行公共操作组。
[0158]
缩放字段860-其内容允许缩放索引字段的内容以用于存储器地址生成(例如,用于使用2scale*index+base的地址生成)。
[0159]
位移字段862a-其内容用作存储器地址生成的一部分(例如,用于使用2scale*index+base+displacement的地址生成)。
[0160]
位移因子字段862b(注意,直接在位移因子字段862b上的位移字段862a的并置指示使用一个或另一个)-其内容用作地址生成的一部分;它指定位移因子,该位移因子将通过存储器访问的大小(n)来缩放-其中n是存储器访问中的字节数(例如,对于使用2scale*index+base+scaled displacement的地址生成)。忽略冗余低阶位,因此,位移因子字段的内容乘以存储器操作数总大小(n),以便生成用于计算有效地址的最终位移。n的值由处理器硬件在运行时基于完整操作码字段874(稍后描述)和数据操纵字段854c来确定。位移字段862a和位移因子字段862b从以下意义上来说是可选的,例如它们不用于无存储器访问805指令模板和/或不同实施例可以仅实现这两者中的一个或不实现这两者。
[0161]
数据元素宽度字段864-其内容区分要使用多个数据元素宽度中的哪一个(在一些实施例中针对所有指令;在其他实施例中仅针对一些指令)。该字段从以下意义上来说是可选的,例如如果仅支持一个数据元素宽度和/或使用操作码的某些方面支持数据元素宽度则不需要该字段。
[0162]
写掩码字段870-其内容基于每个数据元素位置控制目的地向量操作数中的数据元素位置是否反映了基本操作和增强操作的结果。a类指令模板支持合并写掩码,而b类指令模板支持合并和归零写掩码。合并时,向量掩码允许在执行任何操作(由基本操作和增强操作指定)期间保护目的地中的任何元素集免于更新;在另一个实施例中,保留相应掩码位具有0值的目的地的每个元素的旧值。相反,当归零向量掩码允许在执行任何操作(由基本操作和增强操作指定)期间将目的地中的任何元素集归零;在一个实施例中,当相应的掩码位具有0值时,目的地的元素被设置为0。该功能的一个子集是能够控制正在执行的操作的向量长度(即,从第一个到最后一个被修改的元素的跨度);但是,修改的元素不必是连续的。因此,写掩码字段870允许部分向量操作,包括加载、存储、算术、逻辑等。虽然描述了本公开的实施例,其中写掩码字段870的内容选择多个写掩码寄存器中包含要使用的写掩码的一个写掩码寄存器(并且因此写掩码字段870的内容间接地标识要执行的掩码),但替代实施例或者附加实施例允许写掩码字段870的内容直接指定要执行的掩码。
[0163]
立即数(immediate)字段872-其内容允许指定立即数。该字段从以下意义上来说是可选的,例如它不存在于不支持立即数的通用向量友好格式的实现中并且它不存在于不使用立即数的指令中。
[0164]
类字段868-其内容区分不同类的指令。参考图8a-b,该字段的内容在a类和b类指令之间进行选择。在图8a-b中,圆角方块用于表示在字段中存在特定值(例如,分别在图8a-b中的类字段868的a类868a和b类868b)。
[0165]
a类指令模板
[0166]
在a类的非存储器访问805指令模板的情况下,α字段852被解析为rs字段852a,其内容区分要执行不同的增强操作类型中的哪个(例如,舍入852a.1和数据变换852a.2分别被指定用于无存储器访问、舍入型操作810和无存储器访问、数据变换类型操作815指令模板),而β字段854区分要执行哪个指定类型的操作。在无存储器访问805指令模板中,不存在缩放字段860,位移字段862a和位移因子字段862b。
[0167]
无存储器访问指令模板

全舍入控制类型操作
[0168]
在无存储器访问全舍入控制类型操作810指令模板中,β字段854被解析为舍入控制字段854a,其内容提供静态舍入。虽然在本公开的所述实施例中,舍入控制字段854a包括抑制所有浮点异常(sae)字段856和舍入操作控制字段858,但是替代实施例可以支持可以将这些概念编码到同一字段中或仅具有这些概念/字段中的一个或者另一个(例如,可以仅具有舍入操作控制字段858)。
[0169]
sae字段856-其内容区分是否禁用异常事件报告;当sae字段的856内容表明启用抑制时,给定的指令不会报告任何类型的浮点异常标志,也不会引发任何浮点异常处理程序。
[0170]
舍入操作控制字段858-其内容区分要执行一组舍入操作中的哪一个(例如,向上舍入,向下舍入,向零舍入和向最近舍入)。因此,舍入操作控制字段858允许基于每个指令改变舍入模式。在本公开的处理器包括用于指定舍入模式的控制寄存器的一个实施例中,舍入操作控制字段850的内容覆盖该寄存器值。
[0171]
无存储器访问指令模板

数据变换类型操作
[0172]
在无存储器访问数据变换类型操作815指令模板中,β字段854被解析为数据变换
字段854b,其内容区分要执行多个数据变换中的哪一个(例如,无数据变换、调配、广播)。
[0173]
在类a的存储器访问820指令模板的情况下,α字段852被解析为逐出提示字段852b,其内容区分将使用哪一个驱逐提示(在图8a中,暂时852b.1和非暂时852b.2分别被指定用于存储器访问、暂时825指令模板和存储器访问、非暂时830指令模板),而β字段854被解析为数据操纵字段854c,其内容区分要执行多个数据操纵操作(也称为原函数)中的哪一个(例如,无操纵;广播;源的上转换;以及目的地的下转换)。存储器访问820指令模板包括缩放字段860,并且可选地包括位移字段862a或位移因子字段862b。
[0174]
向量存储器指令利用转换支持执行从存储器的向量加载和到存储器的向量存储。与常规向量指令一样,向量存储器指令以逐个数据元素的方式从/向存储器传输数据,实际传输的元素由被选择作为写掩码的向量掩码的内容决定。
[0175]
存储器访问指令模板

暂时
[0176]
暂时数据是可能足够快地被重用以从缓存受益的数据。然而,这是一个提示,不同的处理器可以以不同的方式实现它,包括完全忽略提示。
[0177]
存储器访问指令模板

非暂时
[0178]
非暂时数据是不太可能足够快地被重用以从缓存在第一级缓存中受益的数据,并且应该优先驱逐。然而,这是一个提示,不同的处理器可以以不同的方式实现它,包括完全忽略提示。
[0179]
b类指令模板
[0180]
在b类的指令模板的情况下,α字段852被解析为写掩码控制(z)字段852c,其内容区分由写掩码字段870控制的写掩码应该是合并还是归零。
[0181]
在b类的非存储器访问805指令模板的情况下,β字段854的一部分被解析为rl字段857a,其内容区分要执行不同增强操作类型中的哪一个(例如,舍入857a.1和向量长度(vsize)857a.2分别被指定用于无存储器访问、写掩码控制、部分舍入控制类型操作812指令模板和无存储器访问、写掩码控制、vsize类型操作817指令模板),而β字段854的其余部分区分要执行哪个指定类型的操作。在无存储器访问805指令模板中,不存在缩放字段860,位移字段862a和位移因子字段862b。
[0182]
在无存储器访问、写掩码控制、部分舍入控制类型操作810指令模板中,β字段854的其余部分被解析为舍入操作字段859a并且禁用异常事件报告(给定指令不报告任何类型的浮点异常标志,不会引发任何浮点异常处理程序)。
[0183]
舍入操作控制字段859a-正如舍入操作控制字段858一样,其内容区分要执行的一组舍入操作中的哪一个(例如,向上舍入、向下舍入、向零舍入和向最近舍入)。因此,舍入操作控制字段859a允许基于每个指令改变舍入模式。在本公开的处理器包括用于指定舍入模式的控制寄存器的一个实施例中,舍入操作控制字段850的内容覆盖该寄存器值。
[0184]
在无存储器访问、写掩码控制、vsize类型操作817指令模板中,β字段854的其余部分被解析为向量长度字段859b,其内容区分要在多个数据向量长度中的哪一个(例如,128、256或512字节)上执行。
[0185]
在b类的存储器访问820指令模板的情况下,β字段854的一部分被解析为广播字段857b,其内容区分是否要执行广播类型数据操纵操作,而β字段854的其余部分被解析为向量长度字段859b。存储器访问820指令模板包括缩放字段860,并且可选地包括位移字段
862a或位移因子字段862b。
[0186]
关于通用向量友好指令格式800,示出了完整操作码字段874,其包括格式字段840,基本操作字段842和数据元素宽度字段864。尽管示出了完整操作码字段874包括所有这些字段的一个实施例,但在不支持所有这些字段的实施例中,完整操作码字段874包括少于所有这些字段。完整操作码字段874提供操作代码(操作码)。
[0187]
增强操作字段850、数据元素宽度字段864和写掩码字段870允许在通用向量友好指令格式中基于每个指令指定这些特征。
[0188]
写掩码字段和数据元素宽度字段的组合创建分类型的指令,因为它们允许基于不同的数据元素宽度来应用掩码。
[0189]
在a类和b类中找到的各种指令模板在不同情况下是有益的。在本公开的一些实施例中,处理器内的不同处理器或不同核可以仅支持a类,仅支持b类或支持这两类。例如,旨在用于通用计算的高性能通用乱序核可以仅支持b类,旨在主要用于图形和/或科学(吞吐量)计算的核可以仅支持a类,而旨在用于两者的核可以支持两者(当然,具有来自两类的模板和指令但不是来自两类的所有模板和指令的某种混合的核也在本公开的范围内)。此外,单个处理器可以包括多个核,所有核都支持相同的类或不同的核支持不同的类。例如,在具有单独图形和通用核的处理器中,旨在主要用于图形和/或科学计算的图形核之一可以仅支持a类,而一个或多个通用核可以是具有乱序执行和寄存器重命名的高性能通用核,旨在用于仅支持b类的通用计算。另一个不具有单独图形核的处理器可以包括支持a类和b类两者的一个或多个通用顺序或乱序核。当然,在本公开的不同实施例中,来自一类的特征也可以在另一类中实现。用高级语言编写的程序将被放置(例如,及时编译或静态编译)成各种不同的可执行形式,包括:1)仅具有用于执行的目标处理器所支持的类的指令的形式;或2)具有使用所有类的指令的不同组合编写的备选例程并具有控制流程代码的形式,该控制流程代码基于当前正在执行代码的处理器所支持的指令来选择要执行的例程。
[0190]
示例性特定向量友好指令格式
[0191]
图9是示出根据本公开实施例的示例性特定向量友好指令格式的框图。图9示出了特定向量友好指令格式900,该格式从以下意义上来说是特定的,例如该格式指定字段的位置、大小、解析和顺序、以及这些字段中的一些字段的值。特定向量友好指令格式900可用于扩展x86指令集,因此一些字段与现有x86指令集及其扩展(例如avx)中使用的字段类似或相同。此格式与具有扩展的现有x86指令集的前缀编码字段、真实操作码字节字段、mod r/m字段、sib字段、位移字段以及立即数字段保持一致。示出了图9中的字段所映射到的图8中的字段。
[0192]
应当理解,尽管出于说明性目的,在通用向量友好指令格式800的上下文中参考特定向量友好指令格式900描述了本公开的实施例,但是本公开不限于特定向量友好指令格式900,除非声明的情况下。例如,通用向量友好指令格式800考虑了各种字段的各种可能大小,而特定向量友好指令格式900被示为具有特定大小的字段。作为具体示例,虽然数据元素宽度字段864被示为特定向量友好指令格式900中的一位字段,但是本公开不限于此(即,通用向量友好指令格式800考虑其他大小的数据元素宽度字段864)。
[0193]
通用向量友好指令格式800包括以下按照图9a中所示的顺序列出的以下字段。
[0194]
evex前缀(字节0-3)902-以四字节形式编码。
[0195]
格式字段840(evex字节0,位[7:0])-第一字节(evex字节0)是格式字段840并且它包含0x62(在本公开的一个实施例中用于区分向量友好指令格式的唯一值)。
[0196]
第二至第四字节(evex字节1-3)包括提供特定能力的多个位字段。
[0197]
rex字段905(evex字节1,位[7-5])-由evex.r位字段(evex字节1,位[7]-r)、evex.x位字段(evex字节1,位[6]-x)和evex.x位字段(857bex字节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。
[0198]
rex'字段810-这是rex'字段810的第一部分,并且是evex.r'位字段(evex字节1,位[4]-r'),其用于对扩展32寄存器组的高16或低16位进行编码。在本公开的一个实施例中,该位以及如下所示的其它位以位反转的格式来存储,以与bound指令进行区分(在众所周知的x86 32位模式中),其真实操作码字节为62,但是在mod r/m字段(下面描述)中不接受mod字段中的值11;本公开的替代实施例不以反转格式存储这个和下面的其他所指示的位。值1用于对低16位寄存器编码。即,r'rrrr是通过组合evex.r'、evex.r和来自其他字段的其他rrr形成的。
[0199]
操作码映射字段915(evex字节1,位[3:0]-mmmm)-其内容对隐含的前导操作码字节(0f、0f 38或0f 3)进行编码。
[0200]
数据元素宽度字段864(evex字节2,位[7]-w)-由符号evex.w表示。evex.w用于定义数据类型的粒度(大小)(32位数据元素或64位数据元素)。
[0201]
evex.vvvv 920(evex字节2,位[6:3]-vvvv)-evex.vvvv的作用可以包括以下内容:1)evex.vvvv对第一个源寄存器操作数进行编码,以反转(1的补码)形式指定,并且对有2个或更多源操作数的指令有效;2)evex.vvvv对目标寄存器操作数进行编码,以1的补码形式指定用于某些向量移位;或者3)evex.vvvv不对任何操作数进行编码,该字段是保留的,并且应该包含1111b。因此,evex.vvvv字段920对以反转(1的补码)形式存储的第一源寄存器指定符的4个低阶位进行编码。取决于指令,使用额外不同的evex位字段将指定符大小扩展为32个寄存器。
[0202]
evex.u 868类字段(evex字节2,位[2]-u)-如果evex.u=0,则表示a类或evex.u0;如果evex.u=1,则表示b类或evex.u1。
[0203]
前缀编码字段925(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前缀编码,因此不需要扩展。
[0204]
α字段852(evex字节3,位[7]-eh;也称为evex.eh、evex.rs、evex.rl、evex.写掩码
控制、以及evex.n;也用α示出)-如前所述,该字段是特定于上下文的。
[0205]
β字段854(evex字节3,位[6:4]-sss,也称为evex.s
2-0
、evex.r
2-0
、evex.rr1、evex.ll0、evex.llb;也用β示出)-如前所述,该字段是特定于上下文的。
[0206]
rex'字段810-这是rex'字段的剩余部分,并且是evex.v'位字段(evex字节3,位[3]-v'),其可用于对扩展32寄存器组的高16或低16位编码。该位以位反转格式存储。值1用于对低16位寄存器编码。即,通过组合evex.v'、evex.vvvv来形成v'vvvv。
[0207]
写掩码字段870(evex字节3,位[2:0]-kkk)-如前所述,其内容指定写掩码寄存器中的寄存器的索引。在本公开的一个实施例中,特定值evex.kkk=000具有特殊行为,暗示没有写掩码用于特定指令(这可以以各种方式实现,包括使用硬连线到所有的写掩码或绕过掩蔽硬件的硬件)。
[0208]
真实操作码字段930(字节4)也称为操作码字节。在该字段中指定部分操作码。
[0209]
mod r/m字段940(字节5)包括mod字段942、reg字段944和r/m字段946。如前所述,mod字段942的内容区分存储器访问和非存储器访问操作。reg字段944的作用可归纳为两种情况:对目的地寄存器操作数或源寄存器操作数编码,或被视为操作码扩展而不用于对任何指令操作数编码。r/m字段946的作用可以包括以下内容:对引用存储器地址的指令操作数编码,或对目的地寄存器操作数或源寄存器操作数编码。
[0210]
缩放、索引、基准(sib)字节(字节6)-如前所述,缩放字段860、952的内容用于存储器地址生成。sib.xxx 954和sib.bbb 956-这些字段的内容先前已经相关于寄存器索引xxxx和bbbb提及了。
[0211]
位移字段862a(字节7-10)-当mod字段942包含10时,字节7-10是位移字段862a,并且其工作方式与传统的32位位移(disp32)相同并且以字节粒度工作。
[0212]
位移因子字段862b(字节7)-当mod字段942包含01时,字节7是位移因子字段862b。该字段的位置与传统x86指令集8位位移(disp8)的位置相同,其以字节粒度工作。由于disp8是符号扩展的,它只能解决-128到127个字节之间的偏移量;就64字节缓存行而言,disp8使用8位,只能被设置为4个非常有用的值-128、-64、0和64;因为经常需要更大的范围,所以使用disp32;但是,disp32需要4个字节。与disp8和disp32相比,位移因子字段862b是disp8的重新解析;当使用位移因子字段862b时,实际位移由位移因子字段的内容乘以存储器操作数访问的大小(n)来确定。这种类型的位移称为disp8*n。这减少了平均指令长度(用于位移的单个字节,但具有更大的范围)。这种压缩位移基于有效位移是存储器访问的粒度的倍数的假设,因此,不需要对地址偏移的冗余低阶位进行编码。即,位移因子字段862b代替传统x86指令集8位位移。因此,位移因子字段862b以与x86指令集8位位移相同的方式被编码(因此modrm/sib编码规则没有变化),唯一的例外是disp8被过加载到disp8*n。即,编码规则或编码长度没有变化,而只是硬件对位移值的解析变化(需要用存储器操作数的大小来缩放位移以获得逐字节地址偏移)。立即数字段872如前所述操作。
[0213]
完整操作码字段
[0214]
图9b是示出根据本公开一个实施例的构成完整操作码字段874的特定向量友好指令格式900的字段的框图。具体地,完整操作码字段874包括格式字段840、基本操作字段842和数据元素宽度(w)字段864。基本操作字段842包括前缀编码字段925、操作码映射字段915和真实操作码字段930。
[0215]
寄存器索引字段
[0216]
图9c是示出根据本公开一个实施例的构成寄存器索引字段844的特定向量友好指令格式900的字段的框图。具体地,寄存器索引字段844包括rex字段905、rex'字段910、modr/m.reg字段944、modr/m.r/m字段946、vvvv字段920、xxx字段954和bbb字段956。
[0217]
增强操作字段
[0218]
图9d是示出根据本公开一个实施例的构成增强操作字段850的特定向量友好指令格式900的字段的框图。当类(u)字段868包含0时,它表示evex.u0(a类868a);当类(u)字段868包含1时,它表示evex.u1(b类868b)。当u=0并且mod字段942包含11(表示无存储器访问操作)时,α字段852(evex字节3,位[7]-eh)被解析为rs字段852a。当rs字段852a包含1(舍入852a.1)时,β字段854(evex字节3,位[6:4]-sss)被解析为舍入控制字段854a。舍入控制字段854a包括一位sae字段856和两位舍入操作字段858。当rs字段852a包含0(数据变换852a.2)时,β字段854(evex字节3,位[6:4]-sss)被解析为三位数据变换字段854b。当u=0并且mod字段942包含00、01或10(表示存储器访问操作)时,α字段852(evex字节3,位[7]-eh)被解析为逐出提示(eh)字段852b,β字段854(evex字节3,位[6:4]-sss)被解析为三位数据操纵字段854c。
[0219]
当u=1时,α字段852(evex字节3,位[7]-eh)被解析为写掩码控制(z)字段852c。当u=1并且mod字段942包含11(表示无存储器访问操作)时,β字段854的一部分(evex字节3,位[4]-s0)被解析为rl字段857a;当rl字段857a包含1(舍入857a.1)时,β字段854的其余部分(evex字节3,位[6-5]-s2-1)被解析为舍入操作字段859a,而当rl字段857a包含0(vsize 857.a2)时,β字段854的其余部分(evex字节3,位[6-5]-s2-1)被解析为向量长度字段859b(evex字节3,位[6-5]-l1-0)。当u=1并且mod字段942包含00、01或10(表示存储器访问操作)时,β字段854(evex字节3,位[6:4]-sss)被解析为向量长度字段859b(evex字节3,位[6-5]-l1-0)和广播字段857b(evex字节3,位[4]-b)。
[0220]
示例性寄存器架构
[0221]
图10是根据本公开一个实施例的寄存器架构1000的框图。在所示的实施例中,存在512位宽的32个向量寄存器1010;这些寄存器引用为zmm0到zmm31。低16个zmm寄存器的低阶256位覆盖在寄存器ymm0-16上。低16个zmm寄存器的低阶128位(ymm寄存器的低阶128位)覆盖在寄存器xmm0-15上。特定向量友好指令格式900对这些覆盖的寄存器文件进行操作,如下表所示。
[0222]
[0223][0224]
即,向量长度字段859b在最大长度和一个或多个其他较短长度之间进行选择,其中每个这样的较短长度是前一长度的一半长度;没有向量长度字段859b的指令模板对最大向量长度操作。此外,在一个实施例中,特定向量友好指令格式900的b类指令模板对打包或标量单/双精度浮点数据和打包或标量整数数据进行操作。标量操作是对zmm/ymm/xmm寄存器中的最低阶数据元素位置执行的操作;根据实施例,高阶数据元素位置保持与指令之前相同或归零。
[0225]
写掩码寄存器1015-在所示实施例中,存在8个写掩码寄存器(k0到k7),各自大小为64位。在替换实施例中,写掩码寄存器1015的大小为16位。如前所述,在本公开的一个实施例中,向量掩码寄存器k0不能用作写掩码;当通常表示k0的编码用于写掩码时,它选择0xffff的硬连线写掩码,有效地禁用该指令的写掩码。
[0226]
通用寄存器1025-在所示实施例中,有16个64位通用寄存器,它们与现有的x86寻址模式一起用于寻址存储器操作数。这些寄存器由名称rax,rbx,rcx,rdx,rbp,rsi,rdi,rsp和r8至r15引用。
[0227]
标量浮点堆栈寄存器文件(x87堆栈)1045,其上混叠有mmx打包整数平坦寄存器文件1050-在所示实施例中,x87堆栈是用于使用x87指令集扩展对32/64/80位浮点数据执行标量浮点运算的八元素堆栈;而mmx寄存器用于对64位打包整数数据执行操作,以及保持用于mmx和xmm寄存器之间执行的某些操作的操作数。
[0228]
本公开的替代实施例可以使用更宽或更窄的寄存器。另外,本公开的备选实施例可以使用更多、更少或不同的寄存器文件和寄存器。
[0229]
示例性核架构、处理器和计算机架构
[0230]
处理器核可以以不同的方式实现,可以被实现用于不同的目的,并且可以在不同的处理器中实现。例如,这种核的实现方式可以包括:1)用于通用计算的通用顺序核;2)用于通用计算的高性能通用乱序核;3)主要用于图形和/或科学(吞吐量)计算的专用核。不同处理器的实现方式可以包括:1)cpu,其包括旨在用于通用计算的一个或多个通用顺序核和/或用于通用计算的一个或多个通用乱序核;2)协处理器,包括主要用于图形和/或科学(吞吐量)的一个或多个专用核。这种不同的处理器导致不同的计算机系统架构,其可以包括:1)在与cpu不同的芯片上的协处理器;2)在与cpu相同的封装中的单独管芯(die)上的协处理器;3)在与cpu相同的管芯上的协处理器(在这种情况下,这种协处理器有时被称为专用逻辑(例如,集成图形和/或科学(吞吐量)逻辑)或被称为专用核);4)片上系统,其可以在同一管芯上包括所描述的cpu(有时被称为(一个或多个)应用核或(一个或多个)应用处理器)、以上描述的协处理器、和附加功能。接下来描述示例性核架构,之后描述示例性处理器和计算机架构。
[0231]
顺序和乱序的核框图
[0232]
图11a是示出根据本公开的实施例的示例性顺序流水线和示例性寄存器重命名、乱序发布/执行流水线两者的框图。图11b是示出根据本公开的实施例的要被包括在处理器中的顺序架构核和示例性寄存器重命名、乱序发布/执行架构核两者的示例性实施例的框
图。图11a-b中的实线框示出了顺序流水线和顺序核,而可选择添加的虚线框示出了寄存器重命名、乱序发布/执行流水线和核。假定顺序方面是乱序方面的子集,将描述乱序方面。
[0233]
在图11a中,处理器流水线1100包括提取(fetch)阶段1102、长度解码阶段1104、解码阶段1106、分配阶段1108、重命名阶段1110、调度(也被称为调派或发布)阶段1112、寄存器读取/存储器读取阶段1114、执行阶段1116、写回/存储器写入阶段1118、异常处理阶段1122、和提交阶段(commit stage)1124。
[0234]
图11b示出了处理器核1190,其包括耦合到执行引擎单元1150的前端单元1130,并且执行引擎单元1150和前端单元1130两者都耦合到存储器单元1170。核1190可以是精简指令集计算(risc)核、复杂指令集计算(cisc)核、超长指令字(vliw)核、或混合或替代的核类型。作为另一种选择,核1190可以是专用核,例如,网络或通信核、压缩引擎、协处理器核、通用计算图形处理单元(gpgpu)核、图形核等。
[0235]
前端单元1130包括耦合到指令缓存单元1134的分支预测单元1132,指令缓存单元1134耦合到指令转换后备缓冲器(tlb)1136,指令转换后备缓冲器1136耦合到指令提取单元1138,指令提取单元1138耦合到解码单元1140。解码单元1140(或解码器)可以解码指令,并且生成作为输出的一个或多个微操作、微代码入口点、微指令、其他指令、或其他控制信号,它们解码自原始指令或以其他方式反映原始指令或导出自原始指令。可以使用各种不同的机制来实现解码单元1140。合适机制的示例包括但不限于查找表、硬件实现方式、可编程逻辑阵列(pla)、微代码只读存储器(rom)等。在一个实施例中,核1190包括微代码rom或存储用于某些宏指令的微代码的其他介质(例如,在解码单元1140中或在前端单元1130内)。解码单元1140耦合到执行引擎单元1150中的重命名/分配器单元1152。
[0236]
执行引擎单元1150包括重命名/分配器单元1152,其耦合到引退(retirement)单元1154和一组一个或多个调度器单元1156。(一个或多个)调度器单元1156表示任意数目的不同调度器,包括,预留站(reservations station)、中央指令窗等。(一个或多个)调度器单元1156耦合到(一个或多个)物理寄存器文件单元1158。每个物理寄存器文件单元1158表示一个或多个物理寄存器文件,这些物理寄存器文件中的不同的物理寄存器文件存储一个或多个不同的数据类型,例如,标量整数、标量浮点、打包整数、打包浮点、向量整数、向量浮点、状态(例如,作为要执行的下一指令的地址的指令指针)等。在一个实施例中,物理寄存器文件单元1158包括向量寄存器单元、写入掩码寄存器单元、和标量寄存器单元。这些寄存器单元可以提供架构向量寄存器、向量掩码寄存器、和通用寄存器。(一个或多个)物理寄存器文件单元1158与引退单元1154重叠,以说明寄存器重命名和乱序执行可以被实现的各种方式(例如,使用(一个或多个)重新排序缓冲器和(一个或多个)引退寄存器文件;使用(一个或多个)未来文件、(一个或多个)历史缓冲器、和(一个或多个)引退寄存器文件;使用寄存器图和寄存器池;等等)。引退单元1154和(一个或多个)物理寄存器文件单元1158耦合到(一个或多个)执行集群1160。(一个或多个)执行集群1160包括一组一个或多个执行单元1162和一组一个或多个存储器访问单元1164。执行单元1162可以对各种类型的数据(例如,标量浮点、打包整数、打包浮点、向量整数、向量浮点)执行各种操作(例如,移位、加法、减法、乘法)。虽然一些实施例可以包括专用于特定功能或功能集的多个执行单元,但是其他实施例可以仅包括一个执行单元或者全部执行所有功能的多个执行单元。(一个或多个)调度器单元1156、(一个或多个)物理寄存器文件单元1158、和(一个或多个)执行集群1160被
示为可能是多个,因为某些实施例针对某些类型的数据/操作创建单独的流水线(例如,标量整数流水线、标量浮点/打包整数/打包浮点/向量整数/向量浮点流水线、和/或存储器访问流水线,其中每个流水线都有自己的调度器单元、物理寄存器文件单元、和/或执行集群-并且在单独的存储器访问流水线的情况下,其中仅该流水线的执行集群具有(一个或多个)存储器访问单元1164的某些实施例被实现)。还应理解,在使用单独的流水线的情况下,这些流水线中的一个或多个可以是乱序发布/执行而其余的是顺序发布/执行的。
[0237]
该组存储器访问单元1164耦合到存储器单元1170,存储器单元1170包括耦合到数据缓存单元1174的数据tlb单元1172,其中数据缓存单元1174耦合到2级(l2)缓存单元1176。在一个示例性实施例中,存储器访问单元1164可以包括加载单元、存储地址单元、和存储数据单元,其中的每个单元耦合到存储器单元1170中的数据tlb单元1172。指令缓存单元1134还耦合到存储器单元1170中的2级(l2)缓存单元1176。l2缓存单元1176耦合到一个或多个其他级别的缓存并最终耦合到主存储器。
[0238]
作为示例,示例性寄存器重命名的乱序发布/执行核架构可以按如下方式实现流水线1100:1)指令提取1138执行提取和长度解码阶段1102和1104;2)解码单元1140执行解码阶段1106;3)重命名/分配器单元1152执行分配阶段1108和重命名阶段1110;4)(一个或多个)调度器单元1156执行调度阶段1112;5)(一个或多个)物理寄存器文件单元1158和存储器单元1170执行寄存器读取/存储器读取阶段1114;执行集群1160执行执行阶段1116;6)存储器单元1170和(一个或多个)物理寄存器文件单元1158执行写回/存储器写入阶段1118;7)异常处理阶段1122中可能涉及各个单元;8)引退单元1154和(一个或多个)物理寄存器文件单元1158执行提交阶段1124。
[0239]
核1190可以支持一个或多个指令集(例如,x86指令集(具有已经添加有较新版本的一些扩展);美国加利福尼亚州桑尼维尔市的mip technologies的mips指令集;美国加利福尼亚州桑尼维尔市的arm holdings的arm指令集(具有可选的附加扩展,例如,neon)),包括本文所描述的(一个或多个)指令。在一个实施例中,核1190包括支持打包数据指令集扩展(例如,avx1、avx2)的逻辑,从而允许要使用打包数据来执行的许多多媒体应用所使用的操作。
[0240]
应理解,核可以支持多线程(执行两个或更多个并行的操作集或线程集),并且可以以各种方式这样做,这些方式包括时间分片多线程、同时多线程(其中,单个物理核为该物理核正在同时进行多线程的每个线程提供逻辑核)、或它们的组合(例如,时间分片的提取和解码以及此后同时的多线程,例如,在超线程技术中)。
[0241]
虽然在乱序执行的上下文中描述了寄存器重命名,但应理解,寄存器重命名可以用在顺序架构中。虽然所示处理器的实施例还包括单独的指令和数据缓存单元1134/1174以及共享的l2缓存单元1176,但替代实施例可以具有用于指令和数据两者的单个内部缓存,例如,1级(l1)内部缓存、或多级内部缓存。在一些实施例中,系统可以包括内部缓存和外部缓存的组合,其中外部缓存在核和/或处理器外部。替代地,全部缓存可以在核和/或处理器外部。
[0242]
具体示例性顺序核架构
[0243]
图12a-b示出了更具体的示例性顺序核架构的框图,其中核将是芯片中的若干逻辑块(可能包括相同类型和/或不同类型的其他核)中的一个逻辑块。逻辑块通过高带宽互
连网络(例如,环形网络)与某固定功能逻辑、存储器i/o接口、和其他必要的i/o逻辑通信,这取决于应用。
[0244]
图12a是根据本公开实施例的单个处理器核以及其与管芯上互连网络1202的连接以及其在2级(l2)缓存1204的本地子集的框图。在一个实施例中,指令解码单元1200支持具有打包数据指令集扩展的x86指令集。l1缓存1206允许低等待时间的访问以将存储器缓存到标量和向量单元中。虽然在一个实施例中(为了简化设计),标量单元1208和向量单元1210使用单独的寄存器组(分别为标量寄存器1212和向量寄存器1214),并且它们之间传输的数据被写入到存储器然后从1级(l1)缓存1206中读回,但是本公开的替代实施例可以使用不同的方法(例如,使用单个寄存器组或包括允许数据在两个寄存器文件(file)之间传输而不被写入和读回的通信路径)。
[0245]
l2缓存的本地子集1204是全局l2缓存的一部分,全局l2缓存被划分为分开的本地子集,每个处理器核一个本地子集。每个处理器核具有到其自己的l2缓存的本地子集1204的直接访问路径。由处理器核读取的数据被存储在其l2缓存子集1204中并且可以与访问它们自己的本地l2缓存子集的其他处理器核并行地被快速访问。由处理器核写入的数据被存储在其自己的l2缓存子集1204中,并且在需要的情况下被从其他子集冲刷(flushed)。环形网络确保共享数据的一致性。环形网络是双向的,以允许诸如处理器核、l2缓存、和其他逻辑块之类的代理在芯片内彼此通信。每个环形数据路径在每个方向上为1012位宽。
[0246]
图12b是根据本公开实施例的图12a中的处理器核的一部分的展开图。图12b包括l1缓存1206的l1数据缓存1206a部分,以及关于向量单元1210和向量寄存器1214的更多细节。具体地,向量单元1210是16宽的向量处理单元(vpu)(参见16宽的alu 1228),它执行整数、单精度浮点、和双精度浮点指令中的一个或多个。vpu支持通过调配单元1220对寄存器输入进行调配,使用数字转换单元1222a-b进行数字转换,以及使用复制单元1224对存储器输入进行复制。写入掩码寄存器1226允许预测得到向量写入。
[0247]
图13是根据本公开实施例的可具有不止一个核、可具有集成存储器控制器、且可具有集成图形的处理器1300的框图。图13中的实线框示出了具有单核1302a(和相应的缓存单元1304a)、系统代理1310、和一组一个或多个总线控制器单元1316的处理器1300;但虚线框的可选添加示出了具有以下各项的替代处理器1300:多个核1302a-n(和相应的缓存单元1304a-n)、系统代理单元1310中的一组一个或多个集成存储器控制器单元1314、以及专用逻辑1308。
[0248]
因此,处理器1300的不同实现方式可以包括:1)具有专用逻辑1308的cpu(其中专用逻辑是集成图形和/或科学(吞吐量)逻辑(其可以包括一个或多个核)),以及核1302a-n(其是一个或多个通用核(例如,通用顺序核、通用乱序核、或两者的组合);2)具有核1302a-n的协处理器(其中核1302a-n是主要用于图形和/或科学(吞吐量)的大量专用核);3)具有核1302a-n的协处理器(其中核1302a-n是大量通用顺序核)。因此,处理器1300可以是通用处理器、协处理器、或专用处理器,例如,网络或通信处理器、压缩引擎、图形处理器、gpgpu(通用图形处理单元)、高吞吐量的许多集成核(mic)协处理器(包括30个或更多个核)、嵌入式处理器等等。处理器可以在一个或多个芯片上实现。处理器1300可以是一个或多个衬底的一部分和/或可以通过使用多种工艺技术(例如,bicmos、cmos或nmos)中的任何一种来在一个或多个衬底上实现。
[0249]
存储器层级包括核内的一个或多个级别的缓存、一组或一个或多个共享缓存单元1306、以及耦合到该组集成存储器控制器单元1314的外部存储器(未示出)。该组共享缓存单元1306可以包括一个或多个中级缓存(例如,2级(l2)、3级(l3)、4级(l4)),或其他级别的缓存、最后级别缓存(llc)、和/它们的组合。虽然在一个实施例中,基于环的互连单元1312对集成图形逻辑1308、该组共享缓存单元1306、以及系统代理单元1310/(一个或多个)集成存储器控制器单元1314进行互连,但替代实施例可以使用任何数目的众所周知的技术来互连这些单元。在一个实施例中,在一个或多个缓存单元1306和核1302a-n之间维持一致性。
[0250]
在一些实施例中,核1302a-n中的一个或多个核能够进行多线程。系统代理1310包括协调和操作核1302a-n的那些组件。系统代理单元1310可以包括例如电源控制单元(pcu)和显示单元。pcu可以是或可以包括调节核1302a-n和集成图形逻辑1308的功率状态所需的逻辑和组件。显示单元用于驱动一个或多个外部连接的显示器。
[0251]
核1302a-n在架构指令集方面可以是同构的或异构的;也就是说,核1302a-n中的两个或更多个核可能能够执行相同的指令集,而其他核可能能够执行仅该指令集的子集或不同的指令集。
[0252]
示例性计算机架构
[0253]
图14-17是示例性计算机架构的框图。用于膝上型计算机、台式计算机、手持式pc、个人数字助理、工程工作站、服务器、网络设备、网络集线器、交换机、嵌入式处理器、数字信号处理器(dsp)、图形设备、视频游戏设备、机顶盒、微控制器、蜂窝电话、便携式媒体播放器、手持设备、和各种其他电子设备的本领域已知的其他系统设计和配置也是适合的。通常,能够结合本文所公开的处理器和/或其他执行逻辑的各种各样的系统或电子设备通常是合适的。
[0254]
现在参考图14,示出了根据本公开的一个实施例的系统1400的框图。系统1400可以包括一个或多个处理器1410、1415,其耦合到控制器集线器1420。在一个实施例中,控制器集线器1420包括图形存储器控制器集线器(gmch)1490和输入/输出集线器(ioh)1450(可以在分开的芯片上);gmch 1490包括耦合到存储器1440和协处理器1445的存储器和图形控制器;ioh 1450将输入/输出(i/o)设备1460耦合到gmch 1490。替代地,存储器和图形控制器中的一个或两个被集成在处理器内(如本文所描述的),存储器1440和协处理器1445直接耦合到处理器1410,以及具有ioh 1450的单个芯片中的控制器集线器1420。
[0255]
图14中用虚线表示附加处理器1415的可选性质。每个处理器1410、1415可以包括本文所描述的处理核中的一个或多个,并且可以是处理器1300的某个版本。
[0256]
存储器1440可以是例如动态随机存取存储器(dram)、相变存储器(pcm)、或这两者的组合。对于至少一个实施例,控制器集线器1420经由多点总线(multi-drop bus)与(一个或多个)处理器1410、1415通信,该多点总线例如是前端总线(fsb)、诸如quickpath互连(qpi)之类的点对点接口、或类似的连接1495。
[0257]
在一个实施例中,协处理器1445是专用处理器,例如,高吞吐量mic处理器、网络或通信处理器、压缩引擎、图形处理器、gpgpu、嵌入式处理器等。在一个实施例中,控制器集线器1420可以包括集成图形加速器。
[0258]
在物理资源1410、1415之间在包括架构特性、微架构特性、热特性、功耗特性等的指标度量的范围方面可存在各种差异。
[0259]
在一个实施例中,处理器1410执行控制一般类型的数据处理操作的指令。嵌入在指令内的可以是协处理器指令。处理器1410将这些协处理器指令识别为应该由所附接的协处理器1445执行的类型。因此,处理器1410将这些协处理器指令(或表示协处理器指令的控制信号)发布到协处理器总线或其它互连上,以到协处理器1445。(一个或多个)协处理器1445接受并执行所接收的协处理器指令。
[0260]
现在参考图15,示出了根据本公开的实施例的第一更具体的示例性系统1500的框图。如图15所示,多处理器系统1500是点对点互连系统,并且包括经由点对点互连1550耦合的第一处理器1570和第二处理器1580。处理器1570和1580中的每一个处理器可以是处理器1300的某个版本。在本公开的一个实施例中,处理器1570和1580分别是处理器1410和1415,而协处理器1538是协处理器1445。在另一个实施例中,处理器1570和1580分别是处理器1410和协处理器1445。
[0261]
处理器1570和1580被示出为分别包括集成存储器控制器(imc)单元1572和1582。处理器1570还包括作为其总线控制器单元的一部分的点对点(p-p)接口1576和1578;类似地,第二处理器1580包括p-p接口1586和1588。处理器1570、1580可以使用p-p接口电路1578、1588经由点对点(p-p)接口1550来交换信息。如图15所示,imc1572和1582将处理器耦合到相应的存储器(即,存储器1532和存储器1534),这些存储器可以是本地附接到相应处理器的主存储器的一部分。
[0262]
处理器1570、1580可以各自使用点对点接口电路1576、1594、1586、1598经由各个p-p接口1552、1554来与芯片集1590交换信息。芯片集1590可以可选地经由高性能接口1592、1539来与协处理器1538交换信息。在一个实施例中,协处理器1538是专用处理器,例如,高吞吐量mic处理器、网络或通信处理器、压缩和/或解压缩引擎、图形处理器、gpgpu、嵌入式处理器等。
[0263]
共享缓存(未示出)可以被包括在任一处理器中,或者在两个处理器外部但经由p-p互连与处理器连接,使得在处理器进入低功率模式的情况下,任一或两个处理器的本地缓存信息可以被存储在共享缓存中。
[0264]
芯片集1590可以经由接口1596耦合到第一总线1516。在一个实施例中,第一总线1516可以是外围组件互连(pci)总线,或诸如pci express总线或另一第三代i/o互连总线之类的总线,但本公开的范围不限于此。
[0265]
如图15所示,各种i/o设备1514可以耦合到第一总线1516,以及将第一总线1516耦合到第二总线1520的总线桥1518。在一个实施例中,一个或多个附加处理器1515(例如,协处理器、高吞吐量mic处理器、gpgpu、加速器(例如,图形加速器或数字信号处理(dsp)单元)、现场可编程门阵列、或任何其他处理器)耦合到第一总线1516。在一个实施例中,第二总线1520可以是低引脚数(lpc)总线。在一个实施例中,各种设备可以耦合到第二总线1520,包括,例如键盘和/或鼠标1522、通信设备1527、和诸如磁盘驱动器或其他大容量存储设备之类的存储装置1528(其可以包括指令/代码和数据1530)。此外,音频i/o 1524可以耦合到第二总线1520。注意,可能有其他架构。例如,代替图15的点对点架构,系统可以实现多点(multi-drop)总线或其他这样的架构。
[0266]
现在参考图16,示出了根据本公开的实施例的第二更具体的示例性系统1600的框图。图15和16中的相似的元件具有相似的附图标记,并且图15中的某些方面已从图16中省
略,以避免模糊图16的其他方面。
[0267]
图16示出了处理器1570、1580可以分别包括集成存储器和i/o控制逻辑(“cl”)1572和1582。因此,cl 1572、1582包括集成存储器控制器单元并包括i/o控制逻辑。图16示出了不仅存储器1532、1534耦合到cl 1572、1582,而且i/o设备1614也耦合到控制逻辑1572、1582。传统(legacy)i/o设备1615耦合到芯片集1590。
[0268]
现在参考图17,示出了根据本公开的实施例的soc 1700的框图。图13中的相似的元件具有相似的附图标记。此外,虚线框是更高级soc上的可选功能。在图17中,(一个或多个)互连单元1702耦合到以下各项:应用处理器1710,其包括一组一个或多个核202a-n和(一个或多个)共享缓存单元1306;系统代理单元1310;(一个或多个)总线控制器单元1316;(一个或多个)集成存储器控制器单元1314;一组或一个或多个协处理器1720,其可以包括集成图形逻辑、图像处理器、音频处理器和视频处理器;静态随机存取存储器(sram)单元1730;直接存储器存取(dma)单元1732;以及显示单元1740,用于耦合到一个或多个外部显示器。在一个实施例中,(一个或多个)协处理器1720包括专用处理器,例如,网络或通信处理器、压缩引擎、gpgpu、高吞吐量mic处理器、嵌入式处理器等。
[0269]
本文公开的机制的实施例可以以硬件、软件、固件或这些实现方法的组合来实现。本公开的实施例可以实现为在可编程系统上执行的计算机程序或程序代码,该可编程系统包括至少一个处理器,存储系统(包括易失性和非易失性存储器和/或存储元件),至少一个输入设备及至少一个输出设备。
[0270]
程序代码(例如图15中所示的代码1530)可以应用于输入指令以执行本文描述的功能并生成输出信息。输出信息可以以已知的方式应用于一个或多个输出设备。对于本申请,处理系统包括具有处理器的任何系统,例如,数字信号处理器(dsp)、微控制器、专用集成电路(asic)或微处理器。
[0271]
程序代码可以以高级过程或面向对象的编程语言实现,以与处理系统通信。如果需要,程序代码也可以用汇编语言或机器语言实现。实际上,本文描述的机制不限于任何特定编程语言的范围。在任何情况下,该语言可以是经编译或解析的语言。
[0272]
至少一个实施例的一个或多个方面可以通过存储在机器可读介质上的代表性指令来实现,该代表性指令表示处理器内的各种逻辑,当由机器读取时使得机器构造逻辑以执行本文所描述的技术。这种称为“ip核”的表示可以存储在有形机器可读介质上,并提供给各种客户或制造设施,以加载到实际制造逻辑或处理器的制造机器中。
[0273]
这样的机器可读存储介质可以包括但不限于由机器或设备制造或形成的物品的非暂时性有形布置,包括诸如硬盘之类的存储介质,任何其他类型的盘,包括软盘、光盘、光盘只读存储器(cd-rom)、光盘可擦写(cd-rw)和磁光盘、半导体设备(如只读存储器(rom))、随机存取存储器(ram)(如动态随机存取存储器(dram)、静态随机存取存储器(sram))、可擦除可编程只读存储器(eprom)、闪存、电可擦除可编程只读存储器(eeprom)、相变存储器(pcm)、磁卡或光学卡或适用于存储电子指令的任何其他类型的介质。
[0274]
因此,本公开的实施例还包括非暂时性实体机器可读介质,其包含指令或包含设计数据,例如硬件描述语言(hdl),其定义本文描述的结构、电路、装置、处理器和/或系统特征。这些实施例也可以被称为程序产品。
[0275]
仿真(包括二进制转换、代码变形等)
[0276]
在一些情况下,指令转换器可用于将指令从源指令集转换为目标指令集。例如,指令转换器可以转换(例如,使用静态二进制转换,包括动态编译的动态二进制转换)、变形、仿真或以其他方式将指令转换为要由核处理的一个或多个其他指令。指令转换器可以用软件、硬件、固件或其组合来实现。指令转换器可以在处理器上、处理器外或者部分在处理器上、部分在处理器外。
[0277]
图18是根据本公开实施例的对照使用软件指令转换器将源指令集中的二进制指令转换为目标指令集中的二进制指令的框图。在所示实施例中,指令转换器是软件指令转换器,但替代地,指令转换器可以用软件、固件、硬件、或其各种组合来实现。图18示出了采用高级语言1802的程序可以使用x86编译器1804来编译以生成x86二进制代码1806,其可以由具有至少一个x86指令集核的处理器1816本地执行。具有至少一个x86指令集核的处理器1816表示可以通过进行以下操作来执行与具有至少一个x86指令集核的intel处理器基本上相同的功能,从而实现与具有至少一个x86指令集核的intel处理器基本上相同的结果的任何处理器:兼容地执行或以其他方式处理(1)intel x86指令集核的指令集的大部分或者(2)目标为在具有至少一个x86指令集核的intel处理器上运行的应用或其他软件的目标代码版本。x86编译器1804表示可操作以生成x86二进制代码1806(例如,目标代码)的编译器,其中二进制代码可以在具有或不具有附加链接处理的情况下在具有至少一个x86指令集核的处理器1816上被执行。类似地,图18示出了采用高级语言1802的程序可以使用替代指令集编译器1808来编译以生成替代指令集二进制代码1810,该二进制代码可以由没有至少一个x86指令集核的处理器1814(例如,具有执行美国加利福尼亚州桑尼维尔市的mips technologies的mips指令集和/或执行美国加利福尼亚州桑尼维尔市的arm holdings的arm指令集的核的处理器)本地执行。指令转换器1812用于将x86二进制代码1806转换为可由不具有x86指令集核的处理器1814本地执行的代码。该转换后的代码不太可能与替代指令集二进制代码1810相同,因为很难制造出能够实现它的指令转换器;但是,转换后的代码将完成一般操作,并由来自替代指令集的指令组成。因此,指令转换器1812表示通过仿真、模拟、或任何其他过程来允许不具有x86指令集处理器或核的处理器或其他电子设备执行x86二进制代码1806的软件、固件、硬件、或其组合。
[0278]
本领域技术人员可以确定许多其他改变、替换、变化、更改和修改,并且本公开涵盖落入所附权利要求书的范围内的所有这些改变、替换、变化、更改和修改。
[0279]
示例实施方式
[0280]
以下示例涉及贯穿本公开描述的实施例。
[0281]
一个或多个实施例可以包括矩阵处理器,该矩阵处理器包括:用于存储矩阵操作数和跨步读取序列的存储器,其中:矩阵操作数被乱序地存储在存储器中,并且跨步读取序列包括用于以正确的顺序从存储器中读取矩阵操作数的读取操作序列;用于接收要由矩阵处理器执行的第一指令的控制电路,其中第一指令用于指示矩阵处理器对矩阵操作数执行第一操作;用于基于跨步读取序列从存储器中读取矩阵操作数的读取电路;以及用于通过对矩阵操作数执行第一操作来执行第一指令的执行电路。
[0282]
在矩阵处理器的一个示例实施例中,读取操作序列包括以下一者或多者:用于在跨步存储器地址处读取存储器的跨步读取操作,其中跨步存储器地址相对于先前存储器地址偏移了跨步偏移量;或者用于在先前存储器地址之后的一个或多个顺序存储器地址处读
取存储器的带区读取操作。
[0283]
在矩阵处理器的一个示例实施例中,用于基于跨步读取序列从存储器中读取矩阵操作数的读取电路还用于:经由读取操作的多次迭代从存储器中读取矩阵操作数,其中:读取操作的每次迭代开始于存储器的相应起始存储器地址;跨步读取序列在读取操作的每次迭代中至少部分地被执行;并且相应起始存储器地址在读取操作的多次迭代之间递增了超跨步偏移量。
[0284]
在矩阵处理器的一个示例实施例中,用于经由读取操作的多次迭代从存储器中读取矩阵操作数的读取电路还用于:连续执行读取操作的多次迭代,直到执行了预定数量的读取操作。
[0285]
在矩阵处理器的一个示例实施例中:控制电路还用于接收要由矩阵处理器执行的第二指令,其中:第二指令要在第一指令之前被接收;第二指令用于指示矩阵处理器寄存矩阵操作数的标识符,其中标识符要基于指示矩阵操作数在存储器中的存储器占用的一个或多个参数而被寄存,并且其中标识符用于使矩阵操作数能够在后续指令中被识别;并且第一指令包括指示矩阵操作数的标识符的第一参数。
[0286]
在矩阵处理器的一个示例实施例中,控制电路还用于接收要由矩阵处理器执行的第二指令,其中第二指令要在第一指令之前被接收,并且其中第二指令用于指示矩阵处理器将跨步读取序列编程到存储器中。
[0287]
在矩阵处理器的一个示例实施例中:矩阵操作数包括以第一顺序布置的多个维度;该多个维度以不同于第一顺序的第二顺序被布置在存储器中;并且跨步读取序列被编程为执行维度重新排列操作以将多个维度从第二顺序重新排序为第一顺序。
[0288]
在矩阵处理器的一个示例实施例中:矩阵操作数被存储在存储器中的多个非连续存储器地址处;跨步读取序列被编程为执行切片操作以从存储器的多个非连续存储器地址处提取矩阵操作数。
[0289]
在矩阵处理器的一个示例实施例中,存储器包括:用于存储矩阵操作数的第一存储器;以及用于存储跨步读取序列的第二存储器。
[0290]
一个或多个实施例可以包括至少一种非暂态机器可访问存储介质,具有存储在其上的指令,其中,当指令在机器上被执行时,该指令使机器:接收要由矩阵处理器执行的第一指令,其中第一指令用于指示矩阵处理器对矩阵操作数执行第一操作,其中矩阵操作数被乱序地存储在矩阵处理器的存储器中;访问存储在存储器中的跨步读取序列,其中跨步读取序列包括用于以正确的顺序从存储器中读取矩阵操作数的读取操作序列;基于跨步读取序列从存储器中读取矩阵操作数;以及使第一指令由所述矩阵处理器执行,其中第一指令要通过对矩阵操作数执行第一操作来执行。
[0291]
在存储介质的一个示例实施例中,读取操作序列包括以下一者或多者:用于在跨步存储器地址处读取存储器的跨步读取操作,其中跨步存储器地址相对于先前存储器地址偏移了跨步偏移量;或者用于在先前存储器地址之后的一个或多个顺序存储器地址处读取存储器的带区读取操作。
[0292]
在存储介质的一个示例实施例中,使机器基于跨步读取序列从存储器中读取矩阵操作数的指令还使机器:经由读取操作的多次迭代从存储器中读取矩阵操作数,其中:读取操作的每次迭代开始于存储器的相应起始存储器地址;跨步读取序列在读取操作的每次迭
代中至少部分地被执行;相应起始存储器地址在读取操作的多次迭代之间递增了超跨步偏移量。
[0293]
在存储介质的一个示例实施例中,使机器经由读取操作的多次迭代从存储器中读取矩阵操作数的指令还使机器:连续地执行读取操作的多次迭代,直到执行了预定数量的读取操作。
[0294]
在存储介质的一个示例实施例中:指令还使机器接收要由矩阵处理器执行的第二指令,其中:第二指令要在第一指令之前被接收;并且第二指令用于指示矩阵处理器寄存矩阵操作数的标识符,其中标识符要基于指示矩阵操作数在存储器中的存储器占用的一个或多个参数而被寄存,并且标识符用于使矩阵操作数能够在后续指令中被识别;并且第一指令包括指示矩阵操作数的标识符的第一参数。
[0295]
在存储介质的一个示例实施例中,指令还使机器接收要由矩阵处理器执行的第二指令,其中第二指令要在第一指令之前被接收,并且其中第二指令用于指示矩阵处理器将跨步读取序列编程到存储器中。
[0296]
在存储介质的一个示例实施例中:矩阵操作数包括以第一顺序布置的多个维度;该多个维度以不同于第一顺序的第二顺序布置在存储器中;并且跨步读取序列被编程为执行维度重新排列操作以将多个维度从第二顺序重新排序为第一顺序。
[0297]
在存储介质的一个示例实施例中:矩阵操作数被存储在存储器中的多个非连续存储器地址处;并且跨步读取序列被编程为执行切片操作以从存储器中多个非连续存储器地址处提取矩阵操作数。
[0298]
在存储介质的一个示例实施例中,存储器包括:用于存储矩阵操作数的第一存储器;以及用于存储跨步读取序列的第二存储器。
[0299]
一个或多个实施例可以包括一种方法,包括:接收要由矩阵处理器执行的第一指令,其中,第一指令用于指示矩阵处理器对矩阵操作数执行第一操作,其中,矩阵操作数被乱序地存储在矩阵处理器的存储器中;访问存储在存储器中的跨步读取序列,其中跨步读取序列包括用于以正确的顺序从存储器中读取矩阵操作数的读取操作序列;基于跨步读取序列从存储器中读取矩阵操作数;以及使第一指令由所述矩阵处理器执行,其中第一指令要通过对矩阵操作数执行第一操作来执行。
[0300]
在方法的一个示例实施例中,读取操作序列包括以下一者或多者:用于在跨步存储器地址处读取存储器的跨步读取操作,其中,跨步存储器地址相对于先前存储器地址偏移了跨步偏移量;或者用于在先前存储器地址之后的一个或多个顺序存储器地址处读取存储器的带区读取操作。
[0301]
在方法的一个示例实施例中,基于跨步读取序列从存储器中读取矩阵操作数包括:经由读取操作的多次迭代从存储器中读取矩阵操作数,其中:读取操作的每次迭代开始于存储器的相应起始存储器地址处;跨步读取序列在读取操作的每次迭代中至少部分地被执行;相应起始存储器地址在读取操作的多次迭代之间递增了超跨步偏移量。
[0302]
在方法的一个示例实施例中,该方法还包括:接收要由矩阵处理器执行的第二指令,其中:第二指令要在第一指令之前被接收;第二指令用于指示矩阵处理器寄存矩阵操作数的标识符,其中标识符要基于指示矩阵操作数在存储器中的存储器占用的一个或多个参数而被寄存,并且标识符将用于使矩阵操作数能够在后续指令中被识别;并且其中第一指
令包括指示矩阵操作数的标识符的第一参数。
[0303]
一个或多个实施例可以包括一种系统,包括:主机处理器;以及矩阵处理器,包括:用于存储矩阵操作数和跨步读取序列的存储器,其中:矩阵操作数被乱序地存储在存储器中,跨步读取序列包括用于以正确的顺序从存储器中读取矩阵操作数的读取操作序列;用于接收要由矩阵处理器执行的第一指令的控制电路,其中第一指令用于指示矩阵处理器对矩阵操作数执行第一操作,并且其中第一指令要从主机处理器处被接收;用于基于跨步读取序列从存储器中读取矩阵操作数的读取电路;以及用于通过对矩阵操作数执行第一操作来执行第一指令的执行电路。
[0304]
在系统的一个示例实施例中,读取操作序列包括以下一者或多者:用于在跨步存储器地址处读取存储器的跨步读取操作,其中,跨步存储器地址相对于先前存储器地址偏移了跨步偏移量;或者用于在先前存储器地址之后的一个或多个顺序存储器地址处读取存储器的带区读取操作。
[0305]
在系统的一个示例实施例中,基于跨步读取序列从存储器中读取矩阵操作数的读取电路还用于:经由读取操作的多次迭代从存储器中读取矩阵操作数,其中:读取操作的每次迭代开始于存储器的相应起始存储器地址;跨步读取序列在读取操作的每次迭代中至少部分地被执行;相应起始存储器地址在读取操作的多次迭代之间递增了超跨步偏移量。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1