将预定义填补值插入到向量流中

文档序号:453370 发布日期:2021-12-28 浏览:9次 >En<

阅读说明:本技术 将预定义填补值插入到向量流中 (Inserting predefined padding values into a vector stream ) 是由 A·巴德瓦杰 T·D·安德森 S·H·德兰 于 2020-05-25 设计创作,主要内容包括:在计算机系统内的处理器上执行软件指令以使蒸汽机配置有流参数(4700)以定义多维数组。所述流参数定义所述多维数组的每一维度的大小及填补值指示符。响应于所述流参数而从耦合到所述串流引擎的存储器获取(4702)数据。由从存储器获取的所述数据形成(4703)响应于所述流参数的所述多维数组的向量流。形成(4706)包含指定填补值的经填补流向量,无需从系统存储器存取所述填补值。(Executing software instructions on a processor within the computer system to configure the steam engine with flow parameters (4700) to define a multi-dimensional array. The stream parameters define a size and a padding value indicator for each dimension of the multi-dimensional array. Retrieving (4702) data from a memory coupled to the streaming engine in response to the flow parameters. Forming (4703) a vector stream responsive to the multi-dimensional array of stream parameters from the data retrieved from memory. Forming (4706) a padded flow vector that includes a specified padding value that need not be accessed from system memory.)

将预定义填补值插入到向量流中

本发明涉及使用串流引擎将填补值插入到向量流中。

背景技术

数字信号处理器(DSP)经优化用于处理可从各个输入信号导出的数据流,例如传感器数据、视频流、语音信道、雷达信号、生物医学信号等。对实时数据操作的数字信号处理器可接收输入数据流、对数据流执行滤波功能(例如编码或解码)及输出经变换数据流。系统被称为实时的,因为如果经变换数据流在调度时无法用于输出,那么应用失败。一些视频编码需要可预测但非顺序的输入数据模式。此类应用需要存储器存取在数据寄存器文件中加载数据寄存器且接着将数据从数据寄存器供应到执行数据处理的功能单元。

一或多个DSP处理核心可与各个外围电路、存储器块等组合于单个集成电路(IC)裸片上以形成芯片上系统(SoC)。这些系统可包含共享芯片上及芯片外存储器的使用的多个互连处理器。处理器可包含改进处理的指令高速缓存(ICache)与数据高速缓存(DCache)的某组合。此外,具有共享存储器的多个处理器可经并入于单个嵌入式系统中。处理器可物理共享相同存储器而无需存取数据或执行定位于相同存储器位置中的代码,或可将共享存储器的某部分作为共同共享存储器。

发明内容

提供方法及设备来使软件指令在计算机系统内的处理器上执行以使蒸汽机配置有流参数以定义多维数组。所述流参数定义所述多维数组的每一维度的大小及指定填补值指示符。响应于所述流参数而从耦合到所述串流引擎的存储器获取数据。由从存储器获取的所述数据形成响应于所述流参数的所述多维数组的向量流。形成包含指定填补值的经填补流向量,无需从系统存储器存取所述填补值。

附图说明

图1说明实例双标量/向量数据路径处理器。

图2说明图1中说明的双标量/向量数据路径处理器中的寄存器及功能单元。

图3说明全局标量寄存器文件。

图4说明由算术功能单元共享的局部标量寄存器文件。

图5说明由乘法功能单元共享的局部标量寄存器文件。

图6说明由加载/存储单元共享的局部标量寄存器文件。

图7说明全局向量寄存器文件。

图8说明断言寄存器文件。

图9说明由算术功能单元共享的局部向量寄存器文件。

图10说明由乘法及相关功能单元共享的局部向量寄存器文件。

图11说明处理单元的管线阶段。

图12说明单个获取包的16个指令。

图13说明指令的指令编码的实例。

图14说明条件码扩展槽0的位编码。

图15说明条件码扩展槽1的位编码。

图16说明常数扩展槽0的位编码。

图17是说明常数扩展的部分框图。

图18说明SIMD操作的进位控制。

图19说明串流引擎的概念图。

图20说明格式化操作序列。

图21说明向量中的通道分配的实例。

图22说明向量中的通道分配的实例。

图23说明基本二维(2D)流。

图24说明图23的实例流内的元素顺序。

图25说明从较大矩形提取较小矩形。

图26说明实例串流引擎如何以4个字节的转置粒度获取流。

图27说明实例串流引擎如何以8个字节的转置粒度获取流。

图28说明实例串流引擎的细节。

图29说明实例流模板寄存器。

图30说明图29的实例流模板寄存器的旗标字段的子字段定义。

图31说明向量长度遮蔽/群组复制块的实例。

图32是串流引擎有效或无效指示的产生的实例的部分示意图。

图33是说明循环地址及循环计数的产生的串流引擎地址产生器的部分示意图。

图34说明展示此实例的数据的串流引擎供应的部分示意图。

图35说明展示有效数据到断言单元的串流引擎供应的部分示意图。

图36是包含矩阵乘法加速器及图28的串流引擎的系统的框图。

图37说明矩阵乘法的实例。

图38是图28的串流引擎的一部分的更详细框图。

图39、40、41、42及43说明通过图28的串流引擎的实例线性流传送。

图44A、44B一起说明子矩阵如何通过图28的串流引擎来扩增空向量用于矩阵乘法。

图45说明将空向量添加到流。

图46到47说明通过图28的串流引擎插入零或预定义数据向量来形成流。

图48是包含图28的串流引擎的多处理器系统的框图。

具体实施方式

在图式中,为了保持一致,相同元件由相同元件符号标示。

数字信号处理器(DSP)经优化用于处理可从各个输入信号导出的数据流,例如传感器数据、视频流、语音信道、雷达信号、生物医学信号等。数字信号处理器在对实时数据操作时关心存储器带宽及调度。实例DSP包含用于改进存储器带宽及数据调度的串流引擎。

一或多个DSP可与各个外围电路、存储器块等组合于单个集成电路(IC)裸片上以形成芯片上系统(SoC)。见例如通过引用方式并入本文中的“66AK2Hx MulticoreKeystoneTM 芯片上系统(66AK2Hx Multicore KeystoneTM System-on-Chip)”(2013年)。

在一些实例处理器中,自主串流引擎(SE)经耦合到DSP。在此实例中,串流引擎包含可同时管理两个数据流的两个紧密耦合的串流引擎。在另一实例中,串流引擎能够仅管理单个流,而在其它实例中,串流引擎能够处置多于两个流。在每一情况中,针对每一流,串流引擎包含地址产生阶段、数据格式化阶段及用于等待处理器消耗的格式化数据的某存储。在本文中描述的实例中,地址从可涉及多维循环的算法导出,每一维度维持迭代计数。在一个实例中,串流引擎支持六级嵌套迭代。在其它实例中,支持更多或更少级迭代。

在一些实例处理器中,控制逻辑及对准网络使串流引擎能够形成空向量或经填补向量且将其插入到流中,无需从系统存储器存取空数据或填补值。

形成空向量及经填补向量的若干实例关于图36到48更详细描述。

参考图1到18描述实例DSP处理器。能够使用六维嵌套循环管理两个数据流的实例串流引擎参考图19到35描述。

图1说明包含双标量/向量数据路径115、117的实例处理器100。如本文中使用,术语“向量”是指可被存取且操作为一单位的一维数据元素数组。处理器100包含本文中更详细描述的串流引擎125。处理器100包含单独级1指令高速缓存(L1I)121及级1数据高速缓存(L1D)123。处理器100包含保存指令及数据两者的级2(L2)组合指令/数据高速缓存130。图1说明L1I高速缓存与L2组合指令/数据高速缓存130之间的连接,512位总线142。图1说明L1D高速缓存123与L2组合指令/数据高速缓存130之间的连接,512位总线145。在实例处理器100中,L2组合指令/数据高速缓存130存储支持L1I高速缓存121的指令及支持L1D高速缓存123的数据两者。在此实例中,L2组合指令/数据高速缓存130使用图1中未说明的已知或后期开发的存储器系统技术进一步连接到更高级高速缓存及/或主存储器。如本文中使用,术语“更高级”存储器或高速缓存是指存储器阶层中的更远离处理器的下一级,而术语“更低级”存储器或高速缓存是指存储器阶层中更靠近处理器的级。在各个实例中,L1I高速缓存121、L1D高速缓存123及L2高速缓存130可以不同大小实施。在此实例中,L1I高速缓存121及L1D高速缓存123各自是32K字节,且L2高速缓存130是1024K字节。在实例处理器100中,L1I高速缓存121、L1D高速缓存123及L2组合指令/数据高速缓存130经形成于单个集成电路上。此单个集成电路任选地包含其它电路。

处理单元核心110从L1I高速缓存121获取指令,如由指令获取单元111控制。指令获取单元111确定待执行的接下来指令且调用一组获取包大小的此类指令。下文进一步详述获取包的性质及大小。如果指令存储于L1I高速缓存121中,那么指令在高速缓存命中之后直接从L1I高速缓存121获取。在高速缓存缺失发生之后,当指定指令未存储于L1I高速缓存121中时,在L2组合高速缓存130中寻找指令。在此实例中,L1I高速缓存121中高速缓存行的大小等于获取包的大小,其是512个位。这些指令的存储器位置是L2组合高速缓存130中的命中或缺失。命中由L2组合高速缓存130提供服务。缺失由更高级高速缓存(未说明)或由主存储器(未说明)提供服务。在此实例中,所请求的指令同时供应到L1I高速缓存121及处理单元核心110两者以加速使用。

在此实例中,处理单元核心110包含多个功能单元以执行指令指定数据处理任务。指令分派单元112确定每一获取指令的目标功能单元。在此实例中,处理单元110操作为能够同时对对应功能单元中的多个指令操作的超长指令字(VLIW)处理器。编译器将指令组织于一起执行的执行包中。指令分派单元112将每一指令引导到其目标功能单元。指派给指令的功能单元完全由编译器产生的指令指定。处理单元核心110的硬件不参与功能单元指派。在此实例中,指令分派单元112对若干指令并行操作。此类并行指令的数目由执行包的大小设置。此在本文中进一步描述。

指令分派单元112的分派任务的一部分是确定指令是在标量数据路径侧A 115还是向量数据路径侧B 116中的功能单元上执行。每一指令内称为s位的指令位确定指令控制哪一数据路径。此在本文中进一步描述。

指令解码单元113解码当前执行包中的每一指令。解码包含识别执行指令的功能单元、识别用于从可能寄存器文件中供应对应数据处理操作的数据的寄存器及识别对应数据处理操作的结果的寄存器目的地。如下文进一步描述,指令可包含常数字段来代替一个寄存器编号操作数字段。此解码的结果是用于控制目标功能单元对指定数据执行由对应指令指定的数据处理操作的信号。

处理单元核心110包含控制寄存器114。控制寄存器114存储用于控制标量数据路径侧A 115及向量数据路径侧B 116中的功能单元的信息。此信息可包含模式信息或类似物。

来自指令解码113的经解码指令及存储于控制寄存器114中的信息供应到标量数据路径侧A 115及向量数据路径侧B 116。因此,标量数据路径侧A 115及向量数据路径侧B116内的功能单元对指令指定数据执行指令指定数据处理操作且将结果存储于一或若干指令指定数据寄存器中。标量数据路径侧A 115及向量数据路径侧B 116中的每一者包含并行操作的多个功能单元。这些在下文结合图2进一步描述。标量数据路径侧A 115与向量数据路径侧B 116之间存在数据路径117,从而准许数据交换。

处理单元核心110包含另外基于非指令的模块。仿真单元118准许响应于指令而确定处理单元核心110的机器状态。此能力可用于算法开发。中断/异常单元119使处理单元核心110能够对外部异步事件(中断)作出响应及对执行不当操作(异常)的尝试作出响应。

处理器100包含串流引擎125。串流引擎125将两个数据流从高速缓存于L2组合高速缓存130中的预定地址供应到处理单元核心110的向量数据路径侧B的寄存器文件。此提供从存储器(如高速缓存于L2组合高速缓存130中)直接到功能单元操作数输入的受控数据移动。此在本文中进一步描述。

图1说明各个部件之间的总线的实例数据宽度。L1I高速缓存121经由总线141将指令供应到指令获取单元111。在此实例中,总线141是512位总线。总线141是从L1I高速缓存121到处理单元110的单向。L2组合高速缓存130经由总线142将指令供应到L1I高速缓存121。在此实例中,总线142是512位总线。总线142是从L2组合高速缓存130到L1I高速缓存121的单向。

L1D高速缓存123经由总线143与标量数据路径侧A 115中的寄存器文件交换数据。在此实例中,总线143是64位总线。L1D高速缓存123经由总线144与向量数据路径侧B 116中的寄存器文件交换数据。在此实例中,总线144是512位总线。总线143及144被说明为双向的,从而支持处理单元核心110的数据读取及数据写入两者。L1D高速缓存123经由总线145与L2组合高速缓存130交换数据。在此实例中,总线145是512位总线。总线145被说明为双向的,从而支持用于处理单元核心110的数据读取及数据写入两者的高速缓存服务。

在高速缓存命中之后(如果所请求的数据存储于L1D高速缓存123中),处理器数据请求直接从L1D高速缓存123获取。在高速缓存缺失(指定数据未存储于L1D高速缓存123中)之后,在L2组合高速缓存130中寻找数据。所请求数据的存储器位置是L2组合高速缓存130中的命中或缺失。命中由L2组合高速缓存130提供服务。缺失另一级高速缓存(未说明)或由主存储器(未说明)提供服务。所请求的数据可同时供应到L1D高速缓存123及处理单元核心110两者以加速使用。

L2组合高速缓存130经由总线146将第一数据流的数据供应到串流引擎125。在此实例中,总线146是512位总线。串流引擎125经由总线147将第一数据流的数据供应到向量数据路径侧B 116的功能单元。在此实例中,总线147是512位总线。L2组合高速缓存130经由总线148将第二数据流的数据供应到串流引擎125。在此实例中,总线148是512位总线。串流引擎125经由总线149将此第二数据流的数据供应到向量数据路径侧B 116的功能单元,在此实例中,总线149是512位总线。在此实例中,总线146、147、148及149被说明为从L2组合高速缓存130到串流引擎125且到向量数据路径侧B 116的单向。

在高速缓存命中之后(如果所请求的数据存储于L2组合高速缓存130中),串流引擎数据请求直接从L2组合高速缓存130获取。在高速缓存缺失(指定数据未存储于L2组合高速缓存130中)之后,从另一级高速缓存(未说明)或从主存储器(未说明)寻找数据。在一些实例中,L1D高速缓存123高速缓存未存储于L2组合高速缓存130中的数据在技术上是可行的。如果支持此操作,那么在作为L2组合高速缓存130中的缺失的串流引擎数据请求之后,L2组合高速缓存130侦察L1D高速缓存123的串流引擎请求的数据。如果L1D高速缓存123存储数据,那么侦察响应包含接着被供应用于服务串流引擎请求的数据。如果L1D高速缓存123未存储数据,那么侦察响应指示此且L2组合高速缓存130服务来自另一级高速缓存(未说明)或来自主存储器(未说明)的串流引擎请求。

在此实例中,L1D高速缓存123及L2组合高速缓存130两者可经配置为标题为“包含高速缓存及可直接寻址静态随机存取存储器的统一存储器系统架构(UNIFIED MEMORYSYSTEM ARCHITECTURE INCLUDING CACHE AND DIRECTLY ADDRESSABLE STATIC RANDOMACCESS MEMORY)”的第6,606,686号美国专利中的所选择量的高速缓存或可直接寻址存储器,所述美国专利通过引用方式并入本文中。

在此实例中,处理器100经制造于安装于球栅阵列(BGA)衬底上的集成芯片(IC)上。BGA衬底及IC裸片一起可称为“BGA封装”、“IC封装”、“集成电路”、“IC”、“芯片”、“微电子装置”或类似术语。BGA封装可包含覆盖且保护IC裸片免受损坏的囊封材料。在另一实例中,其它类型的已知或后期开发的封装技术可与处理器100一起使用。

图2说明标量数据路径侧A 115及向量数据路径侧B 116内的功能单元及寄存器文件的另外细节。标量数据路径侧A 115包含L1单元221、S1单元222、M1单元223、N1单元224、D1单元225及D2单元226。标量数据路径侧A 115包含全局标量寄存器文件211、L1/S1局部寄存器文件212、M1/N1局部寄存器文件213及D1/D2局部寄存器文件214。向量数据路径侧B116包含L2单元241、S2单元242、M2单元243、N2单元244、C单元245及P单元246。向量数据路径侧B 116包含全局向量寄存器文件231、L2/S2局部寄存器文件232、M2/N2/C局部寄存器文件233及断言寄存器文件234。哪些功能单元可从哪些寄存器文件读取或写入到哪些寄存器文件在本文中更详细描述。

标量数据路径侧A 115包含L1单元221。L1单元221通常接受两个64位操作数且产生一个64位结果。两个操作数各自从全局标量寄存器文件211或L1/S1局部寄存器文件212中的指令指定寄存器调用。L1单元221执行以下指令选择的操作:64位加/减运算;32位最小/最大操作;8位单指令多数据(SIMD)指令,例如绝对值的和、最小值及最大值确定;循环最小/最大操作;及寄存器文件之间的各种移动操作。结果写入到全局标量寄存器文件211、L1/S1局部寄存器文件212、M1/N1局部寄存器文件213或D1/D2局部寄存器文件214的指令指定寄存器中。

标量数据路径侧A 115包含S1单元222。S1单元222通常接受两个64位操作数且产生一个64位结果。两个操作数各自从全局标量寄存器文件211或L1/S1局部寄存器文件212中的指令指定寄存器调用。在此实例中,S1单元222执行与L1单元221相同类型的操作。在另一实例中,由L1单元221及S1单元222支持的数据处理操作之间可存在略微变化。结果写入到全局标量寄存器文件211、L1/S1局部寄存器文件212、M1/N1局部寄存器文件213或D1/D2局部寄存器文件214的指令指定寄存器中。

标量数据路径侧A 115包含M1单元223。M1单元223通常接受两个64位操作数且产生一个64位结果。两个操作数各自从全局标量寄存器文件211或M1/N1局部寄存器文件213中的指令指定寄存器调用。在此实例中,M1单元223执行以下指令选择的操作:8位乘法运算;复点积运算;32位位计数操作;复共轭乘法运算;及逐位逻辑运算、移动、加法及减法。结果写入到全局标量寄存器文件211、L1/S1局部寄存器文件212、M1/N1局部寄存器文件213或D1/D2局部寄存器文件214的指令指定寄存器中。

标量数据路径侧A 115包含N1单元224。N1单元224通常接受两个64位操作数且产生一个64位结果。两个操作数各自从全局标量寄存器文件211或M1/N1局部寄存器文件213中的指令指定寄存器调用。在此实例中,N1单元224执行与M1单元223相同类型的操作。还存在同时采用M1单元223及N1单元224两者的双重操作(称为双发出指令)。结果写入到全局标量寄存器文件211、L1/S1局部寄存器文件212、M1/N1局部寄存器文件213或D1/D2局部寄存器文件214的指令指定寄存器中。

标量数据路径侧A 115包含D1单元225及D2单元226。D1单元225及D2单元226通常各自接受两个64位操作数且各自产生一个64位结果。D1单元225及D2单元226通常执行地址计算及对应加载且存储操作。D1单元225用于64个位的标量加载及储。D2单元226用于512个位的向量加载及存储。在此实例中,D1单元225及D2单元226还执行:交换、打包及拆包负载及存储数据;64位SIMD算术运算;及64位逐位逻辑运算。D1/D2局部寄存器文件214存储用于对应加载及存储的地址计算中的基址及偏移地址。两个操作数各自从全局标量寄存器文件211或D1/D2局部寄存器文件214中的指令指定寄存器调用。计算得到的结果写入到全局标量寄存器文件211、L1/S1局部寄存器文件212、M1/N1局部寄存器文件213或D1/D2局部寄存器文件214的指令指定寄存器中。

向量数据路径侧B 116包含L2单元241。L2单元241通常接受两个512位操作数且产生一个512位结果。两个操作数各自从全局向量寄存器文件231、L2/S2局部寄存器文件232或断言寄存器文件234中的指令指定寄存器调用。在此实例中,除针对更宽512位数据之外,L2单元241执行类似于L1单元221的指令。结果可写入到全局向量寄存器文件231、L2/S2局部寄存器文件232、M2/N2/C局部寄存器文件233或断言寄存器文件234的指令指定寄存器中。

向量数据路径侧B 116包含S2单元242。S2单元242通常接受两个512位操作数且产生一个512位结果。两个操作数各自从全局向量寄存器文件231、L2/S2局部寄存器文件232或断言寄存器文件234中的指令指定寄存器调用。在此实例中,S2单元242执行类似于S1单元222的指令。结果写入到全局向量寄存器文件231、L2/S2局部寄存器文件232、M2/N2/C局部寄存器文件233或断言寄存器文件234的指令指定寄存器中。

向量数据路径侧B 116包含M2单元243。M2单元243通常接受两个512位操作数且产生一个512位结果。两个操作数各自从全局向量寄存器文件231或M2/N2/C局部寄存器文件233中的指令指定寄存器调用。在此实例中,除针对更宽512位数据之外,M2单元243执行类似于M1单元223的指令。结果写入到全局向量寄存器文件231、L2/S2局部寄存器文件232或M2/N2/C局部寄存器文件233的指令指定寄存器中。

向量数据路径侧B 116包含N2单元244。N2单元244通常接受两个512位操作数且产生一个512位结果。两个操作数各自从全局向量寄存器文件231或M2/N2/C局部寄存器文件233中的指令指定寄存器调用。在此实例中,N2单元244执行与M2单元243相同类型的操作。还存在同时采用M2单元243及N2单元244两者的双重操作(称为双发出指令)。结果写入到全局向量寄存器文件231、L2/S2局部寄存器文件232或M2/N2/C局部寄存器文件233的指令指定寄存器中。

向量数据路径侧B 116包含相关(C)单元245。C单元245通常接受两个512位操作数且产生一个512位结果。两个操作数各自从全局向量寄存器文件231或M2/N2/C局部寄存器文件233中的指令指定寄存器调用。在此实例中,C单元245执行用于WCDMA(宽带码分多址)编码/解码的“耙”及“搜索”指令。在此实例中,C单元245可执行2位PN(伪随机数)及8位I/Q(复数)、8位及16位绝对差值和(SAD)计算的每时钟循环高达512次、每时钟循环高达512次SAD、横向加法及横向最小/最大指令及向量置换指令。C单元245还含有用于控制C单元245指令的某些操作的4个向量控制寄存器(CUCR0到CUCR3)。控制寄存器CUCR0到CUCR3在某些C单元245操作中用作操作数。在一些实例中,控制寄存器CUCR0到CUCR3用于控制一般置换指令(VPERM),且用作用于SIMD多个点积运算(DOTPM)及SIMD多个绝对差值和(SAD)运算的掩码。在另外实例中,控制寄存器CUCR0用于存储伽罗瓦域乘法运算(GFMPY)的多项式,且控制寄存器CUCR1用于存储伽罗瓦域多项式产生器函数。

向量数据路径侧B 116包含P单元246。向量断言(P)单元246在局部断言寄存器文件234的寄存器上执行基本逻辑运算。P单元246可以直接读取及写入断言寄存器文件234。逻辑运算包含单寄存器一元运算,例如:NEG(求反),其反转单个寄存器的每一位;BITCNT(位计数),其传回具有预定数字状态(1或0)的单个寄存器中的位数的计数;RMBD(最右位检测),其传回从最低有效位位置(最右)到具有预定数字状态(1或0)的第一位位置的位位置数;DECIMATE,其选择待输出的每个指令指定第N(1、2、4等)位;及EXPAND,其将每一位复制指令指定N(2、4等)次。逻辑运算还包含:两寄存器二进制运算,例如:AND,其是两个寄存器的数据的逐位AND;NAND,其是两个寄存器的数据的逐位AND及求反;OR,其是两个寄存器的数据的逐位OR;NOR,其是两个寄存器的数据的逐位OR及求反;及XOR,其是两个寄存器的数据的互斥OR。逻辑运算包含将数据从断言寄存器文件234的断言寄存器传送到另一指定断言寄存器或全局向量寄存器文件231中的指定数据寄存器。P单元246的一种使用是操纵SIMD向量比较结果用于控制另一SIMD向量运算。BITCNT指令可用于计数断言寄存器中1的数目以确定来自断言寄存器的有效数据元素的数目。

图3说明全局标量寄存器文件211。存在标示为A0到A15的16个独立64位宽标量寄存器。全局标量寄存器文件211中的每一寄存器可被读取或写入为64位标量数据。所有标量数据路径侧A 115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225及D2单元226)可读取或写入到全局标量寄存器文件211。全局标量寄存器文件211可被读取为32位或64位且被写入为64位。指令执行确定读取数据大小。向量数据路径侧B 116功能单元(L2单元241、S2单元242、M2单元243、N2单元244、C单元245及P单元246)可在下文描述的约束下经由交叉路径117从全局标量寄存器文件211读取。

图4说明D1/D2局部寄存器文件214。存在标示为D0到D16的16个独立64位宽标量寄存器。D1/D2局部寄存器文件214中的每一寄存器被读取或写入为64位标量数据。所有标量数据路径侧A 115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225及D2单元226)可写入到全局标量寄存器文件211。仅D1单元225及D2单元226可从D1/D2局部标量寄存器文件214读取。存储于D1/D2局部标量寄存器文件214中的数据可包含用于地址计算中的基址及偏移地址。

图5说明L1/S1局部寄存器文件212。在此实例中,L1/S1局部寄存器文件212包含标示为AL0到AL7的8个独立64位宽标量寄存器。在此实例中,指令编码准许L1/S1局部寄存器文件212包含高达16个寄存器。在此实例中,8个寄存器经实施以降低电路大小及复杂性。L1/S1局部寄存器文件212中的每一寄存器可被读取或写入为64位标量数据。所有标量数据路径侧A 115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225及D2单元226)可写入到L1/S1局部标量寄存器文件212。L1单元221及S1单元222可从L1/S1局部标量寄存器文件212读取。

图6说明M1/N1局部寄存器文件213。在此实例中,实施标示为AM0到AM7的8个独立64位宽标量寄存器。在此实例中,指令编码准许M1/N1局部寄存器文件213包含高达16个寄存器。在此实例中,8个寄存器经实施以降低电路大小及复杂性。M1/N1局部寄存器文件213中的每一寄存器可被读取或写入为64位标量数据。所有标量数据路径侧A 115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225及D2单元226)可写入到M1/N1局部标量寄存器文件213。M1单元223及N1单元224可从M1/N1局部标量寄存器文件213读取。

图7说明全局向量寄存器文件231。存在16个独立512位宽向量寄存器。全局向量寄存器文件231中的每一寄存器可被读取或写入为标示为B0到B15的64位标量数据。全局向量寄存器文件231中的每一寄存器可被读取或写入为标示为VB0到VB15的512位向量数据。指令类型确定数据大小。所有向量数据路径侧B 116功能单元(L2单元241、S2单元242、M2单元243、N2单元244、C单元245及P单元246)可读取或写入到全局向量寄存器文件231。标量数据路径侧A 115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225及D2单元226)可在下文描述的约束下经由交叉路径117从全局向量寄存器文件231读取。

图8说明断言(P)局部寄存器文件234。存在标示为P0到P7的8个独立64位宽寄存器。P局部寄存器文件234中的每一寄存器可被读取或写入为64位标量数据。向量数据路径侧B 116功能单元(L2单元241、S2单元242、C单元244及P单元246)可写入到P局部寄存器文件234。L2单元241、S2单元242及P单元246可从P局部标量寄存器文件234读取。P局部寄存器文件234的一种使用是:从L2单元241、S2单元242或C单元244写入1位SIMD向量比较结果;通过P单元246操纵SIMD向量比较结果;及使用所操纵结果控制另一SIMD向量运算。

图9说明L2/S2局部寄存器文件232。在此实例中,实施8个独立512位宽向量寄存器。在此实例中,指令编码准许L2/S2局部寄存器文件232包含高达16个寄存器。在此实例中,8个寄存器经实施以降低电路大小及复杂性。L2/S2局部向量寄存器文件232中的每一寄存器可被读取或写入为标示为BL0到BL7的64位标量数据。L2/S2局部向量寄存器文件232中的每一寄存器可被读取或写入为标示为VBL0到VBL7的512位向量数据。指令类型确定数据大小。所有向量数据路径侧B 116功能单元(L2单元241、S2单元242、M2单元243、N2单元244、C单元245及P单元246)可写入到L2/S2局部向量寄存器文件232。L2单元241及S2单元242可从L2/S2局部向量寄存器文件232读取。

图10说明M2/N2/C局部寄存器文件233。在此实例中,实施8个独立512位宽向量寄存器。在此实例中,指令编码准许M2/N2/C局部寄存器文件233包含高达16个寄存器。在此实例中,8个寄存器经实施以降低电路大小及复杂性。M2/N2/C局部向量寄存器文件233中的每一寄存器可被读取或写入为标示为BM0到BM7的64位标量数据。M2/N2/C局部向量寄存器文件233中的每一寄存器可被读取或写入为标示为VBM0到VBM7的512位向量数据。所有向量数据路径侧B 116功能单元(L2单元241、S2单元242、M2单元243、N2单元244、C单元245及P单元246)可写入到M2/N2/C局部向量寄存器文件233。M2单元233、N2单元244及C单元245可从M2/N2/C局部向量寄存器文件233读取。

提供可由一侧的所有功能单元存取的全局寄存器文件及可由一侧的一些功能单元存取的局部寄存器文件是一种设计选择。在另一实例中,可进行不同可存取性提供,例如采用对应于本文中描述的全局寄存器文件的一种类型的寄存器文件。

交叉路径117准许标量数据路径侧A 115与向量数据路径侧B 116之间进行有限数据交换。在每一操作循环期间,一个64位数据字可从全局标量寄存器文件A 211调用以由向量数据路径侧B 116的一或多个功能单元用作操作数,且一个64位数据字可从全局向量寄存器文件231调用以由标量数据路径侧A 115的一或多个功能单元用作操作数。任何标量数据路径侧A 115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225及D2单元226)可从全局向量寄存器文件231读取64位操作数。此64位操作数是全局向量寄存器文件231的经存取寄存器中的512位数据的最低有效位。多个标量数据路径侧A 115功能单元可在相同操作循环期间采用与操作数相同的64位交叉路径数据。然而,在单个操作循环中,单个64位操作数从向量数据路径侧B 116传送到标量数据路径侧A 115。任何向量数据路径侧B 116功能单元(L2单元241、S2单元242、M2单元243、N2单元244、C单元245及P单元246)可从全局标量寄存器文件211读取64位操作数。如果对应指令是标量指令,那么交叉路径操作数数据被视作64位操作数。如果对应指令是向量指令,那么操作数的448个高位填充零。多个向量数据路径侧B 116功能单元可在相同操作循环期间采用与操作数相同的64位交叉路径数据。在一个实例中,在单个操作循环中,单个64位操作数从标量数据路径侧A 115传送到向量数据路径侧B 116。

串流引擎125(图1)在某些约束情况中传送数据。串流引擎125控制两个数据流。流包含特定类型的元素序列。对流操作的程序循序地读取数据,从而依次对每一元素操作。每个流具有以下基本性质:流数据在时间方面具有明确定义的开始及结束;流数据在整个流内具有固定元素大小及类型;且流数据具有固定元素序列。一旦流被打开,则串流引擎125执行以下操作:计算地址;从L2统一高速缓存130(其需要来自更高级存储器的高速缓存服务,例如如果L2中发生高速缓存缺失)获取定义数据类型;执行数据类型操纵,例如零扩展、符号扩展、数据元素分类/交换,例如矩阵转置;及将数据直接递送到处理器核心110内的经编程数据寄存器文件。因此,串流引擎125有益于对良态数据进行实时数字滤波操作。串流引擎125使对应处理器摆脱这些存储器获取任务,从而实现其它处理功能。

串流引擎125提供若干益处。举例来说,串流引擎125准许多维存储器存取,增加可用于功能单元的带宽,最小化高速缓存缺失停止的次数(因为流缓冲器绕过L1D高速缓存123),且减少维持循环所需的标量操作数。串流引擎125还管理地址指针且处置地址产生,其释放地址产生指令槽及D1单元225及D2单元226用于其它计算。

处理器核心110(图1)在指令管线上操作。在固定长度的指令包中获取指令,如下文进一步描述。所有指令需要相同数目个管线阶段用于获取及解码,但需要不同数目个执行阶段。

图11说明以下管线阶段:程序获取阶段1110、分派及解码阶段1120及执行阶段1130。程序获取阶段1110包含用于所有指令的三个阶段。分派及解码阶段1120包含用于所有指令的三个阶段。执行阶段1130包含取决于指令的一到四个阶段。

获取阶段1110包含程序地址产生(PG)阶段1111、程序存取(PA)阶段1112及程序接收(PR)阶段1113。在程序地址产生阶段1111期间,在处理器中产生程序地址且将读取请求发送到L1I高速缓存的存储器控制器。在程序存取阶段1112期间,L1I高速缓存处理请求、存取其存储器中的数据及将获取包发送到处理器边界。在程序接收阶段1113期间,处理器寄存获取包。

在包含16个32位宽字的获取包中获取指令。图12说明单个获取包的16个指令1201到1216。获取包在512位(16字)边界上对准。此实例采用实现解码器对准的固定32位指令长度。适当对准的指令获取可将多个指令加载到并行指令解码器中。此适当对准的指令获取可在通过使在512位边界上对准的获取包与固定指令包获取耦合来存储于存储器中时通过预定指令对准来实现。相反地,可变长度指令需要在解码之前定位每一指令边界的初始步骤。固定长度指令设置通常准许指令字段的更规律布局以简化每一解码器的构造,此有利宽发射VLIW处理器。

个别指令的执行部分由每一指令中的p位控制。在此实例中,p位是32位宽槽的位0。p位确定指令是否与下一指令并行执行。在此实例中,指令从较低地址扫描到较高地址。如果指令的p位是1,那么下一后面指令(更高存储器地址)与所述指令并行执行(在与所述指令相同的循环中)。如果指令的p位是0,那么下一后面指令在所述指令之后的循环中执行。

处理器核心110(图1)及L1I高速缓存121管线(图1)彼此解耦。从L1I高速缓存的获取包传回可取决于外部环境(例如是L1I高速缓存121中存在命中还是L2组合高速缓存130中存在命中)而采用不同数目个时钟循环。因此,程序存取阶段1112可采用若干时钟循环,而非如同其它阶段那样采用一个时钟循环。

指令并行执行构成执行包。在此实例中,执行包可含有用于16个指令的高达16个32位宽槽。执行包中没有2个指令可使用相同功能单元。槽是以下五种类型中的一者:1)自含指令,其在处理器核心110的功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225、D2单元226、L2单元241、S2单元242、M2单元243、N2单元244、C单元245及P单元246)中的一者上执行;2)无单位指令,例如一NOP(无操作)指令或多个NOP指令;3)分支指令;4)常数字段扩展;5)条件码扩展。这些槽类型中的若干者在本文中进一步描述。

分派及解码阶段1120(图11)包含指令分派到适当执行单元(DS)阶段1121、指令预解码(DC1)阶段1122、及指令解码、操作数读取(DC2)阶段1123。在指令分派到适当执行单元阶段1121期间,获取包分成执行包且指派给适当功能单元。在指令预解码阶段1122期间,源寄存器、目的地寄存器及相关联路径经解码用于在功能单元中执行指令。在指令解码、操作数读取阶段1123期间,执行更详细单元解码且从寄存器文件读取操作数。

执行阶段1130包含执行(E1到E5)阶段1131到1135。不同类型的指令需要不同数目个此类阶段来完成执行。管线的执行阶段在理解处理器循环边界处的装置状态中扮演重要角色。

在E1阶段1131期间,评估指令的条件且操作操作数。如图11中说明,E1阶段1131可从流缓冲器1141及示意性展示为1142的寄存器文件中的一者接收操作数。对于加载及存储指令,执行地址产生,且将地址修改写入到寄存器文件。对于分支指令,影响PG阶段中的分支获取包。如图11中说明,加载及存储指令存取此处示意性展示为存储器1151的存储器。对于单循环指令,当指令的任何条件被评估为真时,将结果写入到目的地寄存器文件。如果条件被评估为假,那么指令不写入任何结果或在E1阶段1131之后不具有任何管线操作。

在E2阶段1132期间,加载指令将地址发送到存储器。存储指令将地址及数据发送到存储器。如果发生饱和,那么使结果饱和的单循环指令设置控制状态寄存器(CSR)中的SAT位。对于2循环指令,将结果写入到目的地寄存器文件。

在E3阶段1133期间,执行数据存储器存取。如果发生饱和,那么使结果饱和的任何乘法指令设置控制状态寄存器(CSR)中的SAT位。对于3循环指令,将结果写入到目的地寄存器文件。

在E4阶段1134期间,加载指令将数据带到处理器边界。对于4循环指令,将结果写入到目的地寄存器文件。

在E5阶段1135期间,加载指令将数据写入到寄存器,如图11中示意性说明,其中输入从存储器1151到E5阶段1135。

图13说明由此实例使用的功能单元指令的指令编码1300的实例。每一指令包含32个位且控制个别可控功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225、D2单元226、L2单元241、S2单元242、M2单元243、N2单元244、C单元245及P单元246)中的一者的操作。

creg字段1301(位29到31)及z位1302(位28)是用于条件指令中的任选字段。这些位用于条件指令以识别断言寄存器及条件。z位1302(位28)指示断言是基于断言寄存器中的零还是非零。如果z=1,那么测试是针对等于零。如果z=0,那么测试是针对非零。creg=0且z=0的情况被视作为真以允许无条件指令执行。creg字段1301及z字段1302被编码于指令中,如表1中展示。

表1

条件指令的执行以存储于指定数据寄存器中的值为条件。数据寄存器在所有功能单元的全局标量寄存器文件211中。注意:z位列中的“z”是指上文提到的零/非零比较选择,且“x”是无关状态。此编码将16个全局寄存器的子集指定为断言寄存器,此保存指令编码中的位。注意:无条件指令不具有任选位。对于无条件指令,字段1301及1302中的位(28到31)用作额外操作码位。

dst字段1303(位23到27)将对应寄存器文件中的寄存器指定为指令结果的目的地。

src2/cst字段1304(位18到22)具有取决于指令操作码字段(用于所有指令的位3到12及用于无条件指令的位28到31)的若干意义。一种意义将对应寄存器文件的寄存器指定为第二操作数。另一意义是立即常数。取决于指令类型,字段1304被视作扩展到指定数据长度的无符号整数及零或被视作扩展到指定数据长度的带符号整数及符号。

scr1字段1305(位13到17)将对应寄存器文件中的寄存器指定为第一源操作数。

用于所有指令的操作码字段1306(位3到12)(及用于无条件指令的位28到31)指定指令类型且标示包含所使用功能单元及所执行操作的明确指定的适当指令选项。除下文描述的指令选项之外,操作码的详细解释超出本描述的范围。

e位1307(位2)用于立即常数指令,其中常数可扩展。如果e=1,那么立即常数以下文描述的方式扩展。如果e=0,那么立即常数不扩展,且立即常数由src2/cst字段1304(位18到22)指定。注意:e位1307用于一些指令。因此,在适当编码情况下,e位1307可从一些指令省略,且所述位可用作额外操作码位。

s位1308(位1)标示标量数据路径侧A 115或向量数据路径侧B 116。如果s=0,那么选择标量数据路径侧A 115,此将功能单元限于图2中说明的L1单元221、S1单元222、M1单元223、N1单元224、D1单元225及D2单元226及对应寄存器文件。类似地,s=1选择向量数据路径侧B 116,此将功能单元限于图2中说明的L2单元241、S2单元242、M2单元243、N2单元244、P单元246及对应寄存器文件。

p位1309(位0)标记执行包。p位确定指令是否与后面指令并行执行。p位从较低地址扫描到较高地址。针对当前指令,如果p=1,那么下一指令与当前指令并行执行。针对当前指令,如果p=0,那么下一指令在当前指令之后的循环中执行。所有指令并行执行构成执行包。执行包可含有高达16个指令。执行包中的每一指令使用不同功能单元。

存在两个不同条件码扩展槽。每一执行包可含有这些唯一32位条件码扩展槽中的每一者,其含有用于相同执行包中的指令的4位creg/z字段。图14说明用于条件码扩展槽0的编码,且图15说明用于条件码扩展槽1的编码。

图14说明用于具有32个位的条件码扩展槽0的编码。字段1401(位28到31)指定指派给相同执行包中的L1单元221指令的4个creg/z位。字段1402(位27到24)指定指派给相同执行包中的L2单元241指令的4个creg/z位。字段1403(位20到23)指定指派给相同执行包中的S1单元222指令的4个creg/z位。字段1404(位16到19)指定指派给相同执行包中的S2单元242指令的4个creg/z位。字段1405(位12到15)指定指派给相同执行包中的D1单元225指令的4个creg/z位。字段1406(位8到11)指定指派给相同执行包中的D2单元226指令的4个creg/z位。字段1407(位6及7)未使用/保留。字段1408(位0到5)被编码为一组唯一位(CCEX0)以识别条件码扩展槽0。一旦检测到条件码扩展槽0的唯一ID,则对应creg/z位用于控制相同执行包中任何L1单元221、L2单元241、S1单元222、S2单元242、D1单元225及D2单元226指令的条件执行。如表1中展示那样解译creg/z位。如果对应指令是有条件的(包含creg/z位),那么条件码扩展槽0中的对应位覆盖指令中的条件码位。设置creg/z位等于“0000”使指令变成无条件的。因此,适当编码的条件码扩展槽0可使一些对应指令变成有条件的且使一些变成无条件的。

图15说明用于具有32个位的条件码扩展槽1的编码。字段1501(位28到31)指定指派给相同执行包中的M1单元223指令的4个creg/z位。字段1502(位27到24)指定指派给相同执行包中的M2单元243指令的4个creg/z位。字段1503(位19到23)指定指派给相同执行包中的C单元245指令的4个creg/z位。字段1504(位16到19)指定指派给相同执行包中的N1单元224指令的4个creg/z位。字段1505(位12到15)指定指派给相同执行包中的N2单元244指令的4个creg/z位。字段1506(位6及11)未使用/保留。字段1507(位0到5)被编码为一组唯一位(CCEX1)以识别条件码扩展槽1。一旦检测到条件码扩展槽1的唯一ID,则对应creg/z位用于控制相同执行包中任何M1单元223、M2单元243、C单元245、N1单元224及N2单元244指令的条件执行。如表1中展示那样解译这些creg/z位。如果对应指令是有条件的(包含creg/z位),那么条件码扩展槽1中的对应位覆盖指令中的条件码位。设置creg/z位等于“0000”使指令变成无条件的。因此,适当编码的条件码扩展槽1可使一些指令变成有条件的且使一些变成无条件的。

条件码扩展槽0及条件码扩展槽1两者可包含p位以如上文结合图13描述那样定义执行包。在此实例中,如图14及15中说明,代码扩展槽0及条件码扩展槽1具有编码为1的位0(p位)。因此,条件码扩展槽0及条件码扩展槽1两者可不在执行包的最后指令槽中。

存在两个不同32位常数扩展槽。每一执行包可含有唯一常数扩展槽中的各自一者,其含有27个位作为高阶位与5位常数字段1305串接以形成32位常数。如上文指令编码描述中提到,一些指令将src2/cst字段1304定义为常数而非源寄存器标识符。至少一些此类指令可采用常数扩展槽来将常数扩展到32个位。

图16说明常数扩展槽0的字段。每一执行包可包含常数扩展槽0的一个例子及常数扩展槽1的一个例子。图16说明常数扩展槽0 1600包含两个字段。字段1601(位5到31)构成包含目标指令scr2/cst字段1304作为5个最低有效位的扩展32位常数的27个最高有效位。字段1602(位0到4)被编码为一组唯一位(CSTX0)以识别常数扩展槽0。在此实例中,常数扩展槽0 1600可用于扩展相同执行包中L1单元221指令、D1单元225指令中的数据、S2单元242指令、D2单元226指令中的偏移、M2单元243指令、N2单元244指令、分支指令或C单元245指令中的一者的常数。常数扩展槽1类似于常数扩展槽0,只是位0到4被编码为一组唯一位(CSTX1)以识别常数扩展槽1。在此实例中,常数扩展槽1可用于扩展相同执行包中L2单元241指令、D2单元226指令中的数据、S1单元222指令、D1单元225指令中的偏移、M1单元223指令或N1单元224指令中的一者的常数。

常数扩展槽0及常数扩展槽1使用如下。目标指令属于准许常数规格的类型。在此实例中,扩展通过用常数的最低有效位替换一个输入操作数寄存器规格字段来实施,如上文关于scr2/cst字段1304描述。指令解码器113从指令操作码位确定此情况(称为立即字段)。目标指令还包含一个常数扩展位(e位1307),其专用于用信号通知指定常数是未扩展(常数扩展位=0)还是已扩展(常数扩展位=1)。如果指令解码器113检测到常数扩展槽0或常数扩展槽1,那么指令解码器113进一步检查对应于检测到的常数扩展槽的指令的执行包内的其它指令。如果一个对应指令具有等于1的常数扩展位(e位1307),那么进行常数扩展。

图17是说明常数扩展的部分框图1700。图17假设指令解码器113(图1)在相同执行包中检测到常数扩展槽及对应指令。指令解码器113将来自常数扩展槽(位字段1601)的27个扩展位及来自对应指令的5个常数位(位字段1305)供应到串接器1701。串接器1701使从这两个部分形成单个32位字。在此实例中,来自常数扩展槽的27个扩展位(位字段1601)是最高有效位,且5个常数位(位字段1305)是最低有效位。经组合32位字被供应到多路复用器1702的一个输入。来自对应指令字段1305的5个常数位将第二输入供应到多路复用器1702。多路复用器1702的选择由常数扩展位的状态控制。如果常数扩展位(e位1307)是1(扩展),那么多路复用器1702选择经串接32位输入。如果常数扩展位是0(未扩展),那么多路复用器1702从对应指令字段1305选择5个常数位。多路复用器1702的输出供应符号扩展单元1703的输入。

符号扩展单元1703从来自多路复用器1703的输入形成最终操作数值。符号扩展单元1703接收控制输入标量/向量及数据大小。标量/向量输入指示对应指令是标量指令还是向量指令。数据路径侧A 115的功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225及D2单元226)执行标量指令。涉及这些功能单元中的一者的任何指令是标量指令。数据路径侧B功能单元(L2单元241、S2单元242、M2单元243、N2单元244及C单元245)可执行标量指令或向量指令。指令解码器113从操作码位确定指令是标量指令还是向量指令。P单元246可执行标量指令。数据大小可为8个位(字节B)、16个位(半字H)、32个位(字W)或64个位(双字D)。

表2列举针对各种选项的符号扩展单元1703的操作。

表2

常数扩展槽0及常数扩展槽1两者可包含p位以如上文结合图13描述那样定义执行包。在此实例中,如同条件码扩展槽的情况,常数扩展槽0及常数扩展槽1具有编码位1的位0(p位)。因此,常数扩展槽0及常数扩展槽1两者可不在执行包的最后指令槽中。

执行包可包含常数扩展槽0或1及标记为常数扩展的多于一个对应指令(e位=1)。对于此事件,针对常数扩展槽0,执行包中L1单元221指令、D1单元225指令中的数据、S2单元242指令、D2单元226指令中的偏移、M2单元243指令或N2单元244指令中的多于一者可具有e位1。对于此事件,针对常数扩展槽1,执行包中L2单元241指令、D2单元226指令中的数据、S1单元222指令、D1单元225指令中的偏移、M1单元223指令或N1单元224指令中的多于一者可具有e位1。在一个实例中,指令解码器113确定此事件是无效操作且不支持。替代地,组合可用应用到标记为常数扩展的每一对应功能单元指令的常数扩展槽的扩展位支持。

L1单元221、S1单元222、L2单元241、S2单元242及C单元245通常以单指令多数据(SIMD)模式操作。在此SIMD模式中,相同指令被应用到由两个操作数打包的数据。每一操作数保持安置于预定槽中的多个数据元素。SIMD操作通过数据边界处的进位控制实现。此进位控制实现不同数据宽度上的操作。

图18说明进位控制逻辑。AND门1801在操作数宽算术逻辑单元内接收位N的进位输出(用于标量数据路径侧A 115功能单元的64个位及用于向量数据路径侧B 116功能单元的512个位)。AND门1801还接收进位控制信号,如下文进一步描述。AND门1801的输出被供应到操作数宽算术逻辑单元的位N+1的进位输入。例如AND门1801的AND门安置于可能数据边界处的每一对位之间。举例来说,针对8位数据,此AND门将在位7与8、位15与16、位23与24等之间。每一此AND门接收对应进位控制信号。如果数据大小是最小大小,每一进位控制信号是0,从而有效阻止相邻位之间的进位传输。如果所选择的数据大小需要两个算术逻辑单元区段,那么对应进位控制信号是1。下表3展示针对由可分成8个位、16个位、32个位、64个位、128个位或256个位的区段的向量数据路径侧B 116功能单元使用的512位宽操作数的情况的实例进位控制信号。在表3中,32个高位控制高位(位128到511)进位且32个低位控制低位(位0到127)进位。无需控制最高有效位的进位输出,因此仅需要63个进位控制信号。

表3

对是2的整数幂(2N)的数据大小的操作是很常见的。然而,进位控制技术不限于2的整数幂,而是可应用到其它数据大小及操作数宽度。

在此实例中,至少L2单元241及S2单元242采用使用断言寄存器文件234中的寄存器的两种类型的SIMD指令。在此实例中,SIMD向量断言指令对指令指定数据大小操作。数据大小包含字节(8位)数据、半字(16位)数据、字(32位)数据、双字(64位)数据、四倍长字(128位)数据及半向量(256位)数据。在这些指令类型中的第一者中,功能单元(L单元241或S单元242)对两个通用数据寄存器中的打包数据执行SIMD比较且将结果供应到断言数据寄存器。指令指定数据大小、两个通用数据寄存器操作数及目的地断言寄存器。在此实例中,每一断言数据寄存器包含对应于通用数据寄存器的每一最小数据大小部分的一个位。在当前实例中,通用数据寄存器是512个位(64个字节),且断言数据寄存器是64个位(8个字节)。断言数据寄存器的每一位对应于通用数据寄存器的8个位。对指定数据大小(8、16、32、64、128或256个位)执行比较。如果比较为真,那么功能单元将1供应到对应于所述数据大小部分的所有断言寄存器位。如果比较为假,那么功能单元将0供应到对应于所述数据大小部分的断言寄存器位。在此实例中,经启用比较操作包含小于、大于及等于。

在指令类型中的第二者中,功能单元(L2单元241或S2单元242)基于断言数据寄存器中的数据状态来单独对通用数据寄存器中的打包数据执行第一SIMD操作或第二SIMD操作。指令指定数据大小、一或两个通用数据寄存器操作数、控制断言寄存器及通用数据寄存器目的地。举例来说,功能单元可针对两个向量操作数的每一数据大小部分取决于断言数据寄存器中的对应位的1/0状态而选择第一操作数的第一数据元素或第二操作数的第二数据元素存储于目的地寄存器中。在另一实例中,单个向量操作数的数据元素可取决于断言寄存器的对应位的数据而保存到存储器或不保存。

P单元245的操作准许基于多于一个向量比较的各种复合向量SIMD操作。举例来说,可使用两个比较进行范围确定。在SIMD操作中,比较候选向量与具有打包于数据寄存器内的范围的最小值的向量参考。大于结果是具有对应于取决于SIMD比较而设置为0或1的SIMD数据宽度的位的标量数据且存储于断言数据寄存器中。执行候选向量与具有打包于不同数据寄存器内的范围的最大值的另一参考向量的另一SIMD比较产生具有存储于另一断言寄存器中的小于结果的另一标量。接着,P单元对两个断言寄存器进行AND运算。AND结果指示候选向量的每一SIMD数据部分是在范围内还是在范围外。AND结果的P单元BITCNT指令可在比较范围内产生数据元素的计数。P单元NEG功能可用于转换各种表达式,例如将小于比较结果转换成大于或相等比较结果、将大于比较结果转换成小于或等于比较结果或将等于比较结果转换成不等于比较结果。

串流引擎

图19是图1的实例处理器100的串流引擎125的概念图。图19说明表示由串流引擎125控制的两个流的单个流的处理。串流引擎1900包含流地址产生器1901。流地址产生器1901循序地产生流的元素的地址且将这些元素地址供应到系统存储器1910。存储器1910调用存储于元素地址(数据元素)处的数据且将这些数据元素供应到数据先进先出(FIFO)缓冲器1902。数据FIFO缓冲器1902提供存储器1910与处理器1920之间的缓冲。数据格式器1903从数据FIFO存储器1902接收数据元素且根据流定义提供数据格式化。此过程在本文中更详细描述。串流引擎1900将格式化数据元素从数据格式器1903供应到处理器1920。在处理器1920上执行的程序消耗数据且产生输出。

流元素可驻留于系统存储器中。存储器不将特定结构强加于流上。程序定义流且借此通过指定流属性(例如流的第一元素的地址、流中元素的大小及类型、对流中的数据格式化及与流相关联的地址序列)来强加结构。

串流引擎依据遍历存储器的指针来定义流的元素的地址序列。多级嵌套循环控制指针所走的路径。循环级的迭代计数指示所述级重复的次数。维度给出循环级的指针位置之间的距离。

在基本前向流中,最内循环消耗来自存储器的物理连续元素,因为最内循环的隐式维度是一个元素。指针以连续递增顺序从元素移动到元素。在内循环外的每一级中,循环基于循环级的维度大小将指针移动到新位置。

此形式的寻址允许程序使用少量参数指定通过存储器的常规路径。表4列举基本流的寻址参数。

表4

在此实例中,ELEM_BYTES的范围从1到64个字节,如表5中展示。

表5

ELEM_BYTES 流元素长度
000 1个字节
001 2个字节
010 4个字节
011 8个字节
100 16个字节
101 32个字节
110 64个字节
111 保留

上文定义将流的连续元素映射到存储器中的递增地址,此适于许多算法。通过以递减存储器地址顺序读取元素或反向流寻址来更好地服务一些算法。举例来说,离散卷积计算向量点积,如由表达式(1)说明。

在表达式[1]中,f[]及g[]表示存储器中的数组。针对每一输出,算法在前向方向上读取f[]且在反向方向上读取g[]。实用滤波器将[x]及[t-x]的指数范围限于有限数目个元素。为了支持此模式,串流引擎支持以递减地址顺序读取元素。

矩阵乘法给串流引擎提出一个独特问题。矩阵积中的每一元素是来自第一矩阵的行与来自第二矩阵的列之间的向量点积。程序可以行优先或列优先顺序存储矩阵。行优先顺序将单行的所有元素连续存储于存储器中。列优先顺序将单列的所有元素连续存储于存储器中。矩阵可以与语言的默认数组顺序相同的顺序存储。因此,矩阵乘法中的两个矩阵中的仅一者映射到串流引擎的2维流定义上。在实例中,指数单步调试一个数组上的列及另一数组上的行。串流引擎支持与经转置流的隐式矩阵转置。经转置流避免明确变换存储器中的数据的成本。不是以严格连续元素顺序存取数据,而是串流引擎有效互换遍历顺序的内部两个循环维度,从而沿到连续向量通道中的第二维度获取元素。

此算法有效但无法实施于小元素大小。一些算法适用于矩阵片块,其是多个列及行一起。因此,串流引擎定义单独转置粒度。硬件强加最小粒度。转置粒度需要至少与元素大小一样大。转置粒度致使串流引擎在沿维度1移动之前从维度0获取一或多个连续元素。当粒度等于元素大小时,从行优先数组获取单列。否则,粒度指定一次从行优先数组获取两列、四列或更多列。通过交换本描述中的行与列,此也适用于列优先布局。参数GRANULE指示转置粒度(以字节为单位)。

另一常见矩阵乘法技术交换矩阵乘法的最内两个循环。所得内循环不再沿一个矩阵的列读取同时跨另一矩阵的行读取。举例来说,算法可在内循环外提升一个项,从而用标量值替换其。最内循环可通过向量乘法、接着向量加法来用单个标量实施。或者,标量值可跨向量的长度复制且使用向量乘向量乘法。此实例的串流引擎直接支持具有元素复制模式的后一情况及相关使用模型。在此模式中,串流引擎读取比全向量大小更小的颗粒且复制颗粒以填充下一向量输出。

串流引擎将每一复数视作具有给出复数的实部及虚部(直坐标)或量值及角度(极坐标)部分的两个子元素的单个元素。并非所有程序或外围设备同意这些子元素应以什么顺序出现于存储器中。因此,串流引擎提供无成本交换复数的两个子元素的能力。特征交换元素的一半而无需解译元素的内容且可用于交换任何类型而非仅复数的子元素对。

算法通常优选以高精度工作,但高精度值需要比较低精度值更多的存储及带宽。通常,程序将以低精度将数据存储于存储器中,将所述值提升到较高精度用于计算,且接着将值降级到较低精度用于存储。串流引擎通过允许算法指定一级类型提升来直接支持此类操作。在此实例中,每个子元素可用整型的符号或零扩展提升到较大类型大小。在一些实例中,串流引擎支持浮点提升,从而分别将16位及32位浮点值提升到32位及64位格式。

虽然串流引擎将流定义为离散数据元素序列,但处理单元核心110消耗连续打包于向量中的元素。向量类似于流,因为向量含有具有某隐式序列的多个同质元素。因为串流引擎读取流,但处理单元核心110消耗向量,所以串流引擎以一致方式将流映射到向量上。

向量包含相等大小的通道,每一通道含有子元素。处理单元核心110将向量的最右通道指定为通道0,无论当前字节序模式为何。通道数目从右到左增加。向量内通道的实际数目取决于向量的长度及子元素的数据大小而改变。

图20说明格式器1903的格式化操作的序列。格式器1903包含三个区段:输入区段2010、格式化区段2020及输出区段2030。输入区段2010接收从由流地址产生器1901存取的系统存储器1910调用的数据。数据可经由线性获取流2011或经转置获取流2012。

格式化区段2020包含各种格式化块。由块在格式器1903内执行的格式化在下文进一步描述。复交换块2021任选地交换形成复数元素的两个子元素。类型提升块2022任选地将每一数据元素提升为较大数据大小。提升包含无符号整数的零扩展及带符号整数的符号扩展。抽取块2023任选地抽取数据元素。在此实例中,抽取可为保留每隔一个数据元素的2:1或保留每个第四数据元素的4:1。元素复制块2024任选地复制个别数据元素。在此实例中,数据元素复制是2的整数幂(2N,其中N是整数),其包含2倍、4倍、8倍、16倍、32倍及64倍。在此实例中,数据复制可在多个目的地向量上扩展。向量长度遮蔽/群组复制块2025具有两个主要功能。独立指定的向量长度VECLEN控制供应到每一输出数据向量的数据元素。当群组复制关闭时,输出数据向量中的额外通道被零填充且这些通道被标记为无效。当群组复制开启时,指定向量长度的输入数据元素经复制以填充输出数据向量。

输出区段2030保持数据用于输出到对应功能单元。用于处理器的寄存器及缓冲器2031存储由处理单元核心110(图1)的功能单元用作操作数的数据的格式化向量。

图21说明向量中的通道分配的实例。向量2100被分成8个64位通道(8×64个位=512个位,向量长度)。通道0包含位0到63,线1包含位64到127,通道2包含位128到191,通道3包含位192到255,通道4包含位256到319,通道5包含位320到383,通道6包含位384到447,且通道7包含位448到511。

图22说明向量中的通道分配的另一实例。向量2210被分成16个32位通道(16×32个位=512个位,向量长度)。通道0包含位0到31,线1包含位32到63,通道2包含位64到95,通道3包含位96到127,通道4包含位128到159,通道5包含位160到191,通道6包含位192到223,通道7包含位224到255,通道8包含位256到287,通道9包含位288到319,通道10包含位320到351,通道11包含位352到383,通道12包含位384到415,通道13包含位416到447,通道14包含位448到479,且通道15包含位480到511。

串流引擎将最内流维度直接映射到向量通道。串流引擎将最内流维度内的早先元素映射到较低通道号且将稍后元素映射到较高通道号,无论流是以递增还是递减地址顺序推进。无论流定义什么顺序,串流引擎以递增通道顺序将元素存放于向量中。针对非复数数据,串流引擎将第一元素放置于处理单元核心110(图1)获取的向量的通道0中,将第二元素放置于通道1中,以此类推。针对复数数据,串流引擎将第一元素放置于通道0及1中,将第二元素放置于通道2及3中,以此类推。元素内的子元素保持相同相对排序,无论流方向为何。针对未交换复元素,具有每一对的较低地址的子元素被放置于偶数通道中,且具有每一对的较高地址的子元素被放置于奇数通道中。针对经交换复元素,放置被反转。

串流引擎用可能尽可能多的处理单元核心110从最内流维度获取的元素填充每一向量。如果最内维度不是向量长度的倍数,那么串流引擎将维度零填补到向量长度的倍数。如下文指出,串流引擎还将通道标记为无效。因此,针对较高维度流,来自外维度的每一迭代的第一元素到达向量的通道0。串流引擎将最内维度映射到向量中的连续通道。针对经转置流,最内维度包含沿维度1而非维度0的子元素群组,因为转置交换这两个维度。

与一维流相比,二维(2D)流展现更大变化。基本2D流从较大矩形提取较小矩形。经转置2D流逐列而非逐行读取矩形。循环流(其中第二维度与第一维度重叠)对提供输入样本的滑动窗的有限脉冲响应(FIR)滤波器样本执行重复循环的FIR滤波器抽头。

图23说明可使用基本二维流存取的存储器区域。由ELEM_BYTES、ICNT0、DIM1及ICNT1(参考表4)表示的两个内维度给出足够灵活性以描述从具有维度2311及2312的较大矩形2310提取具有维度2321及2322的较小矩形2320。在此实例中,矩形2320是64位值的9乘13矩形,且矩形2310是较大11乘19矩形。以下流参数定义此流:ICNT0=9,ELEM_BYTES=8,ICNT1=13,且DIM1=88(11乘8)。

因此,0维2321中的迭代计数是9,且1维2322中的迭代计数是13。注意:ELEM_BYTES按比例缩放最内维度。第一维度具有大小ELEM_BYTES的ICNT0个元素。流地址产生器不按比例缩放外维度。因此,DIM1=88,其是每元素按8个字节缩放的11个元素。

图24说明图23的实例流内的元素顺序。串流引擎以顺序2400说明的顺序获取流的元素。前9个元素来自矩形2320的第一行,从左到右跃程1到8。第10到第24元素来自第二行,以此类推。当流从第9元素移动到第10元素(图24中的跃程9)时,串流引擎基于指针在内循环开始处的位置而非指针在第一维度结束处的位置来计算新位置。因此,DIM1独立于ELEM_BYTES及ICNT0。DIM1表示每一连续行的第一字节之间的距离。

经转置流沿着维度0之前的维度1存取。以下实例说明具有不同转置粒度的经转置流。图25说明从具有维度2511及2512的较大矩形2510(14×13)提取具有维度2521及2522的较小矩形2520(12×8)。在图25中,ELEM_BYTES等于2。

图26说明串流引擎如何以4个字节的转置粒度获取图25的实例流的流。获取模式2600从每一行获取元素对(因为粒度4是ELEM_BYTES 2的两倍),但以其它方式沿着列向下移动。一旦串流引擎到达一对列的底部,则串流引擎使下一对列重复模式。

图27说明串流引擎如何以8个字节的转置粒度获取图25的实例流的流。整体结构保持相同。串流引擎在移动到列中的下一行之前从每一行获取4个元素(因为粒度8是ELEM_BYTES 2的四倍),如获取模式2700中展示。

迄今所检查的流从存储器读取每一元素仅一次。流可从存储器读取给定元素多次,实际上在存储器的部分上循环。FIR滤波器展现两种常见循环模式:重读每一输出的相同滤波器抽头及从滑动窗读取输入样本。两个连续输出需要来自两个重叠窗的输入。

图28说明图1的串流引擎125的细节。串流引擎125含有三个主要区段:流0引擎2810、流1引擎2820及共享L2接口2830。流0引擎2810及流1 2820两者含有并行操作的相同硬件。流0引擎2810及流1引擎2820两者共享L2接口2830。流0引擎2810及流1引擎2820各自在每个循环以高达512个位/循环的速率向处理单元核心110(图1)提供数据,此通过专用流路径及共享双L2接口实现。

每一串流引擎125包含相应专用6维(6D)流地址产生器2811/2821,其可每循环各自产生一个新未对准请求。如本文中进一步描述,地址产生器2811/2821输出512位对准地址,其与由流参数定义的序列中的元素重叠。

每一地址产生器2811/2821连接到相应专用微表后援缓冲器(μTLB)2812/2822。μTLB 2812/2822每一循环将单个48位虚拟地址转换成44位物理地址。每一μTLB 2812/2822具有8个条目,从而用4kB页面覆盖最小32kB或用2MB页面覆盖最大16MB。每一地址产生器2811/2821每循环产生2个地址。μTLB 2812/2822每循环仅转译1个地址。为了维持吞吐量,串流引擎125在多数流参考在相同4kB页面内的假设下操作。因此,地址转译不修改地址的位0到11。如果aout0及aout1在相同4kB页面中成行(aout0[47:12]是相同aout1[47:12]),那么μTLB 2812/2822仅转译aout0且将转译再用于两个地址的高位。

经转译地址在相应命令队列2813/2823中排队。这些地址与来自相应对应存储分配及追踪块2814/2824的信息对准。串流引擎125不明确管理μTLB 2812/2822。系统存储器管理单元(MMU)在上下文切换期间视需要使μTLB无效。

存储分配及追踪2814/2824管理流的内部存储,从而发现数据再用且追踪每一条数据的寿命。块每循环接受两个虚拟地址且将所述地址绑定到内部存储装置中的槽。数据存储被组织为槽阵列。串流引擎维持以下元数据以追踪每一槽中数据的内容及寿命:与槽相关联的49位虚拟地址、指示有效地址的有效位、指示数据已到达地址的就绪位、指示是否存在任何参考超出此数据的有效位及指示参考队列中的此槽的最近参考的最后参考值。存储分配及追踪在本文中进一步描述。

相应参考队列2815/2825存储由相应对应地址产生器2811/2821产生的参考序列。参考序列使数据格式化网络能够以正确顺序将数据呈现给处理单元核心110。相应参考队列2815/2825中的每一条目含有从数据存储读出数据且对准用于处理单元核心110的数据所需的信息。相应参考队列2815/2825将表6中列举的信息保存于每一槽中。

表6

数据槽低 与aout0相关联的数据的下半部的槽数
数据槽高 与aout1相关联的数据的上半部的槽数
旋转 旋转数据以使下一元素与通道0对准的字节数
长度 此参考中的有效字节数

随着地址产生器2811/2821产生新地址,存储分配及追踪2814/2824将参考插入于参考队列2815/2825中。当数据变成可用且流头寄存器中存在空间时,存储分配及追踪2814/2824从参考队列2815/2825移除参考。随着存储分配及追踪2814/2824从参考队列2815/2825移除槽参考且格式化数据,检查参考的对应槽的最后参考。存储分配及追踪2814/2824比较参考队列2815/2825移除指针与槽的记录最后参考。如果指针与记录最后参考匹配,那么一旦不再需要数据,则存储分配及追踪2814/2824将槽标记为无效。

串流引擎125具有用于所选择数目个元素的相应数据存储装置2816/2826。深度缓冲允许串流引擎早早获取流,从而隐藏存储器系统延时。每一数据存储装置2816/2826每循环适应两个同时读取操作及两个同时写入操作且因此各自称为两读取两写入(2r2w)数据存储装置。在其它实例中,缓冲量可不同。在当前实例中,串流引擎125使32个槽专用于每一流,其中每一槽由虚拟地址标记。每一槽在8个字节的8个存储体中保持64个字节的数据。

数据存储装置2816/2826及相应存储分配/追踪逻辑2814/2824及参考队列2815/2825实施参考图19描述的数据FIFO 1902。

相应蝶形网络2817/2827包含实施格式器1903(图19、图20)的七级蝶形网络。蝶形网络2817/2827接收128个字节的输入且产生64个字节的输出。蝶形的第一级实际上为从匹配未对准获取的两个槽收集字节且将所收集的字节合并成单个经旋转64字节数组的半级。剩余六个级形成标准蝶形网络。相应蝶形网络2817/2827执行以下操作:使下一元素向下旋转到字节通道0;如果被请求,那么按2的幂提升数据类型;如果被请求,那么交换复数的实部及虚部分量;及如果处理单元核心110目前在大端模式中,那么将大端转换成小端。用户将元素大小、类型提升及实部/虚部交换指定为流的参数的部分。

串流引擎125尝试在处理单元核心110要求之前获取及格式化数据以维持全吞吐量。相应流头寄存器2818/2828提供少量缓冲,使得过程保持完全管线化。相应流头寄存器2818/2828在架构上不直接可见。每一流还具有相应流有效寄存器2819/2829。有效寄存器2819/2829指示对应流头寄存器2818/2828中的哪些元素是有效的。流头寄存器2818/2828及有效寄存器2819/2829的输出经由总线2840/2841提供到处理单元核心110。

两个流2810/2820共享一对独立L2接口2830:L2接口A(IFA)2833及L2接口B(IFB)2834。每一L2接口针对1024个位/循环的聚合带宽经由相应总线147/149将512个位/循环吞吐量直接提供到L2控制器130(图1)。L2接口使用基于信用的多核总线架构(MBA)协议。MBA协议在通过引用方式并入本文中的“不阻止高性能交易信用系统的多核总线架构(Multicore Bus Architecture with Non-Blocking High Performance TransactionCredit System)”的美国专利9,904,645中更详细描述。L2控制器将命令信用池化指派给每一接口。池化具有足够信用,使得每一接口可在读取L2 RAM、L2高速缓存及多核共享存储器控制器(MSMC)存储器时发送足够请求来实现全读取传回带宽,如本文中更详细描述。

为了最大化性能,在此实例中,两个流可使用两个L2接口,从而允许单个流发送每循环两个请求的峰值命令速率。每一接口使一个流优先于非另一流,但此偏好根据请求而动态改变。IFA 2833及IFB 2834优先选择相反流,当IFA 2833优先选择流0时,IFB 2834优先选择流1,且反之亦然。

每一相应接口2833/2834之前的相应仲裁器2831/2832在具有可用信用的每个循环上应用以下基本协议。仲裁器2831/2832检查优选流是否具有准备发送的命令。如果有,那么仲裁器2831/2832选取所述命令。仲裁器2831/2832接着检查替代流是具有至少两个请求准备发送还是具有一个命令及没有信用。如果为是,那么仲裁器2831/2832从替代流提取命令。如果任一接口发出命令,那么优选及替代流的意见针对下一请求交换。使用此算法,两个接口尽可能快地分派请求,同时保留两个流之间的公平性。第一规则确保每一流可在具有可用信用的每循环上发送请求。第二规则为一个流提供在第二接口空闲时借用另一流的接口的机制。第三规则跨两个接口分摊每一流的带宽需求,从而确保两个接口不变成瓶颈。

相应粗粒旋转器2835/2836使串流引擎125能够支持经转置矩阵寻址模式。在此模式中,串流引擎125交换多维循环的两个最内维度以逐列而非逐行存取数组。相应旋转器2835/2836在架构上不可见。

图29说明实例流模板寄存器2900。流定义模板提供含有数据的流的全结构。迭代计数及维度提供大多数结构,同时各种旗标提供剩余细节。在此实例中,单个流模板2900经定义用于所有含数据流。由串流引擎支持的所有流类型由模板2900覆盖。串流引擎支持用于寻址流内的元素的六级循环嵌套。流模板2900中的大多数字段直接映射到所述算法中的参数。字段上方的数目是256位向量内的位数目。表7展示流模板的流字段定义。

表7

字段名 图29元件符号 描述 大小位
ICNT0 2901 用于循环0的迭代计数 32
ICNT1 2902 用于循环1的迭代计数 32
ICNT2 2903 用于循环2的迭代计数 32
ICNT3 2904 用于循环3的迭代计数 32
ICNT4 2905 用于循环4的迭代计数 32
ICNT5 2906 用于循环5的迭代计数 32
DIM1 2911 用于循环1的带符号维度 32
DIM2 2912 用于循环2的带符号维度 32
DIM3 2913 用于循环3的带符号维度 32
DIM4 2914 用于循环4的带符号维度 32
DIM5 2915 用于循环5的带符号维度 32
FLAGS 2921 流修改符旗标 64

循环0是最内循环,且循环5是最外循环。在当前实例中,DIM0等于定义物理连续数据的ELEM_BYTES。因此,流模板寄存器2900不定义DIM0。串流引擎125将迭代计数解译为无符号整数且将维度解译为未缩放的带符号整数。任何级(ICNT0、ICNT1、ICNT2、ICNT3、ICNT4或ICNT5)的迭代计数0指示空流。每一迭代计数必须至少为1以定义有效流。上文模板指定元素类型、流的长度及维度。流指令单独指定起始地址,例如通过说明存储起始地址的标量寄存器文件211中的标量寄存器。因此,程序可使用相同模板但存储起始地址的不同寄存器来打开多个流。

图30说明图29中展示的旗标字段2921的子字段定义的实例。如图30中展示,旗标字段2911是6个字节或48个位。图30展示字段的位数目。表8展示这些字段的定义。

表8

元素类型(ELTYPE)字段3001定义流中的元素的数据类型。ELTYPE字段3001的4个位的编码如表9中展示那样定义。

表9

实数/复数类型确定串流引擎是将每一元素视作实数还是复数的两个部分(实部/虚部或量值/角度)且还指定是否交换复数的两个部分。复数类型具有子元素大小两倍的总元素大小。否则,子元素大小等于总元素大小。

子元素大小确定用于类型提升目的的类型及向量通道宽度。举例来说,当流请求类型提升时,16位子元素被提升到32位子元素或64位子元素。向量通道宽度在处理单元核心110(图1)在大端模式中操作时很重要,因为核心110以小端顺序布置向量。

总元素大小指定流的最小粒度,其确定流在最内循环的每一迭代内获取的字节数。流以递增或递减顺序读取全部元素。因此,流的最内维度跨越ICNT0×总元素大小个字节。

TRANSPOSE字段3002确定串流引擎是否以经转置顺序存取流。经转置顺序交换两个内寻址级。TRANSPOSE字段3002还指示用于转置流的粒度。TRANSPOSE字段3002的3个位的编码如表10中针对正常2D操作展示那样定义。

表10

转置 意义
000 转置停用
001 在8位边界上转置
010 在16位边界上转置
011 在32位边界上转置
100 在64位边界上转置
101 在128位边界上转置
110 在256位边界上转置
111 保留

串流引擎125可以与元素大小不同的粒度转置数据元素,从而允许程序从每一行获取多列元素。转置粒度不能小于元素大小。TRANSPOSE字段3002与DIMFMT字段3009以下文进一步描述的方式交互。

PROMOTE字段3003控制串流引擎是否提升流中的子元素及提升类型。当启用时,串流引擎125按2次幂大小提升类型。PROMOTE字段3003的3个位的编码如表11中展示那样定义。

表11

当PROMOTE是对应于1倍提升的000时,每一子元素不变且占据宽度等于由ELTYPE指定的大小的向量通道。当PROMOTE是对应于2倍提升及零扩展的001时,每一子元素被视作无符号整数及零扩展到由ELTYPE指定的宽度的两倍的向量通道。2倍提升对64个位的初始子元素大小无效。当PROMOTE是对应于4倍提升及零扩展的010时,每一子元素被视作无符号整数及零扩展到由ELTYPE指定的宽度的四倍的向量通道。4倍提升对32或64个位的初始子元素大小无效。当PROMOTE是对应于8倍提升及零扩展的011时,每一子元素被视作无符号整数及零扩展到由ELTYPE指定的宽度的八倍的向量通道。8倍提升对16、32或64个位的初始子元素大小无效。当PROMOTE是对应于2倍提升及符号扩展的101时,每一子元素被视作带符号整数及符号扩展到由ELTYPE指定的宽度的两倍的向量通道。2倍提升对64个位的初始子元素大小无效。当PROMOTE是对应于4倍提升及符号扩展的110时,每一子元素被视作带符号整数及符号扩展到由ELTYPE指定的宽度的四倍的向量通道。4倍提升对32或64个位的初始子元素大小无效。当PROMOTE是对应于8倍提升及零扩展的111时,每一子元素被视作带符号整数及符号扩展到由ELTYPE指定的宽度的八倍的向量通道。8倍提升对16、32或64个位的初始子元素大小无效。

VECLEN字段3004定义流的流向量长度(以字节为单位)。串流引擎125将流分成长度为VECLEN个字节的元素群组。VECLEN字段3004的3个位的编码如表12中展示那样定义。

表12

VECLEN 流向量长度
000 1个字节
001 2个字节
010 4个字节
011 8个字节
100 16个字节
101 32个字节
110 64个字节
111 保留

VECLEN不能小于元素大小(以字节为单位)与复制次数之积。如表11中展示,64个字节的最大VECLEN等于向量数据路径侧B 116的优选向量大小。当VECLEN短于处理单元核心110的原生向量宽度时,串流引擎125填补提供到处理单元核心110的向量中的额外通道。GRDUP字段3006确定填补类型。VECLEN字段3004与ELDUP字段3005及GRDUP字段3006以下文详述的方式交互。

ELDUP字段3005指定复制每一元素的次数。元素大小乘以元素复制量不能超过64个字节。ELDUP字段3005的3个位的编码如表13中展示那样定义。

表13

ELDUP字段3005与VECLEN字段3004及GRDUP字段3006以下文详述的方式交互。经准许元素大小、元素复制次数及目的地向量长度之间的关系性质需要使第一目的地寄存器溢流的经复制元素在复制完成之后填充整数个目的地寄存器。额外目的地寄存器的数据最终供应相应流头寄存器2818/2828。在第一数据元素复制完成之后,下一数据元素向下旋转到丢弃第一数据元素的源寄存器3100的最低有效位。接着,过程对新数据元素重复。

GRDUP位3006确定是否启用群组复制。如果GRDUP位3006是0,那么停用群组复制。如果GRDUP位3006是1,那么启用群组复制。当由GRDUP位3006启用时,串流引擎125复制一群组元素以填充向量宽度。VECLEN字段3004定义待复制群组的长度。当VECLEN字段3004小于处理单元核心110的向量长度且GRDUP位3006启用群组复制时,串流引擎125用流向量的额外副本填充额外通道(见图21及22)。因为流向量长度及处理单元核心110的向量长度是2的整数幂,所以群组复制产生整数个复制副本。注意,GRDUP及VECLEN不指定复制次数。所执行的复制次数是基于VECLEN与原生向量长度之比,其在此实例中是64个字节/512个位。

GRDUP字段3006指定串流引擎125如何在VECLEN长度之后将位的流向量填补到处理单元核心110的向量长度。当GRDUP位3006是0时,串流引擎125用零填充额外通道且将额外向量通道标记为无效。当GRDUP位3006是1时,串流引擎125用每一流向量中的元素群组的副本填充额外通道。当VECLEN被设置为处理单元核心110的原生向量宽度时,将GRDUP位3006设置为1无效。VECLEN必须至少与ELEM_BYTES与元素复制次数ELDUP之积一样大。因此,一元素或复制次数个元素不能使用VECLEN分离。

群组复制操作到目的地向量大小。群组复制不改变在元素大小ELEM_BYTES与元素复制次数ELDUP之积等于或超过目的地向量宽度时供应的数据。在此类条件下,GRDUP位3006及VECLEN字段3004的状态对所供应的数据无效。

以下一组实例说明VECLEN与GRDUP之间的交互。以下实例中的每一者展示串流引擎如何跨向量数据路径侧B 116的不同流向量长度及向量大小将流映射到向量上。此实例的流包含64个位/8个字节的29个元素(E0到E28)。流可为29个元素的线性流或29个元素的内循环。表说明8个字节通道,例如图21中展示。所说明的每一向量转而存储于相应流头寄存器2818/2828中。

表14说明实例流如何在VECLEN是64个字节时映射到64字节处理器向量内的位上。

表14

处理器向量 通道7 通道6 通道5 通道4 通道3 通道2 通道1 通道0
1 E7 E6 E5 E4 E3 E2 E1 E0
2 E15 E14 E13 E12 E11 E10 E9 E8
3 E23 E22 E21 E20 E19 E18 E17 E16
4 0 0 0 E28 E27 E26 E25 E24

如表14中展示,流在4个向量上扩展。如先前描述,扩展超过流的向量4内的通道被零填充。当VECLEN具有等于原生向量长度的大小时,GRDUP值不重要,因为此VECLEN无复制发生。

表15展示与表14中展示的参数相同的参数,只是VECLEN具有32个字节。群组复制被停用(GRDUP=0)。

表15

处理器向量 通道7 通道6 通道5 通道4 通道3 通道2 通道1 通道0
1 0 0 0 0 E3 E2 E1 E0
2 0 0 0 0 E7 E6 E5 E4
3 0 0 0 0 E11 E10 E9 E8
4 0 0 0 0 E15 E14 E13 E12
5 0 0 0 0 E19 E18 E17 E16
6 0 0 0 0 E23 E22 E21 E20
7 0 0 0 0 E27 E26 E25 E24
8 0 0 0 0 0 0 0 E28

流的29个元素分布于8个向量中的通道0到3上。向量1到7中的额外通道4到7被零填充。在向量8中,通道1具有流元素(E28)且其它通道被零填充。

表16展示与表14中展示的参数相同的参数,只是VECLEN具有16个字节。群组复制被停用(GRDUP=0)。

表16

处理器向量 通道7 通道6 通道5 通道4 通道3 通道2 通道1 通道0
1 0 0 0 0 0 0 E1 E0
2 0 0 0 0 0 0 E3 E2
3 0 0 0 0 0 0 E5 E4
4 0 0 0 0 0 0 E7 E6
5 0 0 0 0 0 0 E9 E8
6 0 0 0 0 0 0 E11 E10
7 0 0 0 0 0 0 E13 E12
8 0 0 0 0 0 0 E15 E14
9 0 0 0 0 0 0 E17 E16
10 0 0 0 0 0 0 E19 E18
11 0 0 0 0 0 0 E21 E20
12 0 0 0 0 0 0 E23 E22
13 0 0 0 0 0 0 E25 E24
14 0 0 0 0 0 0 E27 E26
15 0 0 0 0 0 0 0 E28

流的29个元素分布于15个向量中的通道0及通道1上。向量1到14中的额外通道2到7被零填充。在向量15中,通道1具有流元素(E28)且其它通道被零填充。

表17展示与表14中展示的参数相同的参数,只是VECLEN具有8个字节。群组复制被停用(GRDUP=0)。

表17

流的29个元素出现于29个向量中的通道0中。向量1到29中的额外通道1到7被零填充。

表18展示与表15中展示的参数相同的参数,只是VECLEN具有32个字节且群组复制被启用(GRDUP=1)。

表18

流的29个元素分布于8个向量中的通道0到7上。每一向量1到7包含经复制的4个元素。复制次数(2)产生的原因是VECLEN(32个字节)是64个字节的原生向量长度的一半。在向量8中,通道0具有流元素(E28)且通道1到3被零填充。向量9的通道4到7复制此模式。

表19展示与表16中展示的参数相同的参数,只是VECLEN具有16个字节。群组复制被启用(GRDUP=1)。

表19

处理器向量 通道7 通道6 通道5 通道4 通道3 通道2 通道1 通道0
1 E1 E0 E1 E0 E1 E0 E1 E0
2 E3 E2 E3 E2 E3 E2 E3 E2
3 E5 E4 E5 E4 E5 E4 E5 E4
4 E7 E6 E7 E6 E7 E6 E7 E6
5 E9 E8 E9 E8 E9 E8 E9 E8
6 E11 E10 E11 E10 E11 E10 E11 E10
7 E13 E12 E13 E12 E13 E12 E13 E12
8 E15 E14 E15 E14 E15 E14 E15 E14
9 E17 E16 E17 E16 E17 E16 E17 E16
10 E19 E18 E19 E18 E19 E18 E19 E18
11 E21 E20 E21 E20 E21 E20 E21 E20
12 E23 E22 E23 E22 E23 E22 E23 E22
13 E25 E24 E25 E24 E25 E24 E25 E24
14 E27 E26 E27 E26 E27 E26 E27 E26
15 0 E28 0 E28 0 E28 0 E28

流的29个元素分布于15个向量中的通道0到7上。每一向量1到7包含复制四次的两个元素。复制次数(4)产生的原因是VECLEN(16个字节)是64个字节的原生向量长度的1/4。在向量15中,通道0具有流元素(E28)且通道1被零填充。此模式在向量15的通道2及3、通道4及5及通道6及7中复制。

表20展示与表17中展示的参数相同的参数,只是VECLEN具有8个字节。群组复制被启用(GRDUP=1)。

表20

处理器向量 通道7 通道6 通道5 通道4 通道3 通道2 通道1 通道0
1 E0 E0 E0 E0 E0 E0 E0 E0
2 E1 E1 E1 E1 E1 E1 E1 E1
3 E2 E2 E2 E2 E2 E2 E2 E2
4 E3 E3 E3 E3 E3 E3 E3 E3
5 E4 E4 E4 E4 E4 E4 E4 E4
6 E5 E5 E5 E5 E5 E5 E5 E5
7 E6 E6 E6 E6 E6 E6 E6 E6
8 E7 E7 E7 E7 E7 E7 E7 E7
9 E8 E8 E8 E8 E8 E8 E8 E8
10 E9 E9 E9 E9 E9 E9 E9 E9
11 E10 E10 E10 E10 E10 E10 E10 E10
12 E11 E11 E11 E11 E11 E11 E11 E11
13 E12 E12 E12 E12 E12 E12 E12 E12
14 E13 E13 E13 E13 E13 E13 E13 E13
15 E14 E14 E14 E14 E14 E14 E14 E14
16 E15 E15 E15 E15 E15 E15 E15 E15
17 E16 E16 E16 E16 E16 E16 E16 E16
18 E17 E17 E17 E17 E17 E17 E17 E17
19 E18 E18 E18 E18 E18 E18 E18 E18
20 E19 E19 E19 E19 E19 E19 E19 E19
21 E20 E20 E20 E20 E20 E20 E20 E20
22 E21 E21 E21 E21 E21 E21 E21 E21
23 E22 E22 E22 E22 E22 E22 E22 E22
24 E23 E23 E23 E23 E23 E23 E23 E23
25 E24 E24 E24 E24 E24 E24 E24 E24
26 E25 E25 E25 E25 E25 E25 E25 E25
27 E26 E26 E26 E26 E26 E26 E26 E26
28 E27 E27 E27 E27 E27 E27 E27 E27
29 E28 E28 E28 E28 E28 E28 E28 E28

流的29个元素全都出现于29个向量中的通道0到7上。每一向量包含复制八次的一个元素。复制次数(8)产生的原因是VECLEN(8个字节)是64个字节的原生向量长度的1/8。因此,每一通道在向量1到29中相同。

图31说明包含于图19的格式器块1903内的向量长度遮蔽/群组复制块2025(见图20)的实例。输入寄存器3100从图20中展示的元素复制块2024接收向量输入。输入寄存器3100包含布置于64个1字节块byte0到byte63中的64个字节。注意,字节byte0到byte63的长度各自等于最小ELEM_BYTES。一组多路复用器3101到3163将来自源寄存器3100的输入字节耦合到输出寄存器3170。每一相应多路复用器3101到3163将输入供应到输出寄存器3170的相应byte1到byte63。输入寄存器3100的并非所有输入字节byte0到byte63经耦合到每个多路复用器3101到3163。注意,没有多路复用器将供应输出寄存器3170的byte0。在此实例中,输出寄存器3170的byte0由输入寄存器3100的byte0供应。

多路复用器3101到3163由多路复用器控制编码器3180控制。多路复用器控制编码器3180接收ELEM_BYTES、VECLEN及GRDUP输入信号且产生用于多路复用器3101到3163的相应控制信号。ELEM_BYTES及ELDUP经供应到多路复用器控制编码器3180以检查确保VECLEN至少与ELEM_BYTES与ELDUP之积一样大。在操作中,多路复用器控制编码器3180控制多路复用器3101到3163将数目等于VECLEN的最低有效位从输入寄存器3100传送到输出寄存器3170。如果GRDUP=0指示群组复制被停用,那么多路复用器控制编码器3180控制剩余多路复用器3101到3163将零传送到输出寄存器3170的剩余最高有效位中的所有位。如果GRDUP=1指示群组复制被启用,那么多路复用器控制编码器3180控制剩余多路复用器3101到3163将输入寄存器3100的最低有效位的VECLEN数目复制到输出寄存器3170的最高有效通道中。此控制类似于上文描述的元素复制控制且用第一向量填充输出寄存器3170。针对下一向量,输入寄存器3100内的数据按VECLEN向下旋转,从而丢弃先前VECLEN最低有效位。格式器1903(图19)中的数据移动速率通过处理单元核心110(图1)经由下文描述的流读取及推进指令消耗数据的速率来设置。只要流包含额外数据元素,那么群组复制格式化重复。

元素复制(ELDUP)及群组复制(GRUDP)是独立的。注意,这些特征包含独立规格及参数设置。因此,元素复制及群组复制可一起或单独使用。由于这些被指定的方式,元素复制准许溢流到下一向量,而群组复制不准许。

再次参考图30,DECIM字段3007控制对应流的元素抽取。串流引擎125在存储于相应流头寄存器2818/2828中之后从流删除数据元素以呈现给请求功能单元。抽取移除全部数据元素,而非子元素。DECIM字段3007如表21中列举那样定义。

表21

DECIM 抽取次数
00 无抽取
01 2次
10 4次
11 保留

如果DECIM字段3007等于00,那么不发生抽取。数据元素无改变地传递到对应流头寄存器2818/2828。如果DECIM字段3007等于01,那么发生2:1抽取。串流引擎125在存储于流头寄存器2818/2828中之后从数据流移除奇数元素。格式化网络中的限制需要在数据提升至少2倍(PROMOTE不能是000)时采用2:1抽取,ICNT0必须是2的倍数,且总向量长度(VECLEN)必须足够大以保持单个经提升复制元素。针对经转置流(TRAMSPOSE≠0),转置颗粒在提升之前必须至少为元素大小(以字节为单位)的两倍。如果DECIM字段3007等于10,那么发生4:1抽取。串流引擎125保留每个第四数据元素,从而在存储于流头寄存器2818/2828中之后从数据流移除三个元素。格式化网络中的限制需要在数据提升至少4倍(PROMOTE不能是000、001或101)时采用4:1抽取,ICNT0必须是4的倍数,且总向量长度(VECLEN)必须足够大以保持单个经提升复制元素。针对经转置流(TRANSPOSE≠0),在一个实例中,抽取移除列且不移除行。因此,在此类情况中,转置颗粒在用于2:1抽取的提升之前必须至少为元素大小(以字节为单位)的两倍(GRANULE≥2×ELEM_BYTES)且在用于4:1抽取的提升之前必须至少为元素大小(以字节为单位)的四倍(GRANULE≥4×ELEM_BYTES)。

THROTTLE字段3008控制串流引擎在处理单元核心110之前获取的积极程度。此字段的2个位的编码如图22中展示那样定义。

表22

THROTTLE 描述
00 提前最小节流、最大获取
01 提前更少节流、更多获取
10 提前更多节流、更少获取
11 提前最大节流、最小获取

THROTTLE不改变流的意义且仅用作暗示。串流引擎可忽略此字段。程序不应依赖指定节流行为来保证程序正确性,因为架构不指定精确节流行为。THROTTLE允许程序员向硬件提供关于程序行为的暗示。在默认情况下,串流引擎尝试尽可能在处理单元核心110之前尽可能多地隐藏延时(等效于THROTTLE=11),同时向处理单元核心110提供全流吞吐量。虽然一些应用需要此水平的吞吐量,但此吞吐量会致使其它应用的不良系统级行为。举例来说,串流引擎丢弃跨上下文切换的所有获取数据。因此,在具有大量上下文切换的系统中,积极提前获取会导致带宽浪费。

DIMFMT字段3009定义流模板寄存器2900的循环维度字段DIM1 2911、DIM2 2912、DIM3 2913、DIM4 2914及DIM5 2915及寻址模式字段AM0 3013、AM1 3014、AM2 3015、AM33016、AM4 3017及AM5 3018(FLAGS字段2921的部分)的循环计数字段ICNT0 2901、ICNT12902、ICNT2 2903、ICNT3 2804、ICNT4 2905及ICNT5 2906中的哪些对特定流有效。表23列举DIMFMT字段3009的各个值的有效循环。每一有效循环计数必须是至少1且外有效循环计数必须大于1。

表23

DIR位3010确定内循环(循环0)的获取方向。如果DIR位3010是0,那么循环0获取在朝向递增地址的前向方向上。如果DIR位3010是1,那么循环0获取在朝向递减地址的后向方向上。其它循环的获取方向由对应循环维度DIM1、DIM2、DIM3、DIM4及DIM5的符号确定。

CBK0字段3011及CBK1字段3012在选择循环寻址之后控制循环块大小。确定循环块大小的方式在本文中描述。

AM0字段3013、AM1字段3014、AM2字段3015、AM3字段3016、AM4字段3017及AM5字段3018控制对应循环的寻址模式,从而准许寻址模式被独立指定用于每一循环。AM0字段3013、AM1字段3014、AM2字段3015、AM3字段3016、AM4字段3017及AM5字段3018中的每一者是3个位且如表24中列举那样解码。

表24

AMx字段 意义
00 线性寻址
01 循环寻址由CBK0设置的块大小
10 循环寻址由CBK0+CBK1+1设置的块大小
11 保留

在线性寻址中,地址根据地址算术是前向还是后向来推进。在循环寻址中,地址保持于经定义地址块内。在到达循环地址块的末尾之后,地址绕回到块的开始限制。循环寻址块限于2N个地址,其中N是整数。循环地址算术可通过切断位之间的进位链且不允许所选择数目个最高有效位改变来操作。因此,超出循环块末尾的算术仅改变最低有效位。块大小如表25中列举那样设置。

表25

在此实例中,循环块大小通过由CBK0(第一循环地址模式01)编码的数目或由CBK0+CBK1+1(第二循环地址模式10)编码的数目设置。举例来说,在第一循环地址模式中,循环地址块大小范围可从512个字节到16M字节。针对第二循环地址模式,循环地址块大小范围可从1K字节到64G字节。因此,经编码块大小是2(B+9)个字节,其中B是经编码块数,其是用于第一块大小(01的AMx)的CBK0及用于第二块大小(10的AMx)的CBK0+CBK1+1。

处理单元110(图1)通过少量指令及专门寄存器将串流引擎125(图28)暴露于程序。程序以SEOPEN及SECLOSE开始及结束流。SEOPEN打开新流且流保持打开直到由SECLOSE明确终止或由新流以SEOPEN替换。SEOPEN指令指定指示打开流0或流1的流编号。SEOPEN指令指定存储流的起始地址的数据寄存器。SEOPEN指令还指定存储流模板的流模板寄存器,如上文描述。SEOPEN指令的自变量列举于表26中。

表26

在此实例中,流起始地址寄存器是通用标量寄存器文件211(图2)中的寄存器。SEOPEN指令可经由实例指令编码1300(图13)的scr1字段1305(图13)指定流起始地址寄存器。SEOPEN指令指定操作码中的流0或流1。在此实例中,流模板寄存器是通用向量寄存器文件221中的向量寄存器。SEOPEN指令可经由scr2/cst字段1304(图13)指定流模板寄存器。如果指定流有效,那么SEOPEN指令关闭先前流且用指定流替换所述流。

SECLOSE将流明确标记为无效,从而刷新任何突出活动。进一步参考流触发异常。SECLOSE还允许程序提前终止一或两个流。

SESAVE指令通过捕获指定流的足够状态信息来保存流的状态以在将来重新开始所述流。SERSTR指令恢复先前保存的流。SESAVE指令保存流元数据且不保存任何流数据。流响应于SERSTR指令而重新获取流数据。

每一流可在复位之后处于以下三种状态中的一者:无效、有效或冻结。两个流以无效状态开始。打开流将流移动到有效状态。关闭流使流返回到无效状态。如果没有中断及异常,那么流通常不进行其它状态转变。为了解释中断,串流引擎添加第三状态:冻结。冻结状态表示经中断有效流。

在此实例中,4个位(每流2个位)定义两个流的状态。每流1个位驻留于串流引擎内,且另一位驻留于处理器核心110内。串流引擎内部追踪每一流是否保持与有效流相关联的参数组。此位区分无效流与非无效流。处理器核心110用任务状态寄存器(TSR)中每流的专用位单独追踪每一流的状态:TSR.SE0用于流0,且TSR.SE1用于流1。这些位区分有效与无效流。

打开流将流移动到有效状态。关闭流将流移动到无效状态。如果程序在冻结流上打开新流,那么新流替换旧流且串流引擎丢弃先前流的内容。串流引擎支持在当前有效流上打开新流。串流引擎丢弃先前流的内容,刷新管线,且开始获取新打开流的数据。一旦数据传回,则断言到处理器的数据。如果程序关闭已关闭的流,那么什么都不会发生。如果程序关闭打开或冻结流,那么串流引擎丢弃与流相关的所有状态,清理内部流有效位,且清理计数器、标签及地址寄存器。关闭流服务于两个目的。关闭有效流允许程序明确说明流且不再需要与流相关联的资源。关闭冻结流还允许上下文切换码以清理冻结流的状态,使得其它任务看不到它。

如上文指出,存在流保持寄存器2818或2828内的一些数据无效的情况。如上文描述,此状态可发生于流元素数目小于相应流保持寄存器2818/2828大小的内循环结束时或剩余流元素数目小于由VECLEN定义的通道的内循环结束时。在非内循环结束的时间,如果VECLEN小于流保持寄存器2818/2828的宽度且GRDUP被停用,那么流保持寄存器2818/2828中超出VECLEN的通道无效。

再次参考图28,在此实例中,串流引擎125进一步包含有效寄存器2819及2829。有效寄存器2819指示流头寄存器2818中的有效通道。有效寄存器2829指示流头寄存器2828中的有效通道。相应有效寄存器2819/2829包含对应流头寄存器2818/2828内的每一最小ELEM_BYTES通道的1个位。在此实例中,最小ELEM_BYTES是1个字节。处理器100的优选数据路径宽度及流头寄存器2818/2828的数据长度是64个字节(512个位)。因此,有效寄存器2819/2829具有64个位的数据宽度。有效寄存器2819/2829中的每一位指示流头寄存器2818/2828中的对应字节是否有效。在此实例中,0指示流头寄存器内的对应字节无效,且1指示对应字节有效。

在此实例中,在读取流头寄存器2818/2828中的相应者且将数据传送到请求功能单元之后,相应有效寄存器2819/2829中的无效/有效数据自动传送到对应于特定流的断言寄存器文件234(图2)内的数据寄存器。在此实例中,流0的有效数据存储于断言寄存器P0中,且流1的有效数据存储于断言寄存器P1中。

存储于断言寄存器234中的有效数据可以各种方式使用。功能单元可组合向量流数据与另一组向量且接着使用有效数据指示作为掩码将经组合数据存储到存储器,从而使相同过程能够用于循环数据的末尾,如用于其中所有通道有效的情况那样,此避免存储无效数据。存储于断言寄存器文件234中的有效指示可在其它过程中用作掩码或操作数。P单元246(图2)可具有计数断言寄存器中的1数目的指令(BITCNT,其可用于从断言寄存器确定有效数据元素的计数)。

图32说明用于产生存储于有效寄存器2819(图28)中的有效/无效指示的实例硬件3200。图32说明用于流0的硬件;流1包含对应硬件。硬件3200操作以每当数据在流头寄存器2818(图28)中更新时产生一个有效字。第一输入ELTYPE经供应到解码器3201。解码器3201基于元素大小ELEM_BYTES及元素是实数还是复数来产生对应于最小数据大小的输出TOTALELEMENT SIZE。ELTYPE的各种编码的意义在表9中展示。表27展示各种ELTYPE编码的解码器3201的实例输出(以字节为单位)。注意,表9列举位且表27列举字节。如表27中展示,TOTALELEMENT SIZE在元素是实数时为1、2、4或8个字节及在元素是复数时为2、4、8或16个字节。

表27

ELTYPE 实数/复数 总元素大小字节
0000 实数 1
0001 实数 2
0010 实数 4
0011 实数 8
0100 保留 保留
0101 保留 保留
0110 保留 保留
0110 保留 保留
1000 复数,未交换 2
1001 复数,未交换 4
1010 复数,未交换 8
1011 复数,未交换 16
1100 复数,已交换 2
1101 复数,已交换 4
1110 复数,已交换 8
1111 复数,已交换 16

第二输入PROMOTE经供应到解码器3202。解码器3202产生对应于PROMOTE输入的输出提升倍数。PROMOTE的各种编码的意义在表28中展示,表28展示各种PROMOTE编码的解码器3202的实例输出(以字节为单位)。扩展类型的差异(零扩展或符号扩展)与解码器3202不相关。

表28

解码器3201及3202的输出经供应到乘法器3203。由乘法器3203产生的积是对应于TOTAL ELEMENT SIZE及提升倍数的通道大小。因为提升倍数是2的整数幂(2N),所以乘法可通过TOTAL ELEMENT SIZE的对应移位来实现,例如无移位针对提升倍数1、1位移位针对提升倍数2、2位移位针对提升倍数4及3位移位针对提升倍数8。

NUMBER OF LANES单元3204接收向量长度VECLEN及LANE SIZE且产生NUMBER OFLANES。表29展示通道大小(以字节为单位)的通道数及向量长度VECLEN的实例解码。

表29

如先前说明,VECLEN必须大于或等于元素大小与复制次数之积。如表29中展示,VECLEN还必须大于或等于元素大小与提升倍数之积。此意味着VECLEN必须足够大以保证元素不会与由类型提升块2022(图20)产生的其扩展分离。表29中标记为“-”的对角线下方的单元指示未准许的参数组合。

单元3204的NUMBER OF LANES输出用作LANE/REMAINING ELEMENTS CONTROL WORD单元3211的一个输入。第二输入来自多路复用器3212。多路复用器3212接收循环0输入及循环1输入。循环0输入及循环1输入表示对应循环的当前迭代中的剩余元素数。

图33说明图28中展示的地址产生器2811的部分示意图。地址产生器2811形成用于获取对应串流引擎的定义流中的下一元素的地址。起始地址寄存器3301存储数据流的起始地址。如先前上文描述,在此实例中,起始地址寄存器3301是由打开对应流的SEOPEN指令指定的全局标量寄存器文件211中的标量寄存器。起始地址可从指定标量寄存器复制且通过包含于地址产生器2811内的控制逻辑来本地存储于相应地址产生器2811/2821处。流的第一循环采用循环0计数寄存器3311、加法器3312、乘法器3313及比较器3314。循环0计数寄存器3311存储第一循环(循环0)的迭代计数的工作副本。针对循环0的每一迭代,加法器3312在由下一地址信号触发时使循环计数加1,其被存储回循环0计数寄存器3311中。乘法器3313使当前循环计数与数量ELEM_BYTES相乘。ELEM_BYTES是循环0中的每一数据元素的大小(以字节为单位)。循环0遍历在具有迭代步长ELEM_BYTES的存储器中物理连续的数据元素。

比较器3314比较存储于循环0计数寄存器3311中的计数(在通过加法器3313递增之后)与来自对应流模板寄存器2900(图29)的ICNT0 2901(图29)的值。当加法器3312的输出等于流模板寄存器2900的ICNT0 2901的值时,循环0的迭代完成。比较器3314产生有效循环0结束信号。循环0计数寄存器3311复位到0且下一更高循环(在此情况中是循环1)的迭代被触发。

较高循环(循环1、循环2、循环3、循环4及循环5)的电路类似于图33中说明的电路。每一循环包含相应工作循环计数寄存器、加法器、乘法器及比较器。每一循环的加法器由前一循环的循环结束信号触发。每一乘法器的第二输入是来自对应流模板的对应维度DIM1、DIM2、DIM3、DIM4及DIM5。每一循环的比较器比较工作循环寄存器计数与对应流模板寄存器2900的对应迭代值ICNT1、ICNT2、ICNT3、ICNT4及ICNT5。循环结束信号产生下一更高循环的迭代。来自循环5的循环结束信号结束流。

图33还说明循环0计数的产生。循环0计数等于存储于对应工作计数寄存器3311中的更新数据。循环0计数基于工作循环0计数寄存器3311的每一变化来更新。较高循环(循环1、循环2、循环3、循环4及循环5)的循环计数类似地产生。

图33还说明循环0地址的产生。循环0地址等于从乘法器3313输出的数据。循环0地址基于工作循环0计数寄存器3311每一变化来更新。用于循环1、循环2、循环3、循环4及循环5的类似电路产生对应循环地址。在此实例中,循环0计数寄存器3311及其它循环计数寄存器经实施为递增计数寄存器。在另一实例中,初始化及比较操作为递减计数电路。

再次参考图32,例如循环0/的循环递减计数值由表达式(2)给出。

Loopx/=ICNTx-Loopx (2)

因此,循环递减计数是在流模板寄存器中指定的初始迭代计数与如图33中说明那样产生的循环递增计数之间的差。

LANE/REMAINING ELEMENTS CONTROL WORD单元3211(图32)基于来自NUMBER OFLANES单元3204的通道数及由多路复用器3212选择的循环递减计数产生控制字3213。多路复用器3212的控制输入是来自图30的字段3002的TRANSPOSE信号。如果TRANSPOSE被停用(“000”),那么多路复用器3212选择循环0递减计数Loop0/。针对TRANSPOSE的所有其它合法值(“001”、“010”、“011”、“100”、“101”及“110”),多路复用器3212选择循环1递减计数Loop1/。串流引擎将最内维度映射到向量中的连续通道。针对正常流,其是Loop0。针对经转置流,其是Loop1,因为转置交换两个维度。

LANE/REMAINING ELEMENTS CONTROL WORD单元3211产生控制字3213如下。控制字3213具有等于来自单元3204的通道数的位数。如果所选择循环的剩余元素计数大于或等于通道数,那么所有通道有效。针对此情况,控制字3213全部为1以指示向量长度VECLEN内的所有通道有效。如果所选择循环的剩余元素计数是非零且小于通道数,那么一些通道有效且一些通道无效。根据上文结合图21及22描述的通道分配,流元素以最低有效通道开始被分配通道。在这些情况下,控制字3213包含等于所选择循环递减计数的数目的设置为1的最低有效位的数目。控制字3213的所有其它位被设置为零。在图32中说明的实例中,通道数等于8且在3个无效(0)最高有效位之后有5个有效(1)最低有效位,其对应于具有最终迭代中剩余的5个元素的循环。

控制字扩展单元3214基于LANE SIZE的量值扩展控制字3213。经扩展控制字包含用于每一最小通道的1个位。在此实例中,最小流元素大小且因此最小通道大小是1个字节(8个位)。在此实例中,保持寄存器2818/2828的大小等于64个字节(512个位)的向量大小。因此,经扩展控制字具有64个位,流保持寄存器2818/2828的每一字节1个位。此经扩展控制字填充对应有效寄存器2819及2829(图28)的最低有效位。

针对VECLEN等于向量长度的情况,描述是完整的。经扩展控制字包含用于相应有效寄存器2819/2829内的所有位置的位。当VECLEN不等于向量长度时,存在一些额外考虑。当VECLEN不等于向量长度时,经扩展控制字不具有足够位来填充对应有效寄存器2819/2829。如图32中说明,经扩展控制字填充对应有效寄存器2819/2829的最低有效位,从而为VECLEN宽度内的通道提供有效/无效位。为超出VECLEN宽度直到流头寄存器2818的数据宽度的通道提供另一机构。

仍参考图32,说明多路复用器3215及群组复制单元3216以提供所需额外有效/无效位。参考VECLEN的描述,如果群组复制未被启用(GRDUP=0),那么额外通道无效。多路复用器3215的第一输入是包含数目等于VECLEN的多个位的INVALID 0信号。当GRDUP=0时,多路复用器3215选择此输入。群组复制单元3216将此输入复制到流头寄存器2818的所有额外通道。因此,有效寄存器2819的最高有效位被设置为零,从而指示流头寄存器2818的对应字节无效。此发生于表15中展示的实例的向量1到8、表16中展示的实例的向量1到15及表17中展示的实例的向量1到29。

在另一实例中,多路复用器3215及群组复制块3216用类似于图31中说明的群组复制逻辑2025的群组复制逻辑替换。

如先前描述,如果群组复制被启用(GRDUP=1),那么流头寄存器2818(图28)的额外通道用最低有效位的副本填充。多路复用器3215的第二输入是来自控制字扩展单元3214的经扩展控制字。当GRDUP=1时,多路复用器3215选择此输入。群组复制单元3216将此输入复制到流头寄存器2818的所有额外通道。

存在两种可能结果。在一种结果中,在多数情况中,VECLEN内的所有通道有效且来自控制字扩展单元3214的位全部为1。此发生于表18中展示的群组复制实例的向量1到7及表19中展示的群组复制实例的向量1到14。在这些条件下,来自控制字扩展单元3214的经扩展控制字的所有位是1且流头寄存器2818的所有通道有效。因此,群组复制单元3216用1填充所有额外通道。在另一结果中,剩余流数据元素数小于VECLEN内的通道数。此发生于表18中展示的群组复制实例中的向量8及表19中展示的群组复制实例中的向量15。在这些条件下,VECLEN内的一些通道有效且一些通道无效。群组复制单元3216用具有与经扩展控制字位相同的模式的位填充额外通道。在任一情况中,额外通道经填充对应于经扩展控制位。

仍参考图32,说明最低有效位与最高有效位之间的边界3217。此边界的位置由相对于流头寄存器2818的大小的VECLEN的大小设置。

图34是说明上文描述的流输入操作数编码的部分示意图3400。图34说明解码一个指令的src1字段1305以控制功能单元3420的对应src1输入的指令解码器113(见图1)的一部分。这些相同或类似电路经复制用于控制功能单元3420的指令的src2/cst字段1304。另外,这些电路经复制用于能够采用流数据作为操作数的执行包内的每一指令,其被同时分派。

指令解码器113接收指令的src1字段1305的位13到17。操作码字段(所有指令的位3到12及无条件指令的位28到31)明确指定对应功能单元3420及待执行功能。在此实例中,功能单元3420可为L2单元241、S2单元242、M2单元243、N2单元244或C单元245。图34中说明的指令解码器113的相关部分解码src1位字段1305。子解码器3411确定src1位字段1305是否在从00000到01111的范围内。如果情况是这样,那么子解码器3411将对应寄存器数目供应到全局向量寄存器文件231。在此实例中,寄存器数目是src1位字段1305的4个最低有效位。全局向量寄存器文件231调用存储于寄存器中的对应于寄存器数目的数据且将数据供应到功能单元3420的src1输入。

子解码器3412确定src1位字段1305是否在从10000到10111的范围内。如果情况是这样,那么子解码器3412将对应寄存器数目供应到对应局部向量寄存器文件。如果指令被引导到L2单元241或S2单元242,那么对应局部向量寄存器文件是局部向量寄存器文件232。如果指令被引导到M2单元243、N2单元244或C单元245,那么对应局部向量寄存器文件是局部向量寄存器文件233。在此实例中,寄存器数目是src1位字段1305的3个最低有效位。对应局部向量寄存器文件232/233调用存储于寄存器中的对应于寄存器数目的数据且将数据供应到功能单元3420的src1输入。

子解码器3413确定src1位字段1305是否为11100。如果情况是这样,那么子解码器3413将流0读取信号供应到串流引擎125。接着,串流引擎125将存储于保持寄存器2818中的流0数据供应到功能单元3420的src1输入。

子解码器3414确定src1位字段1305是否为11101。如果情况是这样,那么子解码器3414将流0读取信号供应到串流引擎125。接着,串流引擎125将存储于保持寄存器2818中的流0数据供应到功能单元3420的src1输入。子解码器3414还将推进信号供应到流0。如先前描述,串流引擎125推进到将流0的数据元素的下一循序向量存储于保持寄存器2818中。

由子解码器3413或子解码器3414将流0读取信号供应到串流引擎125触发另一数据移动。在此流0读取信号之后,串流引擎125将存储于有效寄存器2819中的数据供应到断言寄存器文件234进行存储。在此实例中,此是断言寄存器文件234内的预定数据寄存器。在此实例中,数据寄存器P0对应于流0。

子解码器3415确定src1位字段1305是否为11110。如果情况是这样,那么子解码器3415将流1读取信号供应到串流引擎125。接着,串流引擎125将存储于保持寄存器2828中的流1数据供应到功能单元3420的src1输入。

子解码器3416确定src1位字段1305是否为11111。如果情况是这样,那么子解码器3416将流1读取信号供应到串流引擎125。接着,串流引擎125将存储于保持寄存器2828中的流1数据供应到功能单元3420的src1输入。子解码器3414还将推进信号供应到流1。如先前描述,串流引擎125推进到将流1的数据元素的下一循序向量存储于保持寄存器2828中。

由子解码器3415或子解码器3416将流1读取信号供应到串流引擎125触发另一数据移动。在此流1读取信号之后,串流引擎125将存储于有效寄存器2829中的数据供应到断言寄存器文件234进行存储。在此实例中,此是断言寄存器文件234内的预定数据寄存器。在此实例中,数据寄存器P1对应于流1。

类似电路用于响应于src2/cst字段1304的位编码而选择供应到功能单元3402的scr2输入的数据。功能单元3420的src2输入可以上文描述的方式被供应常数输入。如果指令解码器113从scr1字段1305或scr2/cst字段1304产生流0的读取信号,那么串流引擎125将存储于有效寄存器2819中的数据供应到断言寄存器文件234的断言寄存器P0用于存储。如果指令解码器113从scr1字段1305或scr2/cst字段1304产生流1的读取信号,那么串流引擎125将存储于有效寄存器2829中的数据供应到断言寄存器文件234的断言寄存器P1进行存储。

专用于操作数规格的指令位的准确数目及数据寄存器及流的数目是设计选择。特定来说,单个全局向量寄存器文件的规格及局部向量寄存器文件的省略是可行的。此实例采用输入操作数选择字段的位编码来指定流读取且采用另一位编码来指定流读取且推进流。

图34中说明的过程在每次读取流数据时将有效数据自动传送到断言寄存器文件234中。接着,所传送有效数据可由P单元246用于进一步计算元数据。所传送有效数据还可由包含L2单元241、S2单元242、M2单元243、N2单元244及C单元245的向量数据路径侧B 116功能单元中的一或多者用作掩码或其它操作的操作数。存在采用此流有效数据的众多可行复合逻辑运算。

图35是说明用于选择操作数源的另一实例配置的部分示意图3500。在此实例中,相应流有效寄存器2819/2829无需自动加载到断言寄存器文件234中的预定寄存器。相反地,P单元246的显式指令用于移动数据。图35说明解码一个指令的src1字段1305以控制P单元246的对应src1输入的指令解码器113(见图1)的一部分。这些相同或类似电路可经复制用于控制P单元246的指令的src2/cst字段1304(图13)。

指令解码器113接收指令的src1字段1305的位13到17。操作码字段操作码字段(所有指令的位3到12及无条件指令的位28到31)明确指定P单元246及待执行功能。图35中说明的指令解码器113的相关部分解码src1位字段1305。子解码器3511确定src1位字段1305是否在范围00000到01111内。如果情况是这样,那么子解码器3511将对应寄存器数目供应到全局向量寄存器文件231。在此实例中,寄存器数目是src1位字段1305的4个最低有效位。全局向量寄存器文件231调用存储于寄存器中的对应于寄存器数目的数据且将数据供应到P单元246的src1输入。

子解码器3512确定src1位字段1305是否在范围10000到10111内。如果情况是这样,那么子解码器3512将经解码寄存器数目供应到断言寄存器文件234。在此实例中,寄存器数目是src1位字段1305的3个最低有效位。断言寄存器文件234调用存储于寄存器中的对应于寄存器数目的数据且将数据供应到断言单元246的src1输入。

子解码器3513确定src1位字段1305是否为11100。如果情况是这样,那么子解码器3513将流0有效读取信号供应到串流引擎125。接着,串流引擎125将存储于有效寄存器2819中的有效数据供应到P单元246的src1输入。

子解码器3514确定src1位字段1305是否为11101。如果情况是这样,那么子解码器3514将流1有效读取信号供应到串流引擎125。接着,串流引擎125将存储于有效寄存器2829中的流1有效数据供应到P单元246的src1输入。

采用流有效寄存器2819/2829作为操作数的P单元246指令可为先前描述的任何P单元指令,例如NEG、BITCNT、RMBD、DECIMATE、EXPAND、AND、NAND、OR、NOR及XOR。

上文指出的特殊指令可限于P单元242。因此,图34及35中概述的操作可一起使用。如果由指令指定的功能单元是L2单元241、S2单元242、M2单元243、N2单元244或C单元245,那么src1字段1305如关于图34概述那样解译。如果由指令指定的功能单元是P单元246,那么src1字段1305如关于图35概述那样解译。替代地,将流有效寄存器自动保存到图34中说明的预定断言寄存器可在一个实例中实施且在另一实例中不实施。

矩阵乘法加速器

图36是包含处理单元核心110、串流引擎125、系统存储器3630及矩阵乘法加速器(MMA)3640的系统3600的框图。MMA 3640是作为处理单元核心110的第三类型的功能单元的紧密耦合的矩阵乘法加速单元。另两者是标量数据路径115(图1)及向量数据路径116(图1)。MMA 3640使系统3600能够达到大群组的图像及数据处理应用要求。MMA 3640支持矩阵乘法的高计算性能要求。在串流引擎125、处理单元核心110及L2存储器130的支持下,MMA3640高效计算各种视觉算法、稠密线性代数、FFT运算及包含卷积神经网络(CNN)、运动恢复结构(SFM)、雷达等的高级应用需要的大量MAC(杂积),无需增加到处理单元核心110中的存储器带宽。

一般来说,MMA 3640支持两个矩阵的矩阵乘法。如表达式(3)中展示,当矩阵A是[nx m]矩阵且矩阵B是[m x p]矩阵时,矩阵乘法输出矩阵C。

其中每一i,j元素通过使元素Aik(跨A的行i)乘以元素Bkj(沿B的列j)来给出,其中k=1、2、…、m。

图37更详细说明实例矩阵A、矩阵B及所得矩阵C。每一结果元素Cij是来自矩阵A的行的元素与来自矩阵B的列的元素之积和,如由表达式(3)定义。

返回参考图36,MMA包含保持矩阵A的A[.]缓冲器3641、保持矩阵B的B[.]缓冲器3642及收集矩阵C的结果元素的C[.]缓冲器3643。MMA 3643包含个别乘法器的阵列及一组累加器(如3644处指示)以允许在MMA 3640的一个执行循环中计算C矩阵的整行。在实例中,MMA 3640经配备以处置32x32 16位固定/浮点矩阵乘法及在32个循环中产生32x32 16位积矩阵。

在实例中,MMA 3640还经配备以使两个64x64 8位矩阵通过将每一者分成4个32x32子矩阵、使子矩阵的各个组合相乘及接着组合结果来相乘以产生最终64x64 8位矩阵结果。其它实例可经实施以支持具有比8或16位更大或更小精度的更大或更小矩阵。

为了使MMA 3640在小于其原生大小的矩阵(例如上文提及的32x32实例)上正确操作,每一输入矩阵A及B的所有元素都含有有效数据。未使用元素应被设置为零或某其它商定空值。串流引擎125包含支持使数组的未使用元素在流存取期间为空,无需执行额外存储器存取,如下文更详细描述。在实例中,串流引擎125包含支持在流存取期间插入零或所选择值(例如最大值或最小值),无需执行存储器存取来提供所选择值。

MMA的串流引擎支持

仍参考图36,串流引擎125经由统一存储器控制器(UMC)3601对接L2存储器130。UMC 3601通过系统3600中的各个功能单元来协调对L2存储器130的存取。数据路由单元3602对接UMC 3601以将日期路由到系统存储器130中。流头寄存器2818/2828(图28)及有效寄存器2819/2829(图28)的输出经由相应总线2840/2841提供到串流引擎接口3611且因此提供到处理单元核心110中的逻辑单元。在此实例中,S单元242可经编程以将一个流从SE125传递到MMA A[.]缓冲器3641且将另一流从SE 125传递到B[.]缓冲器3642。积矩阵C[.]的输出可经由UMC 3601引导到L2存储器130或经由C单元245中展示的目的地多路复用器引导到寄存器文件233中的目的地寄存器。

图38是图28的串流引擎125的一部分的更详细框图。线性流适用于大量算法,但非全部。举例来说,矩阵乘法提出针对串流引擎的独有问题,因为矩阵积中的每一元素含有来自第一矩阵的行与来自第二矩阵的列之间的向量点积的结果。程序可全部以行优先或列优先顺序存储矩阵。行优先顺序将单行的所有元素连续存储于存储器中。C及C++程序通常以行优先顺序存储数组。列优先顺序将单列的所有元素连续存储于存储器中。FORTRAN程序通常以列优先顺序存储数组。取决于编程语言,矩阵可以与语言的默认数组顺序相同的顺序存储。

因此,矩阵乘法中的两个矩阵中的仅一者映射到串流引擎的2维流定义。此问题不是串流引擎独有的。实际上,矩阵乘法的存取模式不适合于多数通用存储器阶层。一些软件库通过直接转置两个矩阵中的一者来解决此问题,使得两者在乘法期间逐行(或逐列)存取。

转置模式

使用串流引擎,程序无需走极端。串流引擎支持与经转置流的概念的隐式矩阵转置。经转置流避免明确变换存储器中的数据的成本。不是以严格连续元素顺序存取数据,而是串流引擎以其遍历顺序有效互换两个内循环维度,从而沿到连续向量通道中的第二维度获取元素。

转置模式互换两个最内循环级。因此,在转置模式中,互换两个最内循环ICNT0及ICNT1。ICNT1确定每一列中的行数。列被定义为GRANULE大小。ICNT0是转置流中的第二维度且定义水平宽度(其可或可不为GRANULE的倍数)。在此实例串流引擎中,最大行高度ICNT1必须是至少1且小于或等于16。在转置中对ICNT0没有约束。然而,如果ICNT0不是GRANULE大小的倍数,那么串流引擎将在每一GRANULE的缺失元素中填补零。

流0引擎2810的粗旋转器2835及数据存储装置2816在图38中说明;然而,流1引擎2820的粗旋转器2836与数据存储装置2826类似且以类似方式操作。转置模式由流0引擎2810(图28)使用粗旋转器2835、数据存储单元2816及蝶形网络2817的资源执行。转置模式由流1引擎2820(图28)使用粗旋转器2836(图28)、数据存储单元2826(图28)及蝶形网络2827(图28)的资源执行。

在此实例中,数据存储装置2816经组织为具有64个字节(512个位)的32个槽的寄存器文件3810。其它实例可提供更大或更小量的存储,无需改变流的语义。数据存储装置2816经组织为各自是8个字节(64个位)宽的8个独立存储体。每一存储体包含两个写入端口及两个读取端口。在此实例中,每一存储体还包含两个位/线用于奇偶校验保护。

在转置模式中,SE将内部存储组织成扇区片块,且扇区片块数取决于当前垂直计数(ICNT1)被设置为什么。此允许SE获取尽可能多的行及列且将从L2回来的数据组织及旋转到扇区中。此允许SE在转置模式中读取及写入数据时每存储体使用读取及写入端口两者,使得数据可根据其扇区来旋转及排序。

在此实例中,粗旋转器2835包含由多路复用器3806、3807、3808表示的一组16路复用器。例如多路复用器3806的每一多路复用器具有16个输入,其各自是4个字节(32个位)宽且经连接以接收由L2接口2833在总线3802上提供的所有512个位。每一多路复用器的4字节输出经耦合以将数据提供到寄存器文件3810的相应存储体的一半。寄存器文件3810的每一存储体经耦合以从两个多路复用器(例如3806、3807)并行接收数据,使得经由总线3802从L2接口接收到的数据可以4字节元素操纵。

参考队列2815接收存储分配且追踪来自存储及分配逻辑2814(图28)的元数据。由于数据的每一512位行从L2经由L2接口2833(图28)接收,所以控制逻辑3804产生控制信号以独立控制16路复用器3806、3807、3808中的每一者,使得来自接收到的数据512位行的任何4字节数据元素可基于由参考队列2815提供的元数据存储于寄存器文件3810的所选择槽中的8个存储体中的每一者的任一侧中。粗旋转器2835允许数据的每一512位行由流0引擎2810旋转、移位、截断或复制,如上文更详细描述。此外,矩阵转置可由流0引擎2810使用粗旋转器2835执行,如下文将更详细描述。

对准网络3820及3821各自类似于粗旋转器2835。在此实例中,对准网络3820包含由多路复用器3822、3823表示的一组16路复用器。例如多路复用器3822的每一多路复用器具有32个输入,其各自是4个字节(32个位)宽且经连接以接收由寄存器文件3810的两个读取端口中的每一者提供的所有512个位。例如多路复用器3822的每一多路复用器的4字节输出经耦合以将数据提供到蝶形网络2817的相应输入。以此方式,多路复用器3822、3823可从寄存器文件3810选择16个4字节数据元素以形成提供到蝶形网络2817的64字节数据行。

类似地,在此实例中,对准网络3821包含由多路复用器3824、3825表示的一组16路复用器。例如多路复用器3824的每一多路复用器具有32个输入,其各自是4个字节(32个位)宽且经连接以接收由寄存器文件3810的两个读取端口中的每一者提供的所有512个位。例如多路复用器3824的每一多路复用器的4字节输出经耦合以将数据提供到蝶形网络2817的相应输入。以此方式,多路复用器3824、3825可从寄存器文件3810选择16个4字节数据元素来形成提供到蝶形网络2817的64字节数据行。

控制逻辑3814产生控制信号来独立控制对准网络3820中的16路复用器3822、3823中的每一者及对准网络3821中的16路复用器3824、3825中的每一者,使得从寄存器文件3810检索的任何4字节数据元素可基于由参考队列2815提供的元数据来对准到提供到蝶形网络2817的两个64字节输出行内的任何4字节位置。

蝶形网络2817由流0引擎2810控制以在将格式化数据发送到处理单元核心110之前进一步格式化从数据存储装置2816检索的数据,如关于图20、图28更详细描述。蝶形网络2817包含执行数据格式化的交叉耦合多路复用器节点的多个等级。

在此实例中,用于粗旋转器2835的控制逻辑3804及用于数据存储装置2816的控制逻辑3814经实施为能够基于由参考队列2815提供的元数据的内容并行产生多路复用器及寄存器文件3810中的每一者的控制信号的异步布尔逻辑。

在转置模式中,SE0 2810将内部存储装置2816组织成扇区片块,且扇区片块数取决于当前垂直计数(ICNT1)被设置为什么。此允许SE0 2810获取尽可能多的行及列且将从L2 130(图1)回来的数据组织及旋转到数据存储装置2816的扇区中。在此实例中,寄存器文件3810包含32个行x64个字节且经组织为8个独立4端口存储体。此允许SE02810在转置模式中读取及写入数据时每存储体使用读取/写入端口两者,因为数据根据其扇区来旋转及排序。

粗旋转器由控制逻辑3804基于在参考队列2815(图28、图38)中排队的元数据来控制。元数据由存储分配追踪逻辑2814(图28)从矩阵3700的流参数导出。

将空向量插入到流中

参考图38,控制逻辑3814可基于由参考队列2815提供的元数据来控制对准网络3820、3821上的多路复用器中的每一者迫使空值到流向量的所选择元素上。以此方式,整个流向量可被设置为空值,无需从系统存储器获取任何数据。在实例中,空值是“0”。在另一实例中,预定义值或模式可用于表示空值。

在另一实例中,控制逻辑3814可基于由参考队列2815提供的元数据来控制对准网络3820、3821上的多路复用器中的每一者迫使所选择值到流向量的所选择元素上。以此方式,整个流向量可被设置为所选择值(例如最小值或最大值),无需从系统存储器获取任何数据。

在此实例中,地址产生器2811/2821(见图28)中的控制逻辑对六级嵌套迭代执行计数追踪。如下文将更详细描述,可检测与六级嵌套迭代中的一或多者相关联且用于发信号通知空值或所选择值将插入到向量流中(无需从存储器获取空值或所选择值向量的数据)的各种条件。

将由地址产生器产生的元数据推送到流参考队列2815/2825(见图28)中。在后端上,当处理单元核心110(图1)执行读取时,弹出此元数据且用指定为空或设置为所选择值的通道将其发送到对准网络2820/2821中的控制逻辑3814,无需从系统存储器读取数据。元数据保持追踪减量维度(DECDIM)及维度宽度(DECDIM_WIDTH)且馈送到后端逻辑,如下文更详细描述。

数据带挖掘支持

例如各种视觉算法、稠密线性代数、FFT运算及包含卷积神经网络(CNN)、运动恢复结构(SFM)及雷达的高级应用的复信号处理应用需要复多维数据结构的数字操作。数据结构的边界需要经清理使得异常数据不包含于在边界处进行的计算中。通常,此需要程序员分配数据结构的边界处的存储器空间,其可预设为例如零或最大或最小数据值的已知值。接着,预设边界数据采用额外处理循环来存取及设置边界数据值。

实例蒸汽机125(图1)包含允许程序员指定由蒸汽机125支持的六维嵌套循环中的一或多者的减量维度(DECDIM_WIDTH)参数,其不同于由相应循环维度参数定义的维度。以此方式,串流引擎125可经编程以在数据流由串流引擎从系统存储器获取时将适当已知值插入到数据流中。此外,串流引擎125可经编程以插入对应于数据结构的边界区的空或已知值流向量,无需存取这些边界区流向量的系统存储器,借此减少处理循环及时间。

在实例中,DECDIM特征使用包含第一减量旗标(DECDIMx)(其中在此实例中“x”是“1”或“2”)、第二减量旗标(DECDIMxSD)的两组旗标及相应宽度参数(DECDIMx_WIDTH)。此允许程序员在嵌套循环的所选择维度上定义4个掩码值以遮蔽流数据的部分或使流数据的部分归零。表30定义应用到串流引擎125的实例的一组实例DECDIM旗标。在此实例中,3个位用于定义DECDIMx旗标,同时仅2个位用于定义DECDIMxSD旗标。在此实例中,DECDIMxSD旗标因此限于DIM1到DIM3。支持DECDIM的设置的各种组合,如下文更详细描述。

表30控制数据带挖掘操作的DECDIM旗标

参考图29,两个DECDIMx_WIDTH字段2931、2932经定义于流模板寄存器2900内。接着,DECDIM1_WIDTH 2931与包含于流模板寄存器2900的旗标字段2921中的DECDIM1旗标3019(图30)及DECDIM1SD旗标3020(图30)一起使用。DECDIM2_WIDTH 2932与DECDIM2旗标3019(图30)及DECDIM2SD旗标3020(图30)一起使用。

DECDIMx旗标字段及DECDIMx_WIDTH支持数据带挖掘特征,其允许程序员使用DECDIM_WIDTH计数定义图像的“总实际宽度”大小以提供此最大实际宽度。在此模式中,当地址产生器2811/2821(图28)进入所选择维度(DIM1到DIM5)时,DECDIM_WIDTH按所述循环维度递减,如表30中展示。举例来说,如果DECDIM=010b,那么每当循环进入维度2时,DECDIM_WIDTH的当前值按DIM2值递减。当DECDIM_WIDTH变成小于ICNT0(DECDIM模式中的“片块宽度”)时,SE 125将用零数据填补未使用元素。此称为“数据带挖掘”。

当所选择DECDIM维度循环计数(ICNT)期满时,DECDIM_WIDTH计数值将仅再次重新加载到经编程值。在上文实例中,当维度2(即,ICNT2)期满时,宽度将重新加载,且进入维度3。换句话说,当进入高于所选择DECDIM维度的任何维度时,宽度重新加载。因此,可编程小于所选择维度的循环迭代计数的宽度,此可致使宽度计数下溢。此在下文进一步描述。

如上文提及,还存在第二DECDIMxSD旗标。第二旗标允许其相应DECDIMx旗标顶部上的“第二减量”计数掩码用于相应DECDIM_WIDTH。换句话说,当进入或结束相应所选择维度时,相应DECDIM_WIDTH使用相应DECDIMx及DECDIMxSD两者的设置来递减或重新加载。

在实例中,DECDIM选择可针对任何DIM1到DIM5设置,同时以线性模式操作。然而,在转置模式中,不支持DIM1选择且仅支持DIM2到DIM5。在此实例中,所选择DIMx值必须为无符号值(即,DIMx位31是零)。所有其它维度可为无符号或带符号。

举例来说,如果DECDIM=010b,那么DIM2必须是无符号值。DIM1、DIM3、DIM4及DIM5可为无符号或带符号。在实例硬件中,最内循环计数依据总字节数按比例缩放。换句话说,最内循环ICNT值等于(ICNT0 x ELEM_BYTES),且在DECDIM模式情况中,DECDIM_WIDTH计数是(DECDIM_WIDTH x ELEM_BYTES)。在处理单元核心110获取期间,在考虑任何数据格式化(元素复制、提升、抽取)之前,最内循环计数在已消耗所有元素时期满。因此,在数据格式化启用的情况下,多个处理单元核心110获取可在最内循环计数期满之前发生。

在实例中,在其中所选择DECDIM(即,ICNT1到ICNT5)的循环迭代计数参数被不正确编程以致使DECDIM_WIDTH计数在按所选择DIMx值递减时下溢的情况中,DECDIM_WIDTH计数值将在零处饱和。当饱和发生时,串流引擎125将使DECDIM_WIDTH计数保持为零,且处理单元核心110之后的数据阶段也将是零。

下表及图39到42说明此特征如何操作的各个实例。图39说明“正常”流模式看起来像什么。图40到42说明数据带挖掘模式看起来像什么的若干实例。表中的DECDIM_WIDTH值表示整个帧的计数,其在进入每一DECDIM维度时按所选择DIMx值递减。注意,实例展示数据从左向右移动,因此LSByte是最左。而且,图39到42未启用任何‘数据格式化’。如果数据格式化被启用,那么需要额外处理单元核心110获取以消耗“片块”宽度的每一者,即,最内ICNT0。

SE 125不会发送已被完全遮蔽且归零(DECDIM_WIDTH饱和)的区域的任何μTLB2812/2822(图28)或L2 130(图1)获取,因此,即使流寻址模式覆盖这些区域,但程序员无需分配存储器中的这些区域。SE 125通过保持追踪整体DECDIM_WIDTH掩码计数及应用DECDIMx及DECDIMxSD设置来进行此,且当此计数饱和到零或在64字节行边界上结束时,阻止所有后续L2获取。通过这样做,SE 125抑制与后续未分配区域相关联的任何错误或故障,因为不发送μTLB 2812/2822或L2 130获取。

转置数据带挖掘类似于线性数据带挖掘,只是数据以转置模式移动。当DECDIM_WIDTH计数递减发生时,DECDIM旗标提供维度。此允许将数据带掩码应用到GRANULE中的剩余元素。在DECDIM模式及转置中,不支持DECDIM=DIM1的设置,如先前表中提及。注意,针对正常转置模式,当ICNT0不是GRANULE的倍数时,缺口数据发生且用零填充。类似地,当ICNT0不是GRANULE的倍数时,缺口数据在DECDIM转置模式中发生,以及使用DECDIM_WIDTH应用的数据带遮蔽发生。

图39、40、41、42及43说明可由实例串流引擎125执行的若干实例线性流传送。这些实例绝不是可由包含于串流引擎125内的六维嵌套循环控制逻辑执行的流传送的各个配置的详尽列表。

图39说明正常模式流传送3900的实例,其中DECDIM旗标被设置为“000b”,如表30中展示。表31列举放置于流模板寄存器2900(图29)中的流参数。在此实例中,VECLEN=16个元素,且每一元素是1个字节。因此,每一流向量包含16个字节的数组元素数据。内循环由ICNT0=56个字节指定,因此串流引擎125将对系统存储器130(图1)进行获取直到56个字节的数组数据已被检索。在此情况中,在3921处指示的获取1实际上从系统存储器130检索64个字节的数据,但在地址0x0处开始的仅16个字节的数据用于形成第一流向量。提供到处理单元核心110(图1)的向量的剩余部分由对准网络3820/3821(图39)零填充,如上文描述。类似地,获取2 3922、获取3 3923及获取4 3924存取系统存储器130以形成三个额外流向量提供到处理单元核心110。然而,ICNT0在56个元素处期满,因此仅8个1字节元素包含于第四流向量中。串流引擎125通过使用对准网络零填充在3925处指示的剩余字节来遮蔽其,如上文描述。

在ICNT0期满之后,进入下一循环级DIM1,如3911处指示。在此实例中,DIM1指定128个字节的距离;因此获取5 3926在地址0x128处开始且内循环经重复以产生加载有56个字节的元素数据的4个流向量。此重复七次,因为在此实例中ICNT1=7。

在ICNT1期满之后,进入下一循环级DIM2,如3912处指示。在此情况中,DIM2指定80个字节的距离;因此获取29 3927在地址0x080处开始且内循环经重复以产生加载有56个字节的元素数据的4个流向量。类似于3925,8个字节的元素数据被遮蔽,如3928处指示。此模式重复七次,因为在此实例中ICNT1=7。

表31——正常模式中的线性流实例

图40说明线性流数据带挖掘传送4000的实例,其中DECDIM旗标被设置为表30中展示的“010b”以使DECDIM_WIDTH与DIM2相关联。表32列举放置于流模板寄存器2900(图29)中的流参数。在此实例中,VECLEN=16个元素,且每一元素是1个字节。因此,每一流向量包含16个字节的数组元素数据。内循环由ICNT0=16个字节指定,因此串流引擎125将对系统存储器130(图1)进行获取以在内循环的每一迭代中获取16个字节的数组数据。在此情况中,在4021处指示的获取1实际上从系统存储器130检索64个字节的数据,但在地址0x0处开始的仅16个字节的数据用于响应于在4010处指示的ICNT0而形成第一流向量。提供到处理单元核心110(图1)的向量的剩余部分由对准网络3820/3821(图39)零填充,如上文描述。

自ICNT0在对系统存储器的第一获取上期满以后,进入下一循环级DIM1,如4011处指示。在此实例中,DIM1指定128个字节的距离;因此获取2 4022在地址0x128处开始。ICNT1=7,因此此循环重复七次,使得获取2 4022直到获取7 4023存取系统存储器130以形成六个额外流向量提供到处理单元核心110。

在ICNT1期满之后,进入下一循环级DIM2,如4012处指示。在此情况中,DIM2指定80个字节的距离;因此获取8 4024在地址0x080处开始且内循环经重复以产生加载有16个字节的元素数据的单个流向量。当ICNT1再次期满且再次进入下一循环级DIM2时,此循环一直重复到获取14 4025。

在ICNT1再次期满之后,进入下一循环级DIM2,如4026处指示。DIM2再次指定80个字节的距离;因此获取15 4026在地址0x160处开始且内循环经重复以产生加载有16个字节的元素数据的单个流向量。当ICNT1再次期满且再次进入下一循环级DIM2时,此循环一直重复到获取21 4027。

在ICNT1再次期满之后,进入下一循环级DIM2,如4026处指示。DIM2再次指定80个字节的距离;因此获取22 4028在地址0x240处开始且内循环经重复以产生加载有16个字节的元素数据的单个流向量。然而,在此情况中,DECDIM_WIDTH参数4014被设置为248个元素,其在此实例中还是248个字节。因此,在4029处指示的边界区域中的数组数据元素不会用于消耗此流的信号处理应用中。由地址产生器2811/2821(图28)产生且存储于参考队列2815/2825(图28)中的元数据由控制逻辑3814(图38)用于控制对准网络2820/2821(图38)以遮蔽边界区域4029中的数据。在此实例中,涉及边界区域4029的每一流向量中的数据响应于存储于流模板寄存器2900(图29)中的DECDIM_WIDTH参数及DECDIM旗标而设置为值“0”。

当ICNT1再次期满时,此循环一直重复到获取28 4029。在此实例中,ICNT也在这四次重复之后期满且流完成。

表32——线性流实例、数据带挖掘、DIM2上的DECDIM

ELEM_BYTES 1个字节
VECLEN 16个元素
DIMFMT 3-D
START ADDR 0x0
ICNT0 16
ICNT1 7
ICNT2 4
ICNT3 0
ICNT4 0
ICNT5 0
DIM1 128
DIM2 80
DIM3 0
DIM4 0
DIM5 0
DECDIM 010DIM2
DECDIM_WIDTH 248
STREAM VECTOR SIZE 16个字节

图41说明线性流数据带挖掘传送4100的实例,其中DECDIM旗标被设置为表30中展示的“010b”以使DECDIM_WIDTH与DIM2相关联。表33列举放置于流模板寄存器2900(图29)中的流参数。此实例类似于图40的实例,只是ICNT2被设置为5,如表33中展示。DIM1及DIM2级循环以类似方式从获取1 4121执行到获取28 4128。边界区域4029中的数据响应于DECDIM_WIDTH 4012而以与图40中描述的方式相同的方式遮蔽。

然而,在此实例中,ICNT2=5。因此,串流引擎125准备在DIM2循环的另一重复内产生地址。然而,DECDIM_WIDTH 4112现已下溢,从而指示边界区域4130的剩余流向量将被设置为空向量。下溢条件称为“饱和”。在此实例中,空向量被设置为“0”。当DECDIM_WIDTH计数饱和时,无需存取系统存储器的数组元素数据,因为流向量被设置为空值。地址产生器2811/2821内的控制逻辑响应于DECDIM_WIDTH饱和而抑制地址产生,使得不存取μTLB2812/2822(图28)且不存取系统存储器130(图1)以产生空向量。然而,元数据由控制逻辑3814形成且存储于参考队列2815/2825中。接着,控制逻辑3814使用元数据来使用对准网络2820/2821创建空向量。

以此方式,响应于流参数而将数组元素流提供到处理单元核心110,但空向量避免对系统存储器及μTLB的获取循环。

表33——线性流实例、数据带挖掘、其中DECDIM_WIDTH饱和的DIM2上的DECDIM

ELEM_BYTES 1个字节
VECLEN 16个元素
DIMFMT 3-D
START ADDR 0x0
ICNT0 16
ICNT1 7
ICNT2 5
ICNT3 0
ICNT4 0
ICNT5 0
DIM1 128
DIM2 80
DIM3 0
DIM4 0
DIM5 0
DECDIM 010DIM2
DECDIM_WIDTH 248
STREAM VECTOR SIZE 16个字节

图42说明线性流数据带挖掘传送4200的实例,其中DECDIM旗标被设置为表30中展示的“001b”以使DECDIM_WIDTH与DIM1相关联。表34列举放置于流模板寄存器2900(图29)中的流参数。此实例类似于图40的实例,只是DECDIM_WIDTH计数链接到DIM1而非DIM2。DIM1级循环以类似方式从获取1 4221执行到获取3 4222。

在获取4 4223处,DECDIM_WIDTH计数达到零且边界区域4224中的数据使用对准网络3820/3821遮蔽,如上文更详细描述。

在下一迭代上,DECDIM_WIDTH计数饱和且对系统存储器及μTLB的获取被抑制,如上文更详细描述。以此方式,流向量4225、4226及4227由串流引擎125形成,无需存取系统存储器或μTLB。

在ICNT1期满之后,进入下一循环级DIM2,如4212处指示。在此情况中,DIM2指定80个字节的距离;因此获取8 4228在地址0x080处开始且内循环经重复以产生加载有16个字节的元素数据的单个流向量。此循环一直重复到获取11 4029,其中流向量的一部分响应于DECDIM_WIDTH计数4214而遮蔽,且剩余3个空流向量由SE 125形成,无需存取系统存储器。

在此实例中,ICNT2=4,因此无需系统存取的此相同循环的系统存取及空向量形成再重复两次,如4230处指示。

表34——线性流实例、其中DECDIM_WIDTH饱和的DIM1上的DECDIM

ELEM_BYTES 1个字节
VECLEN 16个元素
DIMFMT 3-D
START ADDR 0x0
ICNT0 16
ICNT1 7
ICNT2 4
ICNT3 0
ICNT4 0
ICNT5 0
DIM1 128
DIM2 80
DIM3 0
DIM4 0
DIM5 0
DECDIM 001DIM1
DECDIM_WIDTH 392
STREAM VECTOR SIZE 16个字节

图43说明线性流数据带挖掘传送4300的实例,其中DECDIM1旗标被设置为表30中展示的“001b”以使DECDIM1_WIDTH与DIM1相关联,且DECDIM2旗标被设置为表30中展示的“010b”以使DECDIM2_WIDTH与DIM2相关联。表35列举放置于流模板寄存器2900(图29)中的流参数。此实例类似于图40的实例流4000,只是添加了第二组DECDIMx旗标及DECDIMx_WIDTH参数。

DIM1级循环以类似于流4000的方式执行直到DECDIM1_WIDTH 4312饱和。在此实例中,ICNT0 4310=16且ICNT1=7。如上文更详细描述,一旦DECDIM1_WIDTH 4312计数饱和,则所述循环无需另外系统存储器存取。在此情况中,空流向量4320及4321由串流引擎125形成,无需存取系统存储器130。

在ICNT1期满之后,进入下一循环级DIM2,如4311处指示。DECDIM1_WIDTH计数器被重新加载有来自流模板寄存器2900的计数值。在此情况中,DIM2指定80个字节的距离;因此获取8 4322在地址0x080处开始且内循环经重复以产生加载有16个字节的元素数据的单个流向量。此循环重复直到DECDIM1_WIDTH 4312计数再次饱和,接着所述循环无需另外系统存储器存取。在此情况中,空流向量4323及4324由串流引擎125形成,无需存取系统存储器130。

在此实例中,ICNT2=4,因此无需系统存取的此相同循环的系统存取及空向量形成再重复两次。

然而,在此情况中,DECDIM2_WIDTH参数4313被设置为248个元素,其在此实例中还是248个字节。因此,在4325处指示的边界区域中的数组数据元素不会用于消耗此流的信号处理应用中。由地址产生器2811/2821(图28)产生且存储于参考队列2815/2825(图28)中的元数据由控制逻辑3814(图38)用于控制对准网络2820/2821(图38)以遮蔽边界区域4325中的数据。在此实例中,涉及边界区域4325的每一流向量中的数据响应于存储于流模板寄存器2900(图29)中的DECDIM2_WIDTH参数及DECDIM2旗标而设置为值“0”。

此循环重复直到DECDIM1_WIDTH 4312计数再次饱和,接着所述循环无需另外系统存储器存取。在此情况中,空流向量4326及4327由串流引擎125形成,无需存取系统存储器130。

在此实例中,ICNT3=2且DIM3=1500,因此在地址0x1500处开始再次重复此整个序列,如4341处指示。

表35——线性流实例、DIM1上的DECDIM1及DIM2上的DECDIM2

ELEM_BYTES 1个字节
VECLEN 16个元素
DIMFMT 6-D
START ADDR 0x0
ICNT0 16
ICNT1 7
ICNT2 4
ICNT3 2
ICNT4 1
ICNT5 1
DIM1 128
DIM2 80
DIM3 1500
DIM4 0
DIM5 0
DECDIM1 001DIM1
DECDIM1_WIDTH 640
DECDIM2 010DIM2
DECDIM2_WIDTH 248
STREAM VECTOR SIZE 16个字节

图44A、44B一起说明子矩阵如何通过图28的串流引擎来扩增空向量用于矩阵乘法。表36列举放置于流模板寄存器2900(图29)中的流参数。在此实例中,VECLEN=16个元素,且每一元素是4个字节(32个位)。因此,每一流向量包含64个字节的数组元素数据以匹配MMA3640(图36)的宽度。内循环由ICNT0=16个元素(64个字节)指定,因此串流引擎125将对系统存储器130(图1)进行获取以在内循环的每一迭代中获取64个字节的数组数据。

在此实例中,矩阵4400经定位于L2系统存储器130中且具有19列32位元素及18行32位元素,其中每一元素在图44A、44B中由“d”指示。由于此特定实例的MMA 3640仅可处置32位元素的16x16数组,所以矩阵4400被细分成4个子矩阵4401、4402、4403、4404。

使用表36中列举的流参数,串流引擎125首先获取子数组4401提供到MMA 3640。接着,串流引擎125获取子数组4402。子数组4402包含边界区域4405,其中提供到MMA 3640的所有数据元素需要设置为零以使由MMA 3640执行的矩阵乘法运算正确操作。如上文更详细描述,串流引擎125使用DECDIM1_WIDTH 4410定义矩阵440的范围,其在此实例中是19个元素。

在此情况中,DECDIM1_WIDTH参数4410被设置为19个元素,其在此实例中是76个字节。因此,在4405处指示的边界区域中的数组数据元素不会用于消耗此流的信号矩阵乘法应用中。由地址产生器2811/2821(图28)产生且存储于参考队列2815/2825(图28)中的元数据由控制逻辑3814(图38)用于控制对准网络2820/2821(图38)以遮蔽边界区域4405中的数据。在此实例中,涉及边界区域4405的每一流向量中的数据响应于存储于流模板寄存器2900(图29)中的DECDIM1_WIDTH参数及DECDIM1旗标而设置为值“0”。

接着,串流引擎125开始获取子数组4403。在获取4412处,DECDIM2_WIDTH计数达到零且饱和且对系统存储器及μTLB的获取被抑制,如上文更详细描述。以此方式,边界区域4406的流向量由串流引擎125形成,无需存取系统存储器或μTLB。

接着,串流引擎125开始获取子数组4404。对系统存储器的获取在4413及4414处执行,且边界区域4405响应于DECDEM1_WIDTH饱和而再次由对准网络2820/2821遮蔽,如上文描述。在下一循环上,DECDIM2_WIDTH计数达到零且饱和且对系统存储器及μTLB的获取被抑制,如上文更详细描述。以此方式,子数组4404中的边界区域4406的流向量由串流引擎125形成,无需存取系统存储器或μTLB。

表36——线性流实例、DIM3上的DECDIM1及DIM2上的DECDIM2

按计数的空流向量

在上文描述的实例中,描述用常数值填补流向量的若干方式及无需存取系统存储器而形成空流向量的若干方式,其基于DECDIMx_WIDTh计数的指定值。在另一实例中,指定由串流引擎插入于流中的空向量数可为有用的。

实时创建卷积神经网络(CNN)托普利兹(Toeplitz)式矩阵需要在CNN层中的最后特征映射之后馈送到矩阵乘法加速器中的零或常数值。在线性代数中,其中每一者从左到右对角线降序的托普利兹矩阵或对角常数矩阵是常数。如关于图36描述,MMA 3640具有固定行数,其需要在起始矩阵乘法之前填充。在托普利兹矩阵创建期间剩余的行不能具有残值,否则结果将是错误的。

假设所有未使用数据元素使用需要存储器分配及指令执行的软件来设置为零或所选择空值以写出空值。

在实例中,循环结束零点(LEZR)特征经实施于串流引擎125(图28)硬件中。当最后特征映射的串流引擎维度期满时,将数个空行馈送到串流引擎,无需从存储器读取数据。在此实例中,串流引擎125将通过处理单元核心110在每一获取上发送整个64字节流向量,从而在正常维循环期间不附加任何数据格式化、按比例缩放及回放。接着,将数据提供到矩阵乘法加速器3640。在CNN网络最后特征期满之后馈送到矩阵加速器的行使矩阵完整且准备用于分块矩阵乘法。所需软件中没有任何开销且改进性能,有助于降低软件码大小及复杂性。

在此实例中,8位LEZR_CNT(LEZR计数)字段2933经提供于流模板2900(图29)中。此允许高达255个空向量由串流引擎125插入于流中,无需存取系统存储器。3位LEZR旗标3023经包含于流模板2900的旗标字段2921中。LEZR旗标的实例定义包含于表37中。

表37控制数据带挖掘操作的LEZR旗标

LEZR 意义
000b 正常操作模式
001b 在ICNT0结束时开始将空向量发送到处理单元核心
010b 在ICNT1结束时开始将空向量发送到处理单元核心
011b 在ICNT2结束时开始将空向量发送到处理单元核心
100b 在ICNT3结束时开始将空向量发送到处理单元核心
101b 在ICNT4结束时开始将空向量发送到处理单元核心
110b 在ICNT5结束时开始将空向量发送到处理单元核心
111b 保留

参考图38,控制逻辑3814可基于由参考队列2815提供的元数据来控制对准网络3820、3821上的多路复用器中的每一者迫使空值到流向量的所选择元素上。以此方式,整个流向量可被设置为空值,无需从系统存储器获取任何数据。在实例中,空值是“0”。在另一实例中,预定义值或模式可用于表示空值。

在另一实例中,控制逻辑3814可基于由参考队列2815提供的元数据来控制对准网络3820、3821上的多路复用器中的每一者迫使所选择值到流向量的所选择元素上。以此方式,整个流向量可被设置为所选择值(例如最小值或最大值),无需从系统存储器获取任何数据。

在此实例中,地址产生器2811/2821(见图28)中的控制逻辑对六级嵌套迭代执行计数追踪。当由LEZR指定的维度的循环计数期满时,其发信号通知空值或所选择值将被插入到向量流中,无需从存储器获取由流模板2900中的LEZR字段指定的数个流向量的空值或所选择值向量的数据。

由地址产生器产生的元数据被推送到流参考队列2815/2825(见图28)中。在后端上,当处理单元核心110(图1)执行读取时,弹出此元数据且用指定为空或设置为所选择值的通道将其发送到对准网络2820/2821中的控制逻辑3814,无需从系统存储器读取数据。

图45说明使用LEZR功能将空向量添加到流。在此实例中,在4501处指示的多个特征图被存储于系统存储器L2 130(图1)中。流模板由软件应用建立,其中ICNT1定义特征图中的滤波器行数(Fr),ICNT2定义特征图中的滤波器列数(Fc),且ICNT3定义输入特征图数目(Ni)。ICNT0定义由串流引擎从一行获取的特征图4501的元素数。在此实例中,针对8位元素,ICNT0将被设置为64,且针对16位元素,其将被设置为32。串流引擎125根据多维流模板获取特征图(如上文更详细描述)以形成流4500,如4502处指示。流4500经提供到MMA 3640作为B矩阵,如上文更详细描述。

在此实例中,MMA宽度可取决于元素的大小而选择为16、32或64个元素,如关于图36描述。Ni*Fr*Fc形成B矩阵的行。此值不一定是所选择MMA宽度的倍数。因此,额外数目个空向量通过指定流模板中的LEZR_CNT来形成,其中LEZR_CNT由表达式(4)定义。

pad_zero_rows=MMA_width-(Ni*Fr*FC%MMA_width) (4)

填补值

在例如卷积神经网络中针对最大值(max)、最小值(min)及平均池化的池化操作的一些应用中,一列图像像素的末尾需要是最大值或最小值。类似地,例如TensorFlow、Caffe网络等的各种深度学习神经网络的分析工具需要任意零、最大值或最小值填补来进行池化操作。

在此实例中,3位填补值(PADVAL)旗标3023经包含于流模板2900的旗标字段2921中。PADVAL旗标的实例定义包含于表38中。填补大小在整个元素上进行,如由流模板2900(图29)中的ELTYPE旗标3001(图30)定义。在此实例中,默认值零通过将PADVAL旗标3023设置为000b“无符号最小值”来选择。

表38控制数据带挖掘操作的PADVAL旗标

PADVAL 意义
000b 无符号最小值,默认值是零
001b 无符号最大值
010b 带符号最小值
011b 带符号最大值
100b 保留
101b 保留
110b 保留
111b 保留

在实例中,流向量使用指定填补值作为流的流向量的最后一个元素来形成。在另一实例中,另一旗标字段(例如LEZR旗标3023,表37)可用于指定其上包含填补值的所选择维度。

参考图38,控制逻辑3814可基于由参考队列2815提供的元数据来控制对准网络3820、3821上的多路复用器中的每一者迫使空值到流向量的所选择元素上。以此方式,整个流向量可被设置为指定空值,无需从系统存储器获取任何数据。在实例中,空值即无符号最大值。在另一实例中,其它预定义值或模式可用于表示空值。

在实例中,控制逻辑3814可基于由参考队列2815提供的元数据来控制对准网络3820、3821上的多路复用器中的每一者迫使所选择值到流向量的所选择元素上。以此方式,整个流向量可被设置为所选择值(例如最小值或最大值),无需从系统存储器获取任何数据。

在此实例中,地址产生器2811/2821(见图28)中的控制逻辑对六级嵌套迭代执行计数追踪。当流末尾的循环计数期满时,其发信号通知空值或所选择值将被插入到向量流中,无需从存储器获取空值或所选择值向量的数据,如由流模板2900中的PADVAL旗标3024定义。

由地址产生器产生的元数据被推送到流参考队列2815/2825(见图28)中。在后端上,当处理单元核心110(图1)执行读取时,弹出此元数据且用指定为空或设置为所选择值的通道将其发送到对准网络2820/2821中的控制逻辑3814,无需从系统存储器读取数据。

为了实现此,需要在软件码中执行置换运算。在实例模拟中,基于硬件的PADVAL解决方案的性能比图像宽度>64的软件解决方案好4倍且比图像宽度<64的性能好2倍;此外,软件解决方案需要三个不同循环。

图46说明通过由例如图28的串流引擎125的串流引擎插入空或预定义数据向量来形成流。在此实例中,在4600,通过将流参数存储于串流引擎内的流模板寄存器(图29的2900)中来打开串流引擎上的流。流参数包含数组的元素大小、包含于流的每一向量中的元素数、包含于数组的每一维度的流中的向量数及数组的所选择维度的宽度指示符,例如DECDIM旗标及DECDIM_COUNT,见表30。

在4601,根据存储于流模板中的流参数产生地址流。保存指示循环计数、循环结束、剩余宽度计数等的元数据。

在4602,由串流引擎使用由地址产生器产生的地址序列从系统存储器获取一行矩阵数据。

在4603,检查宽度计数参数是否与多维流的当前维度相关联。如果不相关联,那么在4605形成正常流向量。

如果宽度计数参数与当前维度相关联,那么在4604,检查确定宽度计数是否被耗尽。如果未耗尽,那么在4605形成正常流向量。

如果宽度计数被耗尽,那么在4606,检查确定宽度计数是否饱和。如果未饱和,那么在4607通过遮蔽向量中超过宽度计数的一部分来形成流向量。在一些实例中,掩码可插入零值。在另一实例中,预定义值可由例如最小值、最大值等的掩码插入。

如果宽度计数达到饱和,那么在4608形成空向量,无需存取系统存储器。在实例中,空向量可被设置为全零。在另一实例中,空向量可被设置为预定填补值,例如最小值、最大值等。预定填补值可由例如流模板中的PADVAL旗标3023(图30)的旗标字段指定。

在4609,如果当前维度未完成,那么循环在4602重复。如果当前维度已完成,那么宽度计数在4610在其与当前维度相关联时递减。否则,宽度计数不递减。

在4611,检查确定流是否完成。如果没有,那么过程重复以从系统存取更多矩阵数据及形成流向量。

在4612,一旦已从存储器存取整个矩阵,则关闭数据流。

图47说明通过由例如图28的串流引擎125的串流引擎插入空或预定义数据向量来形成流。在此实例中,在4700,通过将流参数存储于串流引擎内的流模板寄存器(2900,图29)中来打开串流引擎上的流。流参数包含数组的元素大小、包含于流的每一向量中的元素数、包含于数组的每一维度的流中的向量数及循环结束计数(例如循环结束零计数2933(图29))及使循环结束零计数与多维循环的所选择维度相关联的旗标,如表37中描述。

在4701,根据存储于流模板中的流参数产生地址流。保存指示循环计数、循环结束、剩余宽度计数等的元数据。

在4702,由串流引擎使用由地址产生器产生的地址序列从系统存储器获取一行矩阵数据。

在4703,使用从系统存储器获取的数据元素形成正常流向量。

在4704,如果当前维度未完成,那么循环在4602重复。如果当前维度已完成。

在4705,检查确定空计数是否应用到当前维度。如果是,那么由串流引擎形成等于流模板中的空计数值的n个空向量。在此实例中,空向量中的数据被设置为零。在另一实例中,预选择空值可用于形成例如最小值、最大值等的空向量。

在4707,检查确定流是否完成。如果没有,那么过程在4708重复下一循环以从系统存取更多矩阵数据及形成流向量。

在4709,一旦已从存储器存取整个矩阵且形成指定空向量而无需从系统存储器存取数据,则关闭数据流。

图48说明实例多处理器系统。在此实例中,SoC 4800包含处理器100(图1)(称为“处理器A”)且其与第二处理器4811(称为“处理器B”)组合。每一处理器经由总线4851耦合到共享级3(L3)存储器4850的块。处理器B包含未共享级2存储器4812的块。直接存储器存取(DMA)引擎4860可经编程以使用已知或后期开发的DMA技术将数据/指令块从L3存储器传送到L2存储器130或L2存储器4812。各种类型的外围设备4862也耦合到存储器总线4851,例如无线及/或有线通信控制器等。

在此实例中,处理器A、处理器B、L3存储器4850全部包含于SoC 4800中,SoC 4800可经囊封以使用已知或后期开发的封装技术形成可安装于例如印刷电路板(PCB)的衬底上的封装。举例来说,SoC 4800可经囊封于球栅阵列(BGA)封装中。在此实例中,外部存储器接口(EMI)4852允许额外外部块体存储器4854由处理器A及/或处理器B存取。

在此实例中,处理器B是可用于标量处理及控制功能的处理器。在其它实例中,各种类型的已知或后期开发的处理器可与DSP 100组合。虽然在此实例中说明两个处理器,但在另一实例中,DSP 100的多个副本及/或处理器B的多个副本可经包含于SoC内且使用形成经遮蔽及空向量的技术,无需存取由串流引擎125提供的系统存储器,如本文中更详细描述。

其它实例

在所描述实例中,串流引擎包含可同时管理两个数据流的两个紧密耦合的串流引擎。在另一实例中,串流引擎能够仅管理单个流,而在其它实例中,串流引擎能够处置多于两个流。在每一情况中,针对每一流,串流引擎包含地址产生阶段、数据格式化阶段及用于等待由处理器消耗的格式化数据的某存储。

在所描述实例中,地址从可涉及多维循环的算法导出,每一维度维持迭代计数。在一个实例中,串流引擎支持六级嵌套迭代。在其它实例中,支持更多或更少级迭代。

在所描述实例中,提供流向量的一维零填补。在另一实例中,提供流向量的二维零填补。在又另一实例中,可提供多于两个维度的零填补。

在所描述实例中,描述具有多个功能单元及双数据路径的复杂DSP处理器。在另一实例中,可使用耦合到流处理器的较简单DSP。在另一实例中,其它类型的已知或后期开发的处理器可经耦合到流处理器,例如精简指令集计算机(RISC)、微处理器等。

在所描述实例中,MMA支持32x32 16位矩阵乘法及64x64 8位矩阵乘法,且串流引擎经配置以提供64字节流向量。在另一实例中,MMA可经配置以支持大或更小矩阵大小。相关联串流引擎可经配置以提供具有大于或小于64个字节的大小的流向量。

在所描述实例中,消耗数据流的处理器及从系统存储器检索数据流的串流引擎全部包含于单个集成电路(IC)内作为芯片上系统。在另一实例中,消耗数据流的处理器可经封装于第一IC中,且串流引擎可经封装于通过已知或后期开发的通信信道或总线耦合到第一IC的第二单独IC中。

在本描述中,术语“耦合”及其衍生词意味着间接、直接、光学及/或无线电连接。因此,如果第一装置耦合到第二装置,那么所述连接可通过直接电连接、通过经由其它装置及连接的间接电连接、通过光学电连接及/或通过无线电连接。

可在所描述实例中进行修改,且可在权利要求书的范围内进行其它实例。

108页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:用于促进高速缓存中的管线化读取-修改-写入支持的方法和设备

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!

技术分类