一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

用于矢量排序的方法和装置与流程

2022-06-09 01:38:18 来源:中国专利 TAG:

用于矢量排序的方法和装置


背景技术:

1.数字信号处理器(dsp)被优化用于处理可以从各种输入信号(诸如传感器数据、视频流、语音信道、雷达信号、生物医学信号等)导出的数据流。对实时数据进行操作的数字信号处理器可以接收输入数据流,对数据流执行过滤功能(诸如编码或解码)并输出变换后的数据流。该系统被称为是实时的,因为如果变换后的数据流在调度时不可用于输出,则应用程序发生故障。典型的视频编码需要可预测但非连续的输入数据模式。示例应用程序需要存储器访问以将数据寄存器加载到数据寄存器文件中,并且然后将数据从数据寄存器供应给执行数据处理的功能单元。
2.一个或多个dsp处理核心可以与各种外围电路、存储器块等在单个集成电路(ic)管芯上组合以形成片上系统(soc)。这些系统可以包括多个互连的处理器,它们共享片上和片外存储器的使用。处理器可以包括指令缓存器(icache)和数据缓存器(dcache)的某种组合以改善处理。此外,可以将具有共享存储器的多个处理器合并到单个嵌入式系统中。处理器可以在物理上共享相同的存储器,而无需访问位于相同存储器位置的数据或执行代码,或者可以将共享存储器的某些部分用作公共共享存储器。


技术实现要素:

3.一些实施例涉及用于矢量排序的方法和装置。在一个方面,提供了一种用于在处理器中对矢量进行排序的方法,该方法包括:由处理器响应于矢量排序指令对存储在矢量的通道中的值进行排序以生成排序后的矢量,其中按照矢量排序指令指示的顺序对值进行排序;以及将排序后的矢量存储在存储位置。
4.在一个方面,提供了一种处理器,该处理器包括:比较器逻辑,其被配置为响应于矢量排序指令对矢量的通道中的值进行比较;以及矢量排序逻辑,其被配置为基于由比较器逻辑对值进行比较的结果按照矢量排序指令指示的顺序对值进行排序以生成排序后的矢量。
附图说明
5.图1说明示例成双的标量/矢量数据路径处理器;
6.图2说明图1中说明的成双的标量/矢量数据路径处理器中的寄存器和功能单元;
7.图3说明全局标量寄存器文件;
8.图4说明由算法功能单元共享的局部标量寄存器文件;
9.图5说明由乘法功能单元共享的局部标量寄存器文件;
10.图6说明由局部/存储单元共享的局部标量寄存器文件;
11.图7说明全局矢量寄存器文件;
12.图8说明断言寄存器文件;
13.图9说明由算法功能单元共享的局部矢量寄存器文件;
14.图10说明由乘法功能单元和相关功能单元共享的局部矢量寄存器文件;
15.图11说明处理单元的流水线阶段;
16.图12说明单个提取包的十六个指令;
17.图13说明指令编码的示例;
18.图14说明条件码扩展间隙(slot)0的位编码;
19.图15说明条件码扩展间隙1的位编码;
20.图16说明常量扩展间隙的位编码0;
21.图17是说明常量扩展的部分框图;
22.图18说明用于simd操作的进位控制;
23.图19说明流引擎的概念视图;
24.图20说明一系列格式化操作;
25.图21说明矢量中的通道分配的示例;
26.图22说明矢量中的通道分配的示例;
27.图23说明基本的二维(2d)流;
28.图24说明图23的示例流中的元素的顺序;
29.图25说明从较大的矩形中取出较小的矩形;
30.图26说明示例流引擎如何提取具有4个字节的移项粒度的流;
31.图27说明示例流引擎如何提取具有8个字节的移项粒度的流;
32.图28说明示例流引擎的细节;
33.图29说明示例流模板寄存器;
34.图30说明图29的示例流模板寄存器的标记字段的子字段定义;
35.图31说明矢量长度掩码/组重复块的示例;
36.图32是生成流引擎有效或无效指示的示例的部分示意图;
37.图33是说明生成循环地址和循环计数的流引擎地址生成器的部分示意图;
38.图34说明示出该示例的流引擎供应数据的部分示意图;
39.图35说明示出流引擎向断言单元供应有效数据的部分示意图;
40.图36说明十六个元素的双调归并排序;
41.图37是三十二元素双调归并排序的示例;
42.图38说明使用十六个32位元素的两种排序来实施三十二元素双调归并排序;
43.图39说明使用成双的排序指令来实施三十二元素双调归并排序;
44.图40和图41说明用于实施排序指令的比较的修改的“蛮力”方法;
45.图42说明用于将排序后的矢量元素放置在输出矢量通道中的掩码方法;
46.图43说明用于将排序后的矢量元素放置在输出矢量通道中的置换方法;
47.图44说明示例c单元的框图;
48.图45说明图44的示例c单元中的示例绝对差求和(sad)逻辑;
49.图46说明图45的sad逻辑的绝对差元素和对应的乘法器的示例实施方式;
50.图47说明用于图45的sad逻辑的默认输入组合。
51.图48说明对图47的输入进行修改以执行用于成双的排序指令的比较;
52.图49说明对图45的sad逻辑进行修改以实现图48的输入;
53.图50说明当矢量元素是32位量时图45的sad逻辑的绝对差元素阵列的输入;
54.图51说明图44的c单元的全局处理部件中的一个或多个矢量排序指令的实施方式的框图;
55.图52、图53和图54是用于矢量排序的方法;并且
56.图55是多处理器系统的框图。
具体实施方式
57.为一致起见,各个附图中的相似元件由相似的附图标记表示。
58.数字信号处理器(dsp)被优化用于处理可以从各种输入信号(诸如传感器数据、视频流、语音信道、雷达信号、生物医学信号等)导出的数据流。存储器带宽和调度是对实时数据进行操作的数字信号处理器的关注点。本文描述了示例dsp处理核心,其包括流引擎以改善存储器带宽和数据调度。
59.一个或多个dsp处理核心可以与各种外围电路、存储器块等在单个集成电路(ic)管芯上组合以形成片上系统(soc)。例如,参见“66ak2hx multicore keystone
tm system-on-chips”,2013,其通过引用并入本文。
60.在本文描述的示例dsp核心中,自主流引擎(se)耦连到dsp。在该示例中,流引擎包括两个紧密耦连的流引擎,它们可以同时管理两个数据流。在另一个示例中,流引擎能够仅管理单个流,而在其他示例中,流引擎能够处理多于两个的流。在每种情况下,对于每个流,流引擎包括地址生成级、数据格式化级以及用于等待被处理器消耗的格式化数据的一些存储。在本文描述的示例中,地址从可以涉及多维度循环的算法导出,每个维度维持迭代计数。在一个示例中,流引擎支持六级嵌套迭代。在其他示例中,支持更多或更少级迭代。
61.在本文中参考图1-图18详细描述了示例dsp处理器。本文参考图19-图35详细描述了能够使用六维度嵌套循环来管理两个数据流的示例流引擎。
62.此外,在本文描述的示例dsp核心中,提供指令支持以用于矢量的元素的排序。此处参考图36-图54描述了用于矢量排序的指令支持的示例。
63.图1说明包括成双的标量/矢量数据路径115、117的示例处理器100。处理器100包括本文更详细描述的流引擎125。处理器100包括分开的一级指令缓存器(l1i)121和一级数据缓存器(l1d)123。处理器100包括保持指令和数据两者的二级(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被形成在单个集成电路上。该单个集成电路可选地包括其他电路。
64.处理单元核心110在指令提取单元111控制下从l1i缓存器121提取指令。指令提取
单元111确定将被执行的下一个指令并且调用提取包大小的一组此类指令。提取包的性质和大小在下面进一步详述。如果这些指令被存储在l1i缓存器121中,在缓存命中之后,指令被直接从l1i缓存器121中提取。在当指定的指令没有被存储在l1i缓存器121中时的缓存错失之后,在l2组合式缓存器130中寻找指令。在该示例中,l1i缓存器121中的缓存线的大小等于512位的提取包的大小。这些指令的存储器位置在l2组合式缓存器130中或命中或错失。命中是由l2组合式缓存器130服务。错失是由更高级缓存器(未图示说明)或由主存储器(未图示说明)服务。在该示例中,所请求的指令被同时供应到l1i缓存器121和处理单元核心110两者以加速使用。
65.在该示例中,处理单元核心110包括多个功能单元以执行指令指定的数据处理任务。指令分派单元112确定每个提取的指令的目标功能单元。在该示例中,处理单元110作为超长指令字(vliw)处理器进行操作,其能够同时处理对应的功能单元中的多个指令。编译器组织执行包中一起被执行的指令。指令分派单元112将每个指令引导到其目标功能单元。分配给指令的功能单元完全由编译器产生的指令来指定。处理单元核心110的硬件不参与功能单元分配。在该示例中,指令分派单元12并行操作若干个指令。这种并行指令的数量由执行包的大小设定。这在本文进一步描述。
66.指令分派单元112的分派任务的一部分是确定指令在标量数据路径侧a115中的功能单元上执行还是在矢量数据路径侧b 116中的功能单元上执行。每个指令中被称为s位的指令位确定该指令控制哪个数据路径。这在本文进一步描述。
67.指令解码单元113对当前执行包中的每个指令解码。解码包括识别执行该指令的功能单元、从可能的寄存器文件(rf)中识别用于为对应的数据处理操作供应数据的寄存器以及识别对应的数据处理操作的结果的寄存器目的地。如下面进一步描述的,指令可以包括代替一个寄存器编号操作数字段的常量字段。该解码的结果是信号,这些信号用于控制目标功能单元以便对指定数据执行由对应的指令所指定的数据处理操作。
68.处理单元核心110包括控制寄存器114。控制寄存器114存储用于控制标量数据路径侧a115和矢量数据路径侧b 116中的功能单元的信息。该信息可以包括模式信息等。
69.来自指令解码器113的已解码的指令和存储在控制寄存器114中的信息被供应到标量数据路径侧a115和矢量数据路径侧b 116。结果,标量数据路径侧a115和矢量数据路径侧b 116中的功能单元根据指令指定的数据执行指令指定的数据处理操作并且将结果存储在一个或多个指令指定的数据寄存器中。标量数据路径侧a 115和矢量数据路径侧b 116中的每一个包括并行操作的多个功能单元。这些结合图2在下面进一步描述。标量数据路径侧a 115和矢量数据路径侧b 116之间存在允许数据交换的数据路径117。
70.处理单元核心110进一步包括非基于指令的模块。仿真单元118允许响应于指令来确定处理单元核心110的机器状态。这种能力可以被用于算法开发。中断/异常单元119使得处理单元核心110能够响应外部异步事件(中断)并且回应执行不适当操作的尝试(异常)。
71.处理器110包括流引擎125。流引擎125将两个数据流从缓存在l2组合式缓存器130中的预定地址供应到处理单元核心110的矢量数据路径侧b的寄存器文件。这提供从存储器(如缓存在l2组合式缓存器130中的)直接到功能单元操作数输入端的受控数据移动。这在本文进一步描述。
72.图1说明各个部分之间的总线的示例数据宽度。l1i缓存器121将指令经由总线141
供应到指令提取单元111。在该示例中,总线141是512位总线。总线141从l1i缓存器121单向通到处理单元10。l2组合式缓存器130将指令经由总线142供应到l1i缓存器121。在该示例中,总线142是512位总线。总线142从l2组合式缓存器130单向通到l1i缓存器121。
73.l1d缓存器123与标量数据路径侧a115中的寄存器文件经由总线143交换数据。在该示例中,总线143是64位总线。l1d缓存器123与矢量数据路径侧b 116中的寄存器文件经由总线144交换数据。在该示例中,总线144是512位总线。总线143和144被图示说明为双向支持处理单元核心110数据读取和数据写入两者。l1d缓存器123与l2组合式缓存器130经由总线145交换数据。在该示例中,总线145是512位总线。总线145被图示说明为双向支持处理单元核心110数据读取和数据写入两者的缓存服务。
74.在缓存命中之后(如果请求的数据存储在l1d缓存器123中),处理器数据请求直接从l1d缓存器123提取。在缓存错失之后(指定的数据没有存储在l1d缓存器123中),在l2组合式缓存器130中寻找数据。请求数据的存储器位置在l2组合式缓存器130中或命中或错失。命中是由l2组合式缓存器130服务。错失是由另一级缓存器(未图示说明)或由主存储器(未图示说明)服务。所请求的数据可以同时供应到l1d缓存器123和处理单元核心110两者以加速使用。
75.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。
76.在缓存命中之后(如果请求的数据存储在l2组合式缓存器130中),流引擎数据请求直接从l2组合式缓存器130提取。在缓存错失之后(指定的数据没有存储在l2组合式缓存器130中),从另一级缓存器(未图示说明)或从主存储器(未图示说明)寻找数据。在一些示例中,l1d缓存器123缓存未存储在l2组合式缓存器130中的数据在技术上是可行的。如果支持该操作,则根据在l2组合式缓存器130中错失的流引擎数据请求,l2组合式缓存器130对于流引擎请求的数据监听l1d缓存器1233。如果l1d缓存器123存储数据,则监听响应包括随后被供应以服务流引擎请求的数据。如果l1d缓存器123没有存储数据,则监听响应指示此结果并且l2组合式缓存器130服务来自另一级缓存器(未图示说明)或来自主存储器(未图示说明)的流引擎请求。
77.在该示例中,根据题为“unified memory system architecture including cache and directly addressable static random access memory”的美国专利号6,606,686,l1d缓存器123和l2组合式缓存器130两者都可以被配置为选定数量的缓存器或直接可寻址的存储器,上述专利通过引用并入本文。
78.在该示例中,处理器100被制造在集成芯片(ic)上,该集成芯片安装在球栅阵列(bga)衬底上。bga衬底和ic管芯可以一起被称为“bga封装件”、“ic封装件”、“集成电路”、“ic”、“芯片”、“微电子器件”或类似术语。bga封装件可以包括包封材料以覆盖和保护ic管芯免受损坏。在另一个示例中,其他类型的已知或后来开发的封装技术可以与处理器100一
起使用。
79.图2进一步说明标量数据路径侧a 115和矢量数据路径侧b 116中的功能单元和寄存器文件的细节。标量数据路径侧a 115包括l1单元221、s1单元222、m1单元223、n1单元224、d1单元225和d2单元226。标量数据路径侧a 115包括全局标量寄存器文件(rf)211、l1/s1局部寄存器文件212、m1/n1局部寄存器文件213和d1/d2局部寄存器文件214。矢量数据路径侧b 116包括l2单元241、s2单元242、m2单元243、n2单元244、c单元245和p单元246。矢量数据路径侧b 116包括全局矢量寄存器文件231、l2/s2局部寄存器文件232、m2/n2/c局部寄存器文件233和断言寄存器文件214。在本文更详细描述哪个功能单元可以从哪个寄存器文件读取或者可以写入哪个寄存器文件。
80.标量数据路径侧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的指令指定的寄存器中。
81.标量数据路径侧a 115包括s1单元222。s1单元222通常接受两个64位操作数并且产生一个64位结果。这两个操作数都是从全局标量寄存器文件211或l1/s1局部寄存器文件212中的指令指定的寄存器调用的。在该示例中,s1单元222执行与l1单元211相同类型的操作。在另一示例中,由l1单元211和s1单元222支持的数据处理操作之间可以存在轻微变化。结果被写入全局标量寄存器文件211、l1/s1局部寄存器文件212、m1/n1局部寄存器文件213或d1/d2局部寄存器文件214的指令指定的寄存器中。
82.标量数据路径侧a 115包括m1单元223。m1单元223通常接受两个64位操作数并且产生一个64位结果。这两个操作数都是从全局标量寄存器文件211或m1/n1局部寄存器文件213中的指令指定的寄存器调用的。由m1单元223执行的指令选择的操作的示例包括:8位、16位和32位乘法操作;伽罗瓦域乘法、带和不带舍入的复数乘法、ieee浮点乘法操作;复杂的点积操作;32位计数操作;复杂的共轭乘法操作以及按位逻辑操作、移位、加和减。结果被写入全局标量寄存器文件211、l1/s1局部寄存器文件212、m1/n1局部寄存器文件213或d1/d2局部寄存器文件214的指令指定的寄存器中。
83.标量数据路径侧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的指令指定的寄存器中。
84.标量数据路径侧a115包括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的指令指定的寄存器中。
85.矢量数据路径侧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或断言寄存器文件214的指令指定的寄存器中。
86.矢量数据路径侧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或断言寄存器文件214的指令指定的寄存器中。
87.矢量数据路径侧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的指令指定的寄存器中。
88.矢量数据路径侧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的指令指定的寄存器中。
89.矢量数据路径侧b 116包括相关单元(c单元)245。c单元245通常接受两个512位操作数并且产生一个512位结果。这两个操作数都是从全局矢量寄存器文件231或m2/n2/c局部寄存器文件233中的指令指定的寄存器调用的。在该示例中,c单元245执行用于wcdma(宽带码分多址)编码/解码的“搜查”和“搜索”指令。在该示例中,c单元245可以执行每个时钟周期高达512个2位pn(伪随机数)和8位i/q(复数);8位和16位的绝对差求和(sad)计算,每个时钟周期高达512个sad;水平加法和水平最小/最大指令;以及矢量排列指令。c单元245还包括用于控制c单元245指令的某些操作的4个矢量控制寄存器(cucr0到cucr3)。控制寄存器cucr0到cucr3用作某些c单元245操作的操作数。在一些示例中,控制寄存器cucr0到cucr3用于控制通用排列指令(vperm),并且用作simd多重点积操作(dotpm)和simd多重绝对差求和(sad)操作的掩码。在另一示例中,控制寄存器cucr0用于存储伽罗瓦(galios)域乘法操作(gfmpy)的多项式,并且控制寄存器cucr1用于存储伽罗瓦域多项式发生器函数。
90.矢量数据路径侧b 116包括p单元246。矢量断言(p)单元246在局部断言寄存器文
件234的寄存器上执行基础逻辑操作。p单元246具有从断言寄存器文件234读取和对断言寄存器文件234写入的直接访问权。这些逻辑操作包括单个寄存器一元操作,诸如,neg(取反),其将单个寄存器的每个位(bit)反转;bitcnt(位计数),其返回单个寄存器中具有预定数字状态(1或0)的位数的计数;rmbd(最右位检测),其返回从最低有效位位置(最右位)到具有预定数字状态(1或0)的第一位位置的位位置的数量;decimate(降采样),其选择每个指令指定的第n(1、2、4等)位进行输出;以及expand(扩展),其将每个位复制指令指定的n(2、4等)次。这些逻辑操作还包括两个寄存器二元操作,诸如,and,其为两个寄存器的数据的按位“与(and)”;nand,其为两个寄存器的数据的按位“与”并取反;or,其为两个寄存器的数据的按位“或(or)”;nor,其为两个寄存器的数据的按位“或”并取反;以及xor,其为两个寄存器的数据的“异或”。这些逻辑操作包括将数据从断言寄存器文件234的断言寄存器传输到另一个指定的断言寄存器或传输到全局矢量寄存器文件231中的指定的数据寄存器。p单元246的一个用途是操纵用于控制进一步simd矢量操作的simd矢量比较结果。bitcnt指令可用于对断言寄存器中的1的数量进行计数以确定来自断言寄存器的有效数据元素的数量。
91.图3说明全局标量寄存器文件211。存在16个独立的64位宽标量寄存器,其标记为a0-a15。全局标量寄存器文件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读取。
92.图4说明d1/d2局部寄存器文件214。存在十六个独立的64位宽的标量寄存器,其标记为d0-d16。d1/d2局部寄存器文件214的每个寄存器被读取或写入作为64位的标量数据。所有的标量数据路径侧a115功能单元(l1单元221、s1单元222、m1单元223、n1单元224、d1单元225和d2单元226)可以对全局标量寄存器文件211写入。仅d1单元225和d2单元226可以从d1/d2局部寄存器文件214读取。存储在d1/d2局部寄存器文件214中的数据可以包括用于地址计算的基础地址和偏移地址。
93.图5说明l1/s1局部寄存器文件212。在该示例中,l1/s1局部寄存器文件212包括八个独立的64位宽的标量寄存器,其标记为al0-al7。在该示例中,指令编码允许l1/s1局部寄存器文件212包括高达16个寄存器。在该示例中,实施八个寄存器以降低电路大小和复杂性。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读取。
94.图6说明m1/n1局部寄存器文件213。在该示例中,实施八个独立的64位宽的标量寄存器,其被标记为am0-am7。在该示例中,指令编码允许m1/n1局部寄存器文件213包括高达16个寄存器。在该示例中,实施八个寄存器以降低电路大小和复杂性。m1/n1局部寄存器文件213的每个寄存器可以被读取或写入作为64位的标量数据。所有的标量数据路径侧a115
功能单元(l1单元221、s1单元222、m1单元223、n1单元224、d1单元225和d2单元226)可以对m1/n1局部寄存器文件213写入。m1单元223和n1单元224可以从m1/n1局部寄存器文件213读取。
95.图7说明全局矢量寄存器文件231。存在十六个独立的512位宽的矢量寄存器。全局矢量寄存器文件231的每个寄存器可以被读取或写入作为64位的标量数据,标记为b0-b15。指令类型确定数据大小。所有的矢量数据路径侧b 116功能单元(l2单元241、s2单元242、m2单元243、n2单元244、c单元245和p单元246)可以对全局矢量寄存器文件231读取或写入。标量数据路径侧a115功能单元(l1单元221、s1单元222、m1单元223、n1单元224、d1单元225和d2单元226)可以在下面描述的限制条件下经由交叉路径117从全局矢量寄存器文件231读取。
96.图8说明断言(p)局部寄存器文件234。存了八个独立的64位宽的寄存器,其标记为p0-p7。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写入一位simd矢量比较结果;由p单元246操纵simd矢量比较结果;以及使用操纵结果用于控制进一步的simd矢量操作。
97.图9说明l2/s2局部寄存器文件232。在该示例中,实施八个独立的512位宽的矢量寄存器。在该示例中,指令编码允许l2/s2局部寄存器文件232包括高达十六个寄存器。在该示例中,实施八个寄存器以降低电路大小和复杂性。l2/s2局部矢量寄存器文件232的每个寄存器可以被读取或写入作为64位的标量数据,标记为bl0-bl7。l2/s2局部矢量寄存器文件232的每个寄存器可以被读取或写入作为512位的矢量数据,标记为vbl0-vbl7。指令类型确定数据大小。所有的矢量数据路径侧b 116功能单元(l2单元241、s2单元242、m2单元243、n2单元244、c单元245和p单元246)可以对l2/s2局部矢量寄存器文件232写入。l2单元241和s2单元242可以从l2/s2局部矢量寄存器文件232读取。
98.图10说明m2/n2/c局部寄存器文件233。在该示例中,实施八个独立的512位宽的矢量寄存器。在该示例中,指令编码允许m2/n2/c局部寄存器文件233包括高达十六个寄存器。在该示例中,实施八个寄存器以降低电路大小和复杂性。m2/n2/c局部矢量寄存器文件233的每个寄存器可以被读取或写入作为64位的标量数据,标记为bm0-bm7。m2/n2/c局部矢量寄存器文件233的每个寄存器可以被读取或写入作为512位的矢量数据,标记为vml0-vml7。所有的矢量数据路径侧b 116功能单元(l2单元241、s2单元242、m2单元243、n2单元244、c单元245和p单元246)可以对m2/n2/c局部矢量寄存器文件233写入。m2单元243、n2单元244和c单元245可以从m2/n2/c局部矢量寄存器文件233读取。
99.对由一侧的所有功能区可访问的全局寄存器文件和由一侧的一些功能单元可访问的局部寄存器文件的规定是设计选择。在另一个示例中,可以进行不同的可访问性规定,诸如采用对应于本文所述的全局寄存器文件的一类寄存器文件。
100.交叉路径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。
101.流引擎125(图1)在某些受限的情况下传输数据。流引擎125控制两个数据流。流包括特定类型的元素序列。对这些流进行操作的程序顺序读取数据,进而对每个元素进行操作。每个流具有下列基本属性:流数据具有良好定义的开始时间和结束时间;在整个流中,流数据具有固定的元素大小和类型;以及流数据具有固定的元素序列。一旦流被打开,则流引擎125执行以下操作:计算地址;从l2统一缓存器130(其可能需要来自更高级的存储器的缓存服务,例如在l2中缓存错失的事件中)提取所定义的数据类型;执行数据类型操纵,诸如零扩展、符号扩展、数据元素整理/调换(诸如矩阵转置);以及将数据直接传送到处理器核心110中的程序化数据寄存器文件。因此,流引擎125有益于对表现良好的数据的实时数字滤波操作。流引擎125从这些存储器提取任务释放对应的处理器,因此使得能够进行其他处理功能。
102.流引擎125提供若干益处。例如,流引擎125允许多维存储器访问,增加功能单元的可用带宽,由于流缓冲器旁通l1d缓存器123而使缓存错失拖延(stalls)的数量最小化,并且降低维持循环所需要的标量操作的数量。流引擎125还管理地址指针,并且处理释放用于其他计算的地址生成指令间隙(slot)以及d1单元225和d2单元226的地址生成。
103.处理器核110(图1)对指令流水线进行操作。指令在固定长度的指令包中提取,如下面进一步描述的。所有指令需要相同数量的流水线阶段来用于提取和解码,但是需要不同数量的执行阶段。
104.图11说明下列流水线阶段:程序提取阶段1110、分派和解码阶段1120以及执行阶段1130。对于所有指令,程序提取阶段1110包括三级。对于所有指令,分派和解码阶段1120包括三级。执行阶段1130根据指令包括一到四级。
105.提取阶段1110包括程序地址生成(pg)级1111、程序访问(pa)级1112和程序接收(pr)级1113。在程序地址生成级1111期间,在处理器中产生程序地址并且将读取请求发送到l1i缓存器的存储器控制器。在程序访问级1112期间,l1i缓存器处理该请求、访问其存储器中的数据并且将提取包发送到处理器边界。在程序接收级1113期间,处理器寄存该提取包。
106.在包含16个32位宽字的提取包中提取指令。图12说明单个提取包的十六个指令1201-1216。提取包在512位(16字)边界上对准。该示例采用固定的32位指令长度,这使得解
码器容易对准。恰当对准的指令提取可以将多个指令加载到并行指令解码器中。当预定指令对准存储在通过使提取包在512位边界上对准而与固定指令包提取耦连的存储器中时,预定指令对准可以获得这种恰当对准的指令提取。相反,可变长度的指令需要在解码之前定位每个指令边界的初始步骤。固定长度指令集通常允许更规则的指令字段的布局,这简化每个解码器的结构,有益于宽发布(wide issue)vliw处理器。
107.个体指令的执行由每个指令中的p位部分地控制。在该示例中,该p位是32位宽的间隙的位0。p位确定指令是否与下一个指令并行执行。从较低地址到较高地址扫描指令。在该示例中,如果指令的p位是1,则下一个跟随的指令(较高存储器地址)与该指令并行执行(与该指令在同一个周期内)。如果指令的p位是0,则下一个跟随的指令在该指令之后的周期内被执行。
108.处理器核心110(图1)和l1i缓存器121流水线(图1)相互解耦。从l1i缓存器返回的提取包可以采用不同数量的时钟周期,这取决于外部情况,诸如是否在l1i缓存器121中命中或在l2组合式缓存器130中命中。因此程序访问级1112可以采用几个时钟周期来代替如在其他级中的一个时钟周期。
109.并行执行的指令组成执行包。在该示例中,执行包可以包括高达十六个32位宽的间隙用于十六个指令。执行包中任何两个指令都不可以使用相同的功能单元。间隙是以下五个类型之一: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)条件码扩展。这些间隙类型中的一些在本文进一步描述。
110.分派和解码阶段1120(图11)包括指令分派到适当执行单元(ds)级1121;指令预解码(dc1)级1122;以及指令解码及操作数读取(dc2)级1123。在指令分派到适当执行单元级1121期间,提取包被划分成执行包中并且分配给合适的功能单元。在指令预解码级1122期间,源寄存器、目的地寄存器和相关联的路径被解码用于执行功能单元中的指令。在指令解码及操作数读取级1123期间,执行更加详细的单元解码,并且从寄存器文件读取操作数。
111.执行阶段1130包括执行(e1-e5)级1131-1135。不同类型的指令需要不同数量的这种级以完成执行。流水线的执行级对于理解处理器周期边界处的设备状态起到重要的作用。
112.在e1级1131期间,估计指令的条件并且对操作数进行操作。如图11所图示说明的,e1级1131可以接收来自流缓冲器1141和寄存器文件之一(图示性示出为1142)的操作数。对于加载和存储指令,执行地址生成并且将地址修改写入到寄存器文件。对于分支指令,pg阶段中的分支提取包受到影响。如图11所图示说明的,加载和存储指令访问存储器(在此图示性示出为存储器1151)。对于单周期指令,当指令的任何条件都被估计为正确时,结果被写入到目的地寄存器文件。如果条件被估计为错误,则在e1级1131之后指令不写入任何结果或不具有任何流水线操作。
113.在e2级1132期间,加载指令将地址发送到存储器。存储指令将地址和数据发送到存储器。如果发生饱和,则使结果饱和的单周期指令设置控制状态寄存器(csr)中的sat位。对于2周期指令,结果被写入目的地寄存器文件。
114.在e3级1133期间,执行数据存储器访问。如果发生饱和,则使结果饱和的任何多重指令设置控制状态寄存器(csr)中的sat位。对于3周期指令,结果被写入目的地寄存器文件。
115.在e4级1134期间,加载指令将数据带到处理器边界。对于4周期指令,结果被写入目的地寄存器文件。
116.在e5级1135期间,加载指令将数据写入到寄存器中,如在图11中通过从存储器1151到e5级1135的输入来图示说明的。
117.图13说明由处理单元核心110使用的指令编码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)中的一个的操作。
118.在图13的示例中,dst字段1301指定对应的寄存器文件中的寄存器作为指令结果的目的地。src2/cst字段1302具有几个含义,其取决于指令操作码字段1304和单元字段1305。一个含义指定对应的寄存器文件的寄存器作为第二操作数。另一个含义是直接常量。根据指令类型,字段1302被视为扩展到指定数据长度的无符号整数和零或者视为扩展到指定数据长度的有符号整数和符号。
119.src1字段1303指定对应的寄存器文件中的寄存器作为第一源操作数。操作码字段1304指定指令的类型。单元字段1305结合侧位1306指示哪些功能单元用于执行指令。除下面描述的指令选项外,操作码的详细解释超出本说明书的范围。
120.s位1306指明标量数据路径侧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以及对应的寄存器文件。
121.p位1307标记执行包。p位确定该指令是否与随后的指令并行执行。从较低地址到较高地址扫描p位。如果对于当前指令p=1,则下一个指令与当前指令并行执行。如果对于当前指令p=0,则下一个指令在当前指令之后的周期中执行。并行执行的所有指令组成执行包。执行包可以包含高达十六个指令。执行包中的每个指令使用不同的功能单元。
122.处理单元核心110的大多数指令不包括用于条件执行的直接编码。然而,指令可以做成是有条件的。使指令变得有条件的行为被称为断言(predication),并且存储条件的寄存器被称为断言寄存器。执行包可以包括两个32位条件码扩展间隙,它们为同一执行包中的指令编码4位条件信息。条件码间隙被称为条件码扩展间隙0和条件码扩展间隙1,并且4位条件信息在本文中被称为creg/z字段。
123.表1示出了creg/z字段的编码。creg位标识断言寄存器,并且z位指示断言是基于断言寄存器中的零还是非零。条件指令的执行取决于存储在指定数据寄存器中的值。如果z=1,则测试是针对零的相等性。如果z=0,则测试是针对非零。creg=0和z=0的情况被视为“真”以允许无条件指令执行。请注意,z位列中的“z”是指上面提到的零/非零比较选择,并且“x”是不关心状态。
124.表1
[0125][0126]
图14说明用于条件码扩展间隙0 1400的编码。字段1401指定分配到l1单元221指令的四个creg/z位,字段1402指定分配到l2单元241指令的四个creg/z位,字段1403指定分配到s1单元222指令的四个creg/z位,字段1404指定分配到s2单元242指令的四个creg/z位,字段1405指定分配到的d1单元225指令的四个creg/z位,字段1406指定分配到d2单元245指令的四个creg/z位,字段1407是未使用的/保留的,并且字段1408被编码为识别条件码扩展间隙0的一组独特位(ccex0)。当检测到条件码扩展间隙0的独特id时,采用creg/z位来控制同一执行包中任意对应的l1单元221、l2单元241、s1单元222、s2单元242、d1单元225、d2单元226指令的条件执行。注意,恰当编码的条件码扩展间隙0可以使得执行包中的一些指令是有条件的并且一些指令是无条件的。
[0127]
图15说明用于条件码扩展间隙1 1500的编码。字段1501指定分配到m1单元223指令的四个creg/z位,字段1502指定分配到m2单元243指令的四个creg/z位,字段1503指定分配到c单元245指令的四个creg/z位,字段1504指定分配到n1单元224指令的四个creg/z位,字段1505指定分配到n2单元244指令的四个creg/z位,字段1506是未使用的/保留的,并且字段1507被编码为识别条件码扩展间隙1的一组独特位(ccex1)。当检测到条件码扩展间隙1的独特id时,采用对应的creg/z位来控制同一执行包中任意的m1单元223、m2单元243、c单元245、n1单元224和n2单元244指令的条件执行。
[0128]
再次参考图13,在一些指令中,操作码字段1304中被称为常量扩展位的位可以被编码成指示src2/cst字段1302中的常量要被扩展。执行包可以包含两个32位常量扩展间隙,每个32位常量扩展间隙可以存储将被串接(concatenate)为高阶位的27位与字段1302中的5位常量以形成32位常量。图16说明常量扩展间隙0 1600的字段。字段1601存储扩展的32位常量的27个最高有效位。字段1602被编码为识别常量扩展间隙0的一组独特位(cstx0)。在该示例中,常量扩展间隙0 1600可以被用于扩展同一执行包中的l1单元221指令、d1单元225指令中的数据、s2单元242指令、d2单元226指令中的偏移、m2单元243指令、n2单元244指令、分支指令或c单元245指令中的一个的常量。常量扩展间隙1除了该间隙用一组独特位(cstx1)编码来识别常量扩展间隙1以外与常量扩展间隙0类似。在该示例中,常量扩展间隙1可以被用于扩展同一执行包中的l2单元241指令、d2单元226指令中的数据、s1单元222指令、d1单元225指令中的偏移、m1单元223指令或n1单元224指令中的一个的常量。
[0129]
以如下方式使用常量扩展间隙0和常量扩展间隙1。指令解码器113根据指令操作
码位确定常量在字段1302(被称为直接字段)中,并且确定该常量是否要从操作码字段1304中的先前提到的常量扩展位扩展。如果指令解码器113检测到常量扩展间隙0或常量扩展间隙1,则指令解码器113为对应于检测到的常量扩展间隙的指令检查执行包内的指令。当一个对应的指令具有等于1的常量扩展位时进行常量扩展。
[0130]
图17是说明常量扩展的部分框图1700。图17假设指令解码器113(图1)检测同一执行包中的常量扩展间隙和对应的指令。指令解码器113将来自常量扩展间隙的字段1601的二十七个扩展位以及来自对应的指令的字段1302的五个常量位供应到串接器1701。串接器1701根据这两部分形成单个32位字。在该示例中,来自常量扩展间隙的字段1601的二十七个扩展位是最高有效位并且来自字段1302的五个常量位是最低有效位。组合的32位字被供应到多路复用器1702的一个输入。来自对应的指令字段1302的五个常量位将第二输入供应到多路复用器1702。多路复用器1702的选择受常量扩展位的状态控制。如果常量扩展位是1,则多路复用器1702选择串接的32位输入。如果常量扩展位是0,则多路复用器1702选择来自对应的指令字段1302的五个常量位。多路复用器1702的输出供应符号扩展单元1703的输入。
[0131]
符号扩展单元1703根据来自多路复用器1703的输入形成最终操作数值。符号扩展单元1703接收控制输入标量/矢量和数据大小。标量/矢量输入指示对应的指令是标量指令还是矢量指令。数据路径侧a 115的功能单元(l1单元221、s1单元222、m1单元223、n1单元224、d1单元225和d2单元226)执行标量指令。指向这些功能单元中的一个的任何指令都是标量指令。数据路径侧b116的功能单元l2单元241、s2单元242、m2单元243、n2单元244和c单元245可以执行标量指令或矢量指令。指令解码器113根据操作码位确定指令是标量指令还是矢量指令。p单元246可以执行标量指令。数据大小可以是八位(字节b)、十六位(半字h)、32位(字w)或64位(双字d)。
[0132]
表2列出用于各种选项的符号扩展单元1703的操作。
[0133]
表2
[0134][0135]
如上面结合图13所描述的,常量扩展间隙0和常量扩展间隙1两者都可以包括p位以定义执行包。在该示例中,如在条件码扩展间隙的情况中,常量扩展间隙0和常量扩展间隙1具有被编码为1的位0(p位)。因此,常量扩展间隙0和常量扩展间隙1都不可以在执行包的最后一个指令间隙中。
[0136]
执行包可以包括常量扩展间隙0或1以及标记为常量扩展(e位=1)的不止一个对
应的指令。对于这样的事件,对于常量扩展间隙0,执行包中的l1单元221指令、d1单元225指令中的数据、s2单元242指令、d2单元226指令中的偏移、m2单元243指令或n2单元244指令中不止一个可以具有为1的e位。对于这样的事件,对于常量扩展间隙1,执行包中的l2单元241指令、d2单元226指令中的数据、s1单元222指令、d1单元225指令中的偏移、m1单元223指令或n1单元224指令中不止一个可以具有为1的e位。在一个示例中,指令解码器113确定这种事件是无效操作并且不被支持。替代地,组合可以由施加到标记为常量扩展的每个对应的功能单元指令的常量扩展间隙的扩展位支持。
[0137]
l1单元221、s1单元222、l2单元241、s2单元242和c单元245通常以单指令多数据(simd)模式进行操作。在该simd模式中,相同的指令被施加到来自两个操作数的打包数据。每个操作数保持设置在预定间隙中的多个数据元素。simd操作通过在数据边界处的进位控制来启用。这种进位控制启用对变化的数据宽度进行的操作。
[0138]
图18说明进位控制逻辑。与门1801接收操作数宽度的算法逻辑单元(对于标量数据路径侧a 115功能单元是64位,并且对于矢量数据路径侧b 116功能单元是512位)内的位n的进位输出。与门1801还接收在下面进一步描述的进位控制信号。与门1801的输出被供应到操作数宽度的算法逻辑单元的位n 1的进位输入。与门(诸如与门1801)被设置在可能的数据边界处的每一对数位之间。例如,对于8位数据,这种与门将在位7和位8、位15和位16、位23和位24等之间。每一个这种与门接收对应的进位控制信号。如果数据大小是最小大小,则每个进位控制信号是0,从而有效地阻挡相邻位之间的进位传输。如果选择的数据大小需要两个算法逻辑单元区段,则对应的进位控制信号是1。下面的表3示出如矢量数据路径侧b 116功能单元所使用的512位宽的操作数的情况下的示例进位控制信号,其可以被分为8位区段、16位区段、62位区段、64位区段、128位区段或256位区段。在表3中,上面的32位控制上面几位(位128到位511)进位,并且下面的32位控制下面几位(位0到位127)进位。不需要对最高有效位的进位输出进行控制,因此仅需要63个进位控制信号。
[0139]
表3
[0140][0141][0142]
对2的整数幂(2n)的数据大小进行操作是常见的。然而,进位控制技术不限于2的整数幂,并且可以应用到其他数据大小和操作数宽度。
[0143]
在该示例中,至少l2单元241和s2单元242使用断言寄存器文件234中的寄存器采用两种类型的simd指令。在该示例中,simd矢量断言指令对指令指定的数据大小进行操作。数据大小包括字节(8位)数据、半字(16位)数据、字(32位)数据、双字(64位)数据、四字(128位)数据和半矢量(256位)数据。在这些指令类型的第一种中,功能单元(l2单元241或s2单元242)对打包在两个通用数据寄存器中的数据执行simd比较并将结果供应给断言数据寄存器。该指令指定数据大小、两个通用数据寄存器操作数和目标断言寄存器。在该示例中,每个断言数据寄存器包括对应于通用数据寄存器的每个最小数据大小部分的一个位。在当前示例中,通用数据寄存器为512位(64字节),并且断言数据寄存器为64位(8字节)。断言数据寄存器的每一个位对应于通用数据寄存器的八个位。比较是在指定的数据大小(8、16、32、64、128或256位)上执行的。如果比较为真,则功能单元向对应于该数据大小部分的所有断言寄存器位供应1。如果比较为假,则功能单元向对应于该数据大小部分的断言寄存器位供应零。在该示例中,启用的比较操作包括:小于、大于和等于。
[0144]
在指令类型的第二种中,功能单元(l2单元241或s2单元242)基于断言数据寄存器中的数据的状态分别对打包在通用数据寄存器中的数据执行第一simd操作或第二simd操作。指令指定数据大小、一个或两个通用数据寄存器操作数、控制断言寄存器和通用数据寄存器目的地。例如,对于两个矢量操作数的每个数据大小的部分,功能单元可以根据断言数据寄存器中的对应的位的1/0状态选择第一操作数的第一数据元素或第二操作数的第二数据元素以存储在目的地寄存器中。在另一个示例中,取决于断言寄存器的对应的位的数据,单个矢量操作数的数据元素可以被保存到存储器或不被保存。
[0145]
p单元245的操作允许基于多于一个矢量比较的多种复合矢量simd操作。例如,可以使用两个比较来进行范围确定。在simd操作中,将候选矢量与打包在数据寄存器中的具有范围的最小值的矢量基准进行比较。大于结果是标量数据,其中对应于simd数据宽度的位根据simd比较而被设置为0或1,并被存储在断言数据寄存器中。执行候选矢量与打包在不同数据寄存器中的具有范围的最大值的另一个基准矢量的另一个simd比较,其产生存储在另一个断言寄存器中的小于结果的另一个标量。然后p单元对两个断言寄存器进行与操作(and)。and结果指示候选矢量的每个simd数据部分是在范围内还是在范围外。and结果的p单元bitcnt指令可以产生比较范围内的数据元素的计数。p单元neg功能可以用于:将小于比较结果转换为大于等于比较结果;将大于比较结果转换为小于等于比较结果;或者,将等于比较结果转换为不等于比较结果。
[0146]
流引擎
[0147]
图19是图1的示例处理器100的流引擎125的概念视图。图19说明代表由流引擎125控制的两个流的单个流的处理过程。流引擎1900包括流地址生成器1901。流地址生成器1901连续生成流元素的地址并且将这些元素地址供应到系统存储器1910。存储器1910调用存储在元素地址处的数据(数据元素)并且将这些数据元素供应到数据先进先出(fifo)缓冲器1902。数据fifo缓冲器1902在存储器1910和处理器1920之间提供缓冲。数据格式化器1903接收来自数据fifo存储器1902的数据元素并且根据流定义来提供数据格式化。该处理过程在本位更详细描述。流引擎1900将来自数据格式化器1903的格式化数据元素供应到处理器1920。处理器1920上执行的程序消耗该数据并且生成输出。
[0148]
流元素可以存在于系统存储器中。存储器不为该流规定特定结构。程序定义流并
且因此通过指定流属性来规定结构,该流属性诸如,流的第一元素的地址;流中的元素的大小和类型;流中的数据的格式化;以及与流相关联的地址序列。
[0149]
流引擎根据穿行整个存储器的指针来定义流的元素的地址序列。多级嵌套循环控制指针所采取的路径。循环级的迭代计数指示级重复的次数。维度给出循环级的指针位置之间的距离。
[0150]
在基础正向流中,最内部循环物理消耗来自存储器的连续元素,因为最内部循环的隐式维度是一个元素。指针以连续递增的次序逐个元素地移动。在内部循环外部的每个级中,该循环基于循环级的维度的大小将指针移动到新位置。这种形式的寻址允许程序使用小数量的参数指定穿过存储器的规则路径。表4列出基础流的寻址参数。在该示例中,elem_bytes范围从1到64字节,如表5所示。
[0151]
表4
[0152][0153]
表5
[0154]
elem_bytes流元素长度0001字节0012字节0104字节0118字节10016字节10132字节11064字节111保留
[0155]
上面的定义将流的连续元素映射到存储器中的增加的地址,这适用于许多算法。一些算法通过以降低的存储器地址级别、反向流寻址的方式读取元素来更好的服务。例如,离散卷积计算矢量点积,如以下图示说明的:
[0156][0157]
其中,f[]和g[]表示存储器中的阵列。对于每个输出,算法以正向方向读取f[],并且以反向方向读取g[]。实际的滤波器将[x]和[t-x]的指数范围限制到有限数量的元素。为了支持这种模式,流引擎支持以降低的地址顺序读取元素。
[0158]
矩阵乘法对流引擎提出了独特的问题。矩阵乘积中的每个元素是来自第一矩阵的行与来自第二矩阵的列之间的矢量点积。程序可以以行主序或列主序存储矩阵。行主序将单个行的所有元素连续存储在存储器中。列主序将单个列的所有元素连续存储在存储器中。矩阵可以以与语言的默认阵列顺序相同的顺序存储。作为结果,矩阵乘法中的两个矩阵中只有一个映射到流引擎的2维流定义。在示例中,第一索引逐步通过一个阵列上的列,并且逐步通过其他阵列的行。流引擎用转置的流来支持隐式矩阵转置。转置的流避免在存储器中明确转换数据的成本。代替以严格连续元素顺序访问数据,流引擎有效交换横向顺序的内部两个循环维度,沿第二维度将元素提取到连续矢量通道中。
[0159]
该算法能够起作用,但是对于小元素大小的实施是不切实际的。一些算法工作于多个列和行在一起的矩阵拼接。因此,流引擎定义单独的转置粒度。硬件规定最小的粒度。转置粒度需要至少是与元素大小一样大的。转置粒度导致流引擎在沿维度1移动之前从维度0提取一个或多个连续元素。当粒度等于元素大小时,从行主序阵列提取单个列。否则,粒度指定每次从行主序阵列提取两个、四个或更多个列。通过交换该描述中的行和列,这也适用于列主序布局。参数granule指示以字节为单位的转置粒度。
[0160]
另一种常见矩阵乘法技术交换矩阵乘法的最里面的两个循环。当横穿另一个矩阵的行读取时,生成的内部循环不再向下读取一个矩阵的列。例如,该算法可以将一项提升到内部循环以外,用标量值将其代替。最内部循环可以通过在单个标量与矢量相乘之后进行矢量求和来实施。或者,可以横穿矢量的长度并且使用矢量与矢量乘法重复标量值。本示例的流引擎用元素重复模式直接支持后者和相关的使用模式。在该模式中,流引擎读取比全矢量大小更小的颗粒/粒集(granule)并且复制该颗粒以填充下一个矢量输出。
[0161]
流引擎将每个复数处理为具有两个子元素的单个元素,其给出了复数的实部和虚部(直角坐标)或量值部分和角度部分(极坐标)。不是所有的程序或外围设备都与这些子元素应该存在于存储器中的顺序一致。因此,流引擎提供了无成本互换复数的两个子元素的能力。特征互换元素的一半而不解释元素的内容并且可以用于互换任意类型的子元素对,而不仅仅是复数。
[0162]
算法通常优选以高精度工作,但是高精度值比较低精度值需要更多的存储设备和带宽。通常,程序在存储器中以低精度存储数据,将这些值提升到较高精度以便计算,然后将这些值降低到较低精度以便存储。流引擎通过允许算法指定一种类型提升水平来直接支持这种操作。在该示例中,每个子元素可以以整数类型的符号扩展或零扩展被提升到较大类型大小。在一些示例中,流引擎支持浮点提升,其分别将16位和32位浮点值提升到32位和64位格式。
[0163]
虽然流引擎将流定义为数据元素的离散序列,但处理单元核心110消耗连续打包
成矢量的数据元素。矢量与流是相似的,因为矢量包含多个同类元素和一些隐式序列。因为流引擎读取流,但是处理单元核心110消耗矢量,因此流引擎以一致的方式将流映射到矢量上。
[0164]
矢量被划分为相同大小的通道(lane),每个通道经分配以存储子元素。处理单元核心110将矢量的最右边的通道标记为通道0,而不管当前端字节序(endian)模式如何。通道编号从右到左递增。矢量内的通道的实际数量根据矢量的长度和子元素的数据大小变化。进一步地,通道在本文可以称为通道、矢量通道,或simd通道
[0165]
图20说明格式化器1903的格式化操作的序列。格式化器1903包括三个区段:输入区段2010、格式化区段2020和输出区段2030。输入区段2010接收从系统存储器1910调用的数据,如通过流地址生成器1901访问的数据。该数据可以经由线性提取流2011或转置提取流2012。
[0166]
格式化区段2020包括各种格式化块。下面进一步描述块在格式化器1903内执行的格式化。复数互换块2021可选地互换形成复数元素的两个子元素。类型提升块2022可选地将每个数据元素提升为更大的数据大小。提升包括无符号整数的零扩展和有符号整数的符号扩展。降采样块2023可选地对数据元素进行降采样。在该示例中,降采样(decimation)可以是2:1(每隔一个数据元素进行保留)或4:1(每隔三个数据元素进行保留)。元素重复块2024可选地重复各个数据元素。在该示例中,数据元素重复是2的整数幂(2n,其中n是整数),包括2倍、4倍、8倍、16倍、32倍和64倍。在该示例中,数据重复可以在多个目的地矢量上进行扩展。矢量长度掩码/组重复块2025具有两个主要功能。独立指定的矢量长度veclen控制供应给每个输出数据矢量的数据元素。当组重复关闭时,输出数据矢量中的多余通道被零填充,并且这些通道被标记为无效。当组重复打开时,指定矢量长度的输入数据元素被重复以填充输出数据矢量。
[0167]
输出区段2030保持用于输出到对应的功能单元的数据。处理器2031的寄存器和缓冲器存储格式化的数据矢量,以供处理单元核心110(图1)的功能单元用作操作数。
[0168]
图21说明矢量中的通道分派的第一示例。矢量2100被划分成八个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。
[0169]
图22说明矢量中的通道分派的另一个示例。矢量2210被划分成十六个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。
[0170]
流引擎将最里面的流维度直接映射到矢量通道。流引擎将最里面的流维度内的靠前的元素映射到较低的通道编号并且将靠后的元素映射到较高的通道编号,无论流以增加地址顺序前进还是以减小地址顺序前进。无论流如何定义顺序,流引擎以增加通道的顺序将元素存放到矢量中。对于非复合数据,流引擎将第一元素放置在处理单元核心(图1)提取的矢量的通道0中,将第二元素放置在通道1中,以此类推。对于复合数据,流引擎将第一元
素放置在通道0和通道1中,将第二元素放置在通道2和通道3中,以此类推。不管流方向如何,元素内的子元素保持相同的相对顺序。对于非互换的复合元素,每对中具有较低地址的子元素被放置在偶数编号的通道中,并且每对中具有较高地址的子元素被放置在奇数编号的通道中。对于互换的复合元素,放置被反转。
[0171]
流引擎用cpu来自最内部流维度的尽可能多的元素填充处理单元核心110提取的每个矢量。如果最内部维度不是矢量长度的倍数,则流引擎将维度进行零填补到矢量长度的倍数。如下所述,流引擎还将通道标记为无效。因此对于较高维度的流,来自外部维度的每次迭代的第一元素抵达矢量的通道0。流引擎将最内部维度映射到矢量中的连续通道。对于转置的流,最内部维度包括沿维度1而非维度0的子元素的群组,因为转置交换了这两个维度。
[0172]
二维(2d)流相比于一维流表现出更大的多样化。基础2d流从较大的矩形中提取出较小的矩形。转置的2d流逐列而非逐行读取矩形。第二维度与第一维度重叠的循环流执行有限冲击响应(fir)滤波分接,其在对提供输入样品的滑动窗口的样品进行fir滤波上反复循环。
[0173]
图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)。
[0174]
因此,0维度2321中的迭代计数是九,并且1维度2322中的迭代计数是十三。注意elem_bytes缩放最内部维度。第一维度具有elem_bytes大小的icnt0元素。流地址生成器不缩放外部维度。因此,dim1=88,其是十一个元素,其中每个元素被缩放八个字节。
[0175]
图24说明图23的示例流内的元素的顺序。流引擎以图示为顺序2400的顺序提取该流的元素。前九个元素来自矩阵2300的第一行,从左到右为跃程(hop)1到跃程8。第10个元素至第24个元素来自第二行,等等。当流从第9个元素移动到第10个元素时(图24中的跃程9),流引擎基于指针在内部循环的开始处的位置,而不是指针在第一维度的末端处的位置,来计算新位置。因此,dim1独立于elem_bytes和icnt0。dim1代表每个连续行的第一字节之间的距离。
[0176]
转置的流在沿维度0访问之前沿维度1被访问。以下示例说明转置的流,其具有变化的转置粒度。图25说明从具有维度2511和2515的较大矩形2510(14
×
13)中提取出具有维度2521和2522的较小矩形2520(12
×
8)。在图25中elem_bytes等于2。
[0177]
图26说明流引擎如何提取图25的示例流中具有四字节转置粒度的流。提取模式2600从每个行提取元素对(因为值为四的粒度是值为二的elem_bytes的两倍),但是除此之外向下移动各列。一旦流引擎到达一对列的底部,流引擎用下一对列重复模式。
[0178]
图27说明流引擎如何提取图25的示例流中具有八字节转置粒度的流。整体结构保持相同。如提取模式2700所示,流引擎从每一行提取四个元素(因为值为八的粒度是值为二的elem_bytes的四倍),随后在列上移动到下一行。
[0179]
迄今为止检查的流从存储器恰好读取每个元素一次。流可以从存储器读取给定元素多次,实际上在一部分存储器上循环。fir滤波器表现出两个常见的循环模式:重新读取
每个输出的相同的滤波分接,以及从滑动窗口读取输入样品。两个连续的输出需要来自两个重叠窗口的输入。
[0180]
图28说明图1的流引擎125的细节。流引擎125包含三个主区段:流0 2810;流1 2820;以及共享的l2接口2830。流0 2810和流1 2820两者都包含并行操作的相同硬件。流0 2810和流1 2820两者共享l2接口2830。每个流2810和2820以每周期高达512位/周期的速率向处理单元核心110(图1)提供数据,这通过专用流路径和共享的成双l2接口来启用。
[0181]
每个流引擎125包括相应专用6维(6d)流地址生成器2811/2821,其每一个可以每周期产生一个新的非对准请求。如本文进一步描述的,地址生成器2811/2821输出与由流参数定义的序列中的元素重叠的512位对准地址。
[0182]
每个地址生成器2811/2811连接到相应专用微工作台后援缓冲器(μtlb)2812/2822。μtlb 2812/2822每个周期将单个48位虚拟地址转换为44位物理地址。每个μtlb 2812/2822具有8个条目,其覆盖具有4kb页的最小32kb或具有2mb页的最大16mb。每个地址生成器2811/2821每周期产生两个地址。μtlb 2812/2822每周期仅转化一个地址。为了保持吞吐量,流引擎125在大多数流基准在同一4kb页内的假设下操作。因此,地址转化不修改地址的位0至位11。如果aout0和aout1排列在同一4kb页中(aout0[47:12]与aout1[47:12]相同),则μtlb 2812/2822仅转化aout0并且重新使用两个地址中的较高位的转化。
[0183]
转化的地址排列在相应命令队列2813/2823中。这些地址与来自相应对应的存储分派和跟踪块2814/2824的信息对准。流引擎125不明确管理μtlb2812/2822。系统存储器管理单元(mmu)根据需要在环境切换期间使μtlb无效。
[0184]
存储分派和跟踪块2814/2824管理流的内部存储设备,探索数据的重新使用并且跟踪每片数据的寿命。块每周期接受两个虚拟地址并且如果地址尚未分配到间隙则将这些地址约束到内部存储设备中的间隙。数据存储被组织为间隙的阵列。流引擎维持以下元数据以跟踪每个间隙中的数据的内容和寿命:与间隙相关联的49位虚拟地址、指示标签地址是否有效的有效位、指示数据已经到达地址的即时位、指示是否存在对该数据的任何显著引用的激活位,以及指示对引用队列中的该间隙的最近引用最后引用值。本文进一步描述了存储分配和跟踪。
[0185]
相应引用队列2815/2825存储由相应对应的地址生成器2811/2821产生的引用的序列。引用序列使数据格式化网络能够将数据以正确的顺序呈现给处理单元核心110。相应引用队列2815/2825中的每个词条包含用于从数据存储器读出数据并将数据对准用于处理单元核心110的必要信息。相应引用队列2815/2825在每个间隙中维持表6中列出的信息:
[0186]
表6
[0187][0188]
当地址生成器2811/2821产生新地址时,存储分派和跟踪块2814/2824将引用插入引用队列2815/2825中。当数据变得可用并且流保持寄存器中存在空间时,存储分派和跟踪块2814/2824从引用队列2815/2825中移除引用。当存储分派和跟踪块2814/2824从引用队
列2815/2825中移除间隙引用并且格式化数据时,对于对相应间隙的最近引用检查引用。存储分派和跟踪块2814/2824比较移除指针的引用队列2815/2825与间隙的记录的最后引用。如果指针和记录的最后引用匹配,则存储分派和跟踪块2814/2824一旦不再需要数据就将间隙标记为未激活。
[0189]
流引擎125具有用于选定数量元素的相应数据贮存器2816/2826。深度缓冲允许流引擎领先于该流进行提取,从而隐藏存储器系统延迟。每个数据贮存器2816/2826在每个周期适应两个同时读取操作和两个同时写入操作,并且因此每个都被称为两次读取两次写入(2r2w)数据贮存器。在其他示例中,缓冲量可以不同。在当前示例中,流引擎125为每个流贡献32个间隙,其中每个间隙由先前描述的元数据标记。每个间隙在八个八字节组中持有64个字节的数据。
[0190]
数据贮存器2816/2826和相应存储分配/跟踪逻辑2814/2824和引用队列2815/2825实施参考图19描述的数据fifo 1902。
[0191]
相应蝴蝶网络/蝶形网络(butterfly network)2817/2827包括七级蝴蝶网络,其实施格式化器1903(图19、图20)。蝴蝶网络2817/2827接收128字节的输入并且产生64字节的输出。该蝴蝶网络的第一级实际是半级,其收集来自匹配未对准提取的两个间隙的字节并且将收集的字节归并为单个旋转的64字节阵列。剩余六级形成标准的蝴蝶网络。相应蝴蝶网络2817/2827执行以下操作:将下一个元素向下旋转到字节通道0;如果被请求,则以二的幂提升数据类型;如果被请求,则将复数的实部和虚部互换;以及如果处理单元核心110目前处于大端字节序(endian)模式,将大端字节序转换为小端字节序。用户指定元素大小、类型提升以及实/虚互换作为流的参数的一部分。
[0192]
流引擎125尝试在处理单元核心110的需求之前提取并格式化该数据,以便维持充足的吞吐量。相应流头寄存器2818/2828提供少量的缓冲,使得该处理过程保持充足的流水线化。相应流头寄存器2818/2828在架构上不是直接可见的。每个流还具有相应流有效寄存器2819/2829。有效寄存器2819/2829指示对应的流头寄存器2818/2828中的哪些元素是有效的。
[0193]
两个流2810/2820共享一对独立的l2接口2830:l2接口a(ifa)2833和l2接口b(ifb)2834。对于1024位/周期的聚合带宽,每个l2接口经由相应总线147/149直接向l2控制器130(图1)提供512位/周期的吞吐量。l2接口使用基于信用的多核总线架构(mba)协议。mba协议在美国专利9,904,645“multicore bus architecture with non-blocking high performance transaction credit system”中被更详细地描述,该专利通过引用并入本文。l2控制器为每个接口分配命令信用池(pool of command credits)。如本文更详细描述的,当读取l2 ram、l2缓存器和多核共享存储器控制器(msmc)存储器时,该池具有足够的信用以使得每个接口可以发送足够的请求来获得充足的回读(read-return)带宽。
[0194]
为了使性能最大化,在该示例中,两个流都可以使用这两个l2接口,从而允许单个流发送两个请求/周期的峰值命令率。每个接口优选一个流在另一个流之上,但是该偏好对于每个请求来说是动态变化的。ifa 2833和ifb 2834一直优选相反的流,当ifa 2833优选流0时,ifb 2834优选流1,反之亦然。
[0195]
在每个相应接口2833/2834之前的相应仲裁器2831/2832在具有可用信用的每个周期上应用以下基础协议。仲裁器2831/2832检查优选的流是否具有准备好发送的命令。如
果是,则仲裁器2831/2832选择该命令。仲裁器2831/2832接下来检查替代的流是否具有准备好发送的至少两个请求或者一个命令并且没有信用。如果是,则仲裁器2831/2832从该替代流中拉出命令。如果任一个接口发布命令,则对于下一个请求,互换优选流和替代流的注释。使用这种算法,两个接口能够尽可能快地分派请求,同时在两个流之间保持公平。第一规则确保每个流可以在具有可用信用的每个周期上发送请求。第二规则提供了当第二接口空闲时第一流借用另一个流的接口的机制。第三规则为横跨两个接口的每个流扩展带宽需求,确保两个接口都不会自身变成瓶颈。
[0196]
相应粗粒度旋转器2835/2836使得流引擎125能够支持转置的矩阵寻址模式。在该模式中,流引擎125交换多维循环的两个最内部维度,以对阵列进行逐列访问而非逐行访问。相应旋转器2835/2836在架构上不是可见的。
[0197]
图29说明示例流模板寄存器2900。流定义模板提供包含数据的流的完整结构。迭代计数和维度提供了该结构的大部分,而各种标识提供剩余细节。在该示例中,对于所有包含数据的流,定义单个流模板2900。流引擎支持的所有流类型都被模板2900覆盖。流引擎支持用于对该流中的元素进行寻址的六级循环嵌套。流模板2900中的大多数字段直接映射到该算法中的参数。字段上的数字是256位矢量内的位数。表7示出流模板的流字段定义。
[0198]
表7
[0199]
字段名图29的附图标记描述大小/位数icnt02901循环0的迭代计数32icnt12902循环1的迭代计数32icnt22903循环2的迭代计数32icnt32904循环3的迭代计数32icnt42905循环4的迭代计数32icnt52906循环5的迭代计数32dim12911循环1的有符号的维度32dim22912循环2的有符号的维度32dim32913循环3的有符号的维度32dim42914循环4的有符号的维度32dim52915循环5的有符号的维度32flags2921流修饰符标识64
[0200]
循环0是最里面的循环,并且循环5是最外面的循环。在当前示例中,dim0等于物理定义连续数据的elem_bytes。因此,流模板寄存器2900不定义dim0。流引擎125将迭代计数解释为无符号整数并且将维度解释为无缩放的有符号整数。任何级(icnt0、icnt1、icnt2、icnt3、icnt4或icnt5)的为零的迭代计数指示空流。每个迭代计数必须至少为1以定义有效流。上述模板指定元素的类型、流的长度和维度。流指令分别指定起始地址,例如通过存储起始地址的标量寄存器文件211中的标量寄存器的规范。因此,程序可以使用相同的模板但使用存储起始地址的不同寄存器来打开多个流。
[0201]
图30说明图29中示出的标识字段2921的子字段定义的示例。如图30中示出的,标识字段2921是6字节或48位。图30示出字段的位数量。表8示出这些字段的定义。
[0202]
表8
[0203][0204]
元素类型(eltype)字段3001定义流中的元素的数据类型。该eltype字段3001的四位的编码如表9所示来定义。
[0205]
表9
[0206]
[0207][0208]
实数/复数类型确定流引擎是否将每个元素视为实数或复数的两个部分(实部/虚部或者量值/角度),并且还指定是否互换复数的两个部分。复数类型具有两倍于子元素大小的总元素大小。否则,子元素大小等于总元素大小。
[0209]
子元素大小以类型提升和矢量通道宽度为目的确定类型。例如,当流请求类型提升时,16位子元素被提升为32位子元素或64位子元素。由于核心110以小端字节序顺序列出矢量,因此当处理单元核心110(图1)以大端字节序模式操作时,矢量通道宽度是重要的。
[0210]
总元素大小指定流的最小粒度,该最小粒度为最内部循环的每个迭代确定流提取的字节数量。流以递增顺序或者以递减顺序读取完整的元素。因此,流的最内部维度跨过icnt0
×
总元素大小的字节。
[0211]
转置(transpose)字段3002确定流引擎是否以转置的顺序访问流。转置的顺序交换内部的两个寻址级。transpose字段3002还指示用于转置该流的粒度。transpose字段3002的三位的编码被定义为如表10所示,用于正常的2d操作。
[0212]
表10
[0213][0214]
[0215]
流引擎128可以以与元素大小不同的粒度转置数据元素,因此允许程序从每行提取多列元素。转置粒度不能小于元素大小。transpose字段3002以下面进一步描述的方式与dimfmt字段3009相互作用。
[0216]
提升(promote)字段3003控制流引擎是否提升流中的子元素以及提升的类型。当被启用时,流引擎125以2的幂数的大小提升类型。promote字段3003的三位的编码如表11所示来定义。
[0217]
表11
[0218][0219]
当promote为000时,对应于1x提升,每个子元素不变并且占据宽度等于eltype指定的大小的矢量通道。当promote为001时,对应于2x提升和零扩展,每个子元素被视为无符号整数并且零扩展为eltype指定宽度的两倍的矢量通道。2x提升对于64位的初始子元素大小是无效的。当promote为010时,对应于4x提升和零扩展,每个子元素被视为无符号整数并且零扩展为eltype指定宽度的四倍的矢量通道。4x提升对于32位或64位的初始子元素大小是无效的。
[0220]
当promote为011时,对应于8x提升和零扩展,每个子元素被视为无符号整数并被零扩展为eltype指定宽度的八倍矢量通道。8x提升对于16位、32位或64位的初始子元素大小是无效的。当promote为101时,对应于2x提升和符号扩展,每个子元素被视为有符号整数并被符号扩展为eltype指定宽度的两倍的矢量通道。2x提升对于64位的初始子元素大小是无效的。
[0221]
当promote为110时,对应于4x提升和符号扩展,每个子元素被视为有符号整数并被符号扩展为eltype指定宽度的四倍的矢量通道。4x提升对于32位或64位的初始子元素大小是无效的。当promote为111时,对应于8倍提升和零扩展,每个子元素被视为有符号整数并被符号扩展为eltype指定宽度的八倍的矢量通道。8x提升对于16位、32位或64位的初始子元素大小是无效的。
[0222]
veclen字段3004以字节为单位定义流的流矢量长度。流引擎125将流分解成veclen字节长的元素组。veclen字段3004的三个位的编码如表12所示定义。veclen不能小
于以字节为单位的元素大小与重复因子的乘积。如表11所示,64字节的最大veclen等于矢量数据路径侧b 116的优选矢量大小。当veclen短于处理单元核心110的本机矢量宽度时,流引擎125填补提供给处理单元核心110的矢量中的额外通道。grdup字段3006确定填补的类型。veclen字段3004以下面详述的方式与eldup字段3005和grdup字段3006相互作用。
[0223]
表12
[0224]
veclen流矢量长度0001字节0012字节0104字节0118字节10016字节10132字节11064字节111保留
[0225]
eldup字段3005指定重复每个元素的次数。元素大小乘以元素重复量不能超过64字节。eldup字段3005的三个位的编码如表13所示定义。eldup字段3005以下面详述的方式与veclen字段3004和grdup字段3006相互作用。允许的元素大小、元素重复因子和目的地矢量长度之间关系的性质要求在完成重复后溢出第一目的地寄存器的重复元素填充整数个目的地寄存器。附加目的地寄存器的数据最终供应相应流头寄存器2818/2828。在第一数据元素的重复完成后,下一个数据元素向下旋转到源寄存器3100的最低有效位,从而丢弃第一数据元素。然后对新数据元素重复该处理过程。
[0226]
表13
[0227]
eldup重复因子000不重复0012次0104次0118次10016次10132次11064次111保留
[0228]
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位)。
[0229]
grdup字段3006指定流引擎125如何针对veclen长度之后的位将流矢量填补到处
理单元核心110的矢量长度。当grdup位3006为0时,流引擎125用零填充额外通道并且标记额外矢量通道为无效。当grdup位3006为1时,流引擎125用每个流矢量中的元素组的副本填充额外通道。当veclen被设置为处理单元核心110的本机矢量宽度时,将grdup位3006设置为1没有影响。veclen必须至少与elem_bytes和元素重复因子eldup的乘积一样大。因此,不能使用veclen来分离元素或元素的重复因子数。
[0230]
组重复对目的地矢量大小进行操作。当元素大小elem_bytes和元素重复因子eldup的乘积等于或超过目的地矢量宽度时,组重复不改变供应的数据。在这种情况下,grdup位3006和veclen字段3004的状态对供应的数据没有影响。
[0231]
下面的一组示例说明veclen和grdup之间的相互作用。以下示例中的每一个示出流引擎如何将流映射到跨越不同流矢量长度和矢量数据路径侧b116的矢量大小的矢量。该示例的流包括64位/8字节的二十九个元素(e0到e28)。该流可以是29个元素的线性流或29个元素的内部循环。这些表说明诸如图21中所示的八字节通道。每个说明的矢量被依次存储在相应流头寄存器2818/2828中。
[0232]
表14说明当veclen为64字节时示例流如何映射到64字节处理器矢量内的位。如表14所示,流扩展在四个矢量上。如前所述,矢量4内的扩展到流之外的通道被零填充。当veclen的大小等于本机矢量长度时,grdup的值无关紧要,因为对于这样的veclen不可能发生重复。
[0233]
表14
[0234][0235]
除了veclen为32个字节之外,表15示出与表14中所示相同的参数。
[0236]
组重复被禁用(grdup=0)。流的二十九个元素以八个矢量分布在通道0到3上。矢量1-7中的额外通道4到7被零填充。在矢量8中,通道1具有流元素(e28),并且其他通道被零填充。
[0237]
表15
[0238]
[0239]
除了veclen为十六个字节之外,表16示出与表14中所示相同的参数。组重复被禁用(grdup=0)。流的二十九个元素以十五个矢量分布在通道0和通道1上。矢量1-14中的额外通道2到7被零填充。在矢量15中,通道1具有流元素(e28),并且其他通道被零填充。
[0240]
表16
[0241][0242][0243]
除了veclen为八个字节之外,表17示出与表14中所示相同的参数。组重复被禁用(grdup=0)。流的二十九个元素以二十九个矢量出现在通道0中。矢量1-29中的额外通道1-7被零填充。
[0244]
表17
[0245][0246][0247]
除了veclen为三十二个字节并且组重复被启用(grdup=1)之外,表18示出与表15中所示相同的参数。流的二十九个元素以八个矢量分布在通道0-7上。每个矢量1-7包括重复的四个元素。重复因子(2)的结果是因为veclen(32字节)是64字节的本机矢量长度的一半。在矢量8中,通道0具有流元素(e28),并且通道1-3被零填充。矢量9的通道4-7重复该模式。
[0248]
表18
[0249][0250]
除了veclen为十六个字节之外,表19示出与表16中所示相同的参数。组重复被启用(grdup=1)。流的二十九个元素以十五个矢量分布在通道0-7上。每个矢量1-7包括重复四次的两个元素。重复因子(4)的结果是因为veclen(16字节)是64字节的本机矢量长度的四分之一。在矢量15中,通道0具有流元素(e28),并且通道1被零填充。这种模式在矢量15的通道2和3、通道4和5以及通道6和7中重复。
[0251]
表19
[0252][0253][0254]
除了veclen为八个字节之外,表20示出与表17中所示相同的参数。组重复被启用(grdup=1)。流的二十九个元素都以二十九个矢量出现在通道0到7上。每个矢量包括重复八次的一个元素。重复因子(8)的结果是因为veclen(8字节)是64字节的本机矢量长度的八分之一。因此,在矢量1-29中,每个通道都是相同的。
[0255]
表20
[0256][0257][0258]
图31说明被包括在图19的格式化器块1903内的矢量长度掩码/组重复块2025(参见图20)的示例。输入寄存器3100接收来自图20所示的元素重复块2024的矢量输入。输入寄存器3100包括布置成64个1字节块的64个字节,即字节0到字节63。应注意,字节0到字节63的字节的长度均等于elem_bytes的最小值。一组多路复用器3101至3163将输入字节从源寄存器3100耦连到输出寄存器3170。每个相应多路复用器3101至3163将输入供应给输出寄存器3170的相应字节1至字节63。并非输入寄存器3100的字节0至字节63的所有输入字节都被耦连到每个多路复用器3101至3163。应注意,没有多路复用器供应输出寄存器3170的字节0。在该示例中,输出寄存器3170的字节0由输入寄存器3100的字节0供应。
[0259]
多路复用器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)经由下面描述的流读取和前进指令消耗数据的速率来设置。只要流包含附加数据元素,组重复格式化就会重复。
[0260]
元素重复(eldup)和组重复(grudp)是独立的。应注意,这些特征包括独立的规范和参数设置。因此,元素重复和组重复可以一起使用或分开使用。鉴于这些是如何指定的,元素重复允许溢出到下一个矢量,而组重复不允许。
[0261]
再次参考图30,decim字段3007控制对应的流的数据元素降采样。流引擎125在存储在相应流头寄存器2818/2828中后从流中删除数据元素以呈现给请求功能单元。降采样移除全体数据元素,而不是子元素。decim字段3007如表21中所列定义。
[0262]
表21
[0263]
decim降采样因子00不降采样012倍104倍11保留
[0264]
如果decim字段3007等于00,则不发生降采样。数据元素被不变地传递到对应的流头寄存器2818/2828。如果decim字段3007等于01,则发生2:1降采样。流引擎125在存储在流头寄存器2818/2828中后从数据流中移除奇数元素。格式化网络中的限制要求在数据提升至少2x时采用2:1降采样(promote不能为000),icnt0必须是2的倍数,并且总矢量长度(veclen)必须足够大以保持单个提升的重复元素。对于转置的流(transpose≠0),转置颗粒度必须是提升之前元素大小的至少两倍(以字节为单位)。如果decim字段3007等于10,则发生4:1降采样。流引擎125每隔三个数据元素进行保留,在存储在流头寄存器2818/2828中后从数据流中移除三个元素。格式化网络中的限制要求在数据提升至少4x时采用4:1降采样(promote不能为000、001或101),icnt0必须是4的倍数并且总矢量长度(veclen)必须足够大以保持单个提升的重复元素。对于转置的流(transpose≠0),在一个示例中,降采样移除列,但不移除行。因此,在这些情况下,对于2:1降采样,转置颗粒度必须至少是提升之前的元素大小的两倍(以字节为单位)(granule≥2
×
elem_bytes),并且对于4:1降采样,转置颗粒度必须至少是提升之前的元素大小的四倍(以字节为单位)(granule≥4
×
elem_bytes)。
[0265]
节流(throttle)字段3008控制流引擎在处理单元核心110之前提取的积极程度。
该字段的两位的编码如表22中所示定义。
[0266]
表22
[0267][0268][0269]
throttle不改变流的含义并且仅用作提示。流引擎可以忽略该字段。针对程序的正确性,程序不应该依赖特定的节流行为,因为架构不指定精确的节流行为。throttle允许程序员向硬件提供有关程序行为的提示。默认情况下,流引擎尝试尽可能在处理单元核心110之前以隐藏尽可能多的延迟(相当于throttle=11),同时为处理单元核心110提供完整的流吞吐量。虽然一些应用程序需要该吞吐量级,这样的吞吐量可能导致其他的不良系统级行为。例如,流引擎在跨越上下文切换中丢弃所有提取的数据。因此,在具有大量上下文切换的系统中,积极的提前提取可能导致带宽浪费。
[0270]
dimfmt字段3009定义流模板寄存器2900的循环计数字段icnt0 2901、icnt1 2902、icnt2 2903、icnt3 2804、icnt4 2905和icnt5 2906中的哪一个、循环维度字段dim1 2911、dim22912、dim3 2913、dim4 2914和dim5 2915中的哪一个以及寻址模式字段am0 3013、am1 3014、am2 3015、am3 3016、am4 3017和am5 3018中的哪一个(flags字段2921的一部分)对于特定流是激活的。表23列出了dimfmt字段3009的各种值的激活循环。每个激活循环计数必须至少为1,并且外部激活循环计数必须大于1。
[0271]
表23
[0272][0273]
dir位3010确定内部循环(循环0)的提取的方向。如果dir位3010为0,则循环0提取在朝向增加地址的向前方向上。如果dir位3010为1,则循环0提取是在朝向减小地址的后向方向上。其他循环的提取方向由对应的循环维度dim1、dim2、dim3、dim4和dim5的符号确定。
[0274]
cbk0字段3011和cbk1字段3012在选择环路寻址后控制环路块大小。本文描述了确定环路块大小的方式。
[0275]
am0字段3013、am1字段3014、am2字段3015、am3字段3016、am4字段3017和am5字段3018控制对应的循环的寻址模式,因此允许为每个循环独立指定寻址模式。am0字段3013、
am1字段3014、am2字段3015、am3字段3016、am4字段3017和am5字段3018中的每一个都是三个位,并且如表24中所列出那样被解码。
[0276]
表24
[0277]
amx字段含义00线性寻址01环路寻址块大小由cbk0设置10环路寻址块大小由cbk0 cbk1 1设置11保留
[0278]
在线性寻址中,地址根据地址算术前进,无论是正向还是反向。在环路寻址中,地址保留在定义的地址块内。在到达环路地址块的末尾后,地址将环绕到块的开始限制。环路寻址块限于2n个地址,其中n是整数。环路地址算术可以通过切断位之间的进位链并且不允许选定数量的最高有效位改变来操作。因此,超出环路块的末尾的算术仅改变最低有效位。块大小如表25中所列出那样被设置。
[0279]
表25
[0280]
[0281][0282]
在该示例中,环路块大小由cbk0编码的数字(第一环路地址模式01)或cbk0 cbk1 1编码的数字(第二环路地址模式10)来设置。例如,在第一环路地址模式中,环路地址块大小的范围可以从512字节到16m字节。对于第二环路地址模式,环路地址块大小的范围可以从1k字节到64g字节。因此,编码的块大小为2(b 9)字节,其中b是编码的块数字,对于第一块大小(amx为01)为cbk0,并且对于第二块大小(amx为10)为cbk0 cbk1 1。
[0283]
处理单元110(图1)通过少量指令和专用寄存器将流引擎125(图28)暴露给程序。程序使用seopen和seclose开始和结束流。seopen打开新流,并且该流保持打开,直到被seclose明确终止或通过seopen被新流替换。seopen指令指定指示打开流0或流1的流编号。seopen指令指定存储流的起始地址的数据寄存器。seopen指令还指定存储如上所述的流模板的流模板寄存器。seopen指令的变元在表26中列出。
[0284]
表26
[0285]
变元描述流起始地址寄存器存储流起始地址的标量寄存器流编号流0或流1流模板寄存器存储流模板数据的矢量寄存器
[0286]
在该示例中,流起始地址寄存器是通用标量寄存器文件211(图2)中的寄存器。seopen指令可以经由示例指令编码1300(图13)的src1字段1303(图13)指定流起始地址寄存器。seopen指令在操作码中指定流0或流1。在该示例中,流模板寄存器是通用矢量寄存器文件221中的矢量寄存器。seopen指令可以经由src2/cst字段1302(图13)指定流模板寄存器。如果指定的流处于激活,则seopen指令关闭先前的流并用指定的流替换该流。
[0287]
seclose明确地将流标记为未激活,刷除任何未完成的活动。对该流的任何进一步引用触发异常。seclose还允许程序提前终止一个或两个流。
[0288]
sesave指令通过捕获指定流的足够状态信息来保存流的状态以在将来重新启动该流。serstr指令恢复以前保存的流。sesave指令保存流元数据并且不保存任何流数据。流响应于serstr指令而重新提取流数据。
[0289]
每个流可以处于以下三种状态之一:未激活、激活或重置后冻结。两个流都以非激活状态开始。打开流将流移动到激活状态。关闭流将流返回到未激活状态。在没有中断和异常的情况下,流通常不进行其他状态转变。为了解决中断,流引擎添加了第三种状态:冻结。冻结状态表示中断的激活流。
[0290]
在该示例中,四个位(每个流有两个位)定义了两个流的状态。每个流的一个位驻留在流引擎内,而另一个位驻留在处理器核心110内。流引擎在内部跟踪每个流是否保持与激活流相关联的参数集。该位区分未激活流和非未激活流。处理器核心110使用任务状态寄存器(tsr)中的每个流的专用位分开跟踪每个流的状态:tsr.se0用于流0,并且tsr.se1用于流1。这些位区分激活流和未激活流。
[0291]
打开流将流移动到激活状态。关闭流将流移动到未激活状态。如果程序在冻结的流上打开新流,则新流替换旧流,并且流引擎丢弃先前流的内容。流引擎支持在当前激活流上打开新流。流引擎丢弃先前流的内容,刷新传递途径(pipeline),并开始针对新打开的流提取数据。一旦数据已经返回,到处理器的数据就变有效。如果程序关闭已经关闭的流,则不发生任何事。如果程序关闭打开或冻结的流,则流引擎丢弃与流相关的所有状态,清除内部流激活位,并清除计数器、对寄存器标记和寻址。关闭流有两个目的。关闭激活流允许程序专门声明流,并且不再需要与流相关联的资源。关闭冻结的流还允许上下文切换码清除冻结的流的状态,使得其他任务看不到它。
[0292]
如上所述,存在流保持寄存器2818或2828内的一些数据无效的情况。如上所述,当流元素的数量小于相应流保持寄存器2818/2828大小时,这种状态可以发生在内部循环的末尾处,或者当剩余流元素的数量小于veclen定义的通道时,这种状态可以发生在内部循环的末尾处。对于不在内部循环的末尾处的时间,如果veclen小于流保持寄存器2818/2828的宽度并且grdup被禁用,则流保持寄存器2818/2828中超过veclen的通道无效。
[0293]
再次参考图28,在该示例中,流引擎125还包括有效寄存器2819和2829。有效寄存器2819指示流头寄存器2818中的有效通道。有效寄存器2829指示流头寄存器2828中的有效通道。相应有效寄存器2819/2829针对对应的流头寄存器2818/2828内的每个最小elem_bytes通道包括一个位。在该示例中,最小elem_bytes为1字节。处理器100的优选数据路径宽度和流头寄存器2818/2828的数据长度为64字节(512位)。有效寄存器2819/2829相应地具有64位的数据宽度。有效寄存器2819/2829中的每个位指示流头寄存器2818/2828中的对应的字节是否有效。在该示例中,0指示流头寄存器内的对应的字节无效,并且1指示对应的字节有效。
[0294]
在该示例中,在读取流头寄存器2818/2828中的相应一个并将数据转移到请求功能单元后,相应有效寄存器2819/2829中的无效/有效数据被自动转移到对应于特定流的断言寄存器文件234(图2)内的数据寄存器。在该示例中,流0的有效数据存储在断言寄存器p0中,并且流1的有效数据存储在断言寄存器p1中。
[0295]
可以以各种方式使用存储在断言寄存器文件234中的有效数据。功能单元可以将矢量流数据与另一组矢量组合,然后使用有效数据指示作为掩码来将组合数据存储到存储
器,从而使得能够针对循环数据的末尾使用与针对所有通道都无效的情况所使用的相同的处理过程,这避免了存储无效数据。存储在断言寄存器文件234中的有效指示可以用作其他处理过程中的掩码或操作数。p单元246(图2)可以具有对断言寄存器中1的数量进行计数的指令(bitcnt),其可以用于确定来自断言寄存器的有效数据元素的计数。
[0296]
图32说明用于产生存储在有效寄存器2819(图28)中的有效/无效指示的示例硬件3200。图32说明流0的硬件;流1包括对应的硬件。每次在流头寄存器2818(图28)中更新数据时,硬件3200进行操作以生成一个有效字。第一输入eltype被供应给解码器3201。解码器3201基于元素大小elem_bytes和元素是实数还是复数来产生对应于最小数据大小的输出total element size。eltype的各种编码的含义如表9所示。表27示出针对各种eltype编码的解码器3201的示例输出(以字节为单位)。应注意,表9列出位,并且表27列出字节。如表27所示,如果元素是实数,则total element size为1、2、4或8个字节,并且如果元素是复数,则total element size为2、4、8或16个字节。
[0297]
表27
[0298][0299]
第二输入promote被供应给解码器3202。解码器3202产生对应于promote输入的输出提升因子。promote的各种编码的含义在表28中示出,该表示出针对各种promote编码的解码器3201的示例输出(以字节为单位)。扩展类型(零扩展或符号扩展)的差异与解码器3202无关。
[0300]
表28
[0301]
promote提升因子
0001001201040118100保留101211041118
[0302]
解码器3201和3202的输出被供应给乘法器3203。乘法器3203产生的乘积是对应于total element size和提升因子的通道大小。因为提升因子是2的整数幂(2n),所以可以通过total element size的对应的移位来实现乘法,例如对于为1的提升因子不移位,对于为2的提升因子移动一位,对于为4的提升因子移动两位,并且对于为8的提升因子移动三位。
[0303]
通道编号单元3204接收矢量长度veclen和lane size并生成通道编号。表29示出针对以字节为单位的通道大小和矢量长度veclen的通道编号的示例解码。
[0304]
表29
[0305][0306]
如前所述,veclen必须大于或等于元素大小和重复因子的乘积。如表29所示,veclen也必须大于或等于元素大小和提升因子的乘积。这意味着veclen必须足够大,以保证元素不能与其由类型提升块2022(图20)产生的扩展分离。表29中对角线下方标记为
“‑”
的单元格指示未经允许的参数组合。
[0307]
单元3204的通道编号输出用作通道/剩余元素控制字单元3211的一个输入。第二输入来自多路复用器3212。多路复用器3212接收循环0输入和循环1输入。循环0输入和循环1输入表示对应的循环的当前迭代中的剩余元素的数量。
[0308]
图33说明图28中所示的地址生成器2811的部分示意图。地址生成器2811形成用于提取对应的流引擎的定义流中的下一个元素的地址。起始地址寄存器3301存储数据流的起始地址。如上所述,在该示例中,起始地址寄存器3301是全局标量寄存器文件211中由打开对应的流的seopen指令指明的标量寄存器。起始地址可以从指定的标量寄存器复制并通过地址生成器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的迭代步长遍历存储器中物理上连续的数据元素。
[0309]
比较器3314将存储在循环0计数寄存器3311中的计数(在由加法器3313递增之后)与来自对应的流模板寄存器2900(图29)的icnt0 2901(图29)的值进行比较。当加法器3312的输出等于流模板寄存器2900的icnt0 2901的值时,循环0的迭代完成。比较器3314生成激活循环0结束信号。循环0计数寄存器3311被重置为0,并触发下一个更高循环(在这种情况下是循环1)的迭代。
[0310]
用于更高循环(循环1、循环2、循环3、循环4和循环5)的环路类似于图33中所示的那样。每个循环包括相应工作循环计数寄存器、加法器、乘法器和比较器。每个循环的加法器由前一个循环的循环结束信号触发。每个乘法器的第二输入是来自对应的流模板的对应的维度dim1、dim2、dim3、dim4和dim5。每个循环的比较器将工作循环寄存器计数与对应的流模板寄存器2900的对应的迭代值icnt1、icnt2、icnt3、icnt4和icnt5进行比较。循环结束信号生成下一个更高循环的迭代。来自循环5的循环结束信号结束该流。
[0311]
图33还说明循环0计数的生成。循环0计数等于存储在对应的工作计数寄存器3311中的更新数据。循环0计数随着工作循环0计数寄存器3311的每次改变而更新。更高循环(循环1、循环2、循环3、循环4和循环5)的循环计数类似地生成。
[0312]
图33还说明循环0地址的生成。循环0地址等于乘法器3313输出的数据。循环0地址随着工作循环0计数寄存器3311的每次改变而更新。循环1、循环2、循环3、循环4和循环5的类似环路产生对应的循环地址。在该示例中,循环0计数寄存器3311和其他循环计数寄存器被实施为向上计数寄存器。在另一示例中,初始化和比较操作作为向下计数电路。
[0313]
再次参考图32,循环向下计数(诸如循环0/)的值由loopx/=icntx-loopx(循环x)给出。因此,循环向下计数是流模板寄存器中指定的初始迭代计数与如图33所示产生的循环向上计数之间的差。
[0314]
通道/剩余元素控制字单元3211(图32)基于来自通道编号单元3204的通道编号和多路复用器3212选择的循环向下计数生成控制字3213。多路复用器3212的控制输入是来自图30的字段3002的transpose信号。如果transpose被禁用(“000”),则多路复用器3212选择循环0向下计数循环0/。对于transpose的所有其他合法值(“001”、“010”、“011”、“100”、“101”和“110”),多路复用器3212选择循环1向下计数循环1/。流引擎将最里面的维度映射到矢量中的连续通道。对于正常流,这是循环0。对于转置的流,这是循环1,因为转置交换了两个维度。
[0315]
通道/剩余元素控制字单元3211如下所述生成控制字3213。控制字3213具有等于来自单元3204的通道编号的位数。如果选定循环的剩余元素计数大于或等于通道编号,则所有通道都是有效的。对于这种情况,控制字3213全为1,表明矢量长度veclen内的所有通道都是有效的。如果选定循环的剩余元素计数是非零的且小于通道编号,则一些通道有效并且一些通道无效。根据上面结合图21和图22描述的通道分配,流元素被分配从最低有效通道开始的通道。在这些情况下,控制字3213包括一定数量的设为一的最低有效位,该数量等于选定循环向下计数的数量。控制字3213的所有其他位都被设置为零。在图32所示的示例中,通道编号等于八,并且有五个有效(1)最低有效位,随后是三个无效(0)最高有效位,这对应于在最后一次迭代中剩余五个元素的循环。
[0316]
控制字扩展单元3214基于通道大小(lane size)的量值来扩展控制字3213。扩展的控制字包括针对每个最小大小通道的一个位。在该示例中,最小流元素大小以及因此最小通道大小是一个字节(8位)。在该示例中,保持寄存器2818/2828的大小等于64字节(512位)的矢量大小。因此,扩展的控制字具有64位,针对流保持寄存器2818/2828的每个字节有一个位。该扩展的控制字填充了对应的有效寄存器2819和2829(图28)的最低有效位。
[0317]
对于veclen等于矢量长度的情况,描述完成。扩展的控制字针对相应有效寄存器2819/2829内所有位置包括一些位。当veclen不等于矢量长度时,存在一些附加考虑。当veclen不等于矢量长度时,扩展的控制字没有足够的位来填充对应的有效寄存器2819/2829。如图32所示,扩展的控制字填充对应的有效寄存器2819/2829的最低有效位,因此为veclen宽度内的通道提供有效/无效位。为超出veclen宽度直到流头寄存器2818的数据宽度的通道提供另一种机制。
[0318]
仍然参考图32,多路复用器3215和组重复单元3216被图示说明为提供所需的附加有效/无效位。参考veclen的描述,如果组重复没有启用(grdup=0),则多余通道是无效的。多路复用器3215的第一输入是invalid0信号,该信号包括数量等于veclen的多个位。当grdup=0时,多路复用器3215选择该输入。组重复单元3216将该输入重复到流头寄存器2818的所有多余通道。因此,有效寄存器2819的最高有效位被设置为零,表明流头寄存器2818的对应字节无效。这发生于表15所示示例的矢量1-8、表16所示示例的矢量1-15和表17所示示例的矢量1-29。
[0319]
在另一个示例中,多路复用器3215和组重复块3216被替换为类似于图31中所示的组重复逻辑2025的组重复逻辑。
[0320]
如前所述,如果组重复被启用(grdup=1),则流头寄存器2818(图28)的多余通道被最低有效位的副本填充。多路复用器3215的第二输入是来自控制字扩展单元3214的扩展的控制字。当grdup=1时,多路复用器3215选择该输入。组重复单元3216将该输入重复到流头寄存器2818的所有多余通道。
[0321]
存在两种可能的结果。在一个结果中,在大多数情况下,veclen内的所有通道都是有效的,并且来自控制字扩展单元3214的位都是1。这发生于表18所示的组重复示例的矢量1-7和表19所示的组重复示例的矢量1-14。在这些条件下,来自控制字扩展单元3214的扩展的控制字的所有位都是1,并且流头寄存器2818的所有通道都是有效的。组重复单元3216因此用1填充所有多余通道。在另一个结果中,剩余流数据元素的数量小于veclen内的通道编号。这发生于表18所示的组重复示例中的矢量8和表19所示的组重复示例中的矢量15。在这些条件下,veclen内的一些通道是有效的,并且一些是无效的。组重复单元3216用与扩展的控制字位具有相同模式的位填充多余通道。在任一情况下,填充对应于扩展的控制位的多余通道。
[0322]
仍然参考图32,其图示说明了在最低有效位和最高有效位之间的边界3217。该边界的位置由veclen的大小相对于流头寄存器2818的大小来设置。
[0323]
图34是说明上述流输入操作数编码的部分示意图3400。图34说明指令解码器113(见图1)的一部分,其对一个指令的src1字段1303进行解码以控制功能单元3420的对应的src1输入。这些相同或相似的电路被重复用于指令控制功能单元3420的src2/cst字段1302。此外,这些电路被重复用于能够将流数据用作同时调度的操作数的执行包内的每个
指令。
[0324]
指令解码器113接收指令的src1字段1303。操作码字段1304和单元字段1305指定对应的功能单元3420和要执行的功能。在该示例中,功能单元3420可以是l2单元241、s2单元242、m2单元243、n2单元244或c单元245。图34图示说明的指令解码器113的相关部分对src1字段1303进行解码。子解码器3411确定src1字段1303是否在00000到01111的范围内。如果是这种情况,则子解码器3411将对应的寄存器编号供应给全局矢量寄存器文件231。在该示例中,寄存器编号是src1字段1303的四个最低有效位。全局矢量寄存器文件231调用存储在对应于寄存器编号的寄存器中的数据,并将数据供应给功能单元3420的src1输入。
[0325]
子解码器3412确定srcl字段1303是否在从10000到10111的范围内。如果是这种情况,则子解码器3412将对应的寄存器编号供应给对应的局部矢量寄存器文件。如果指令指向l2单元241或s2单元242,则对应的局部矢量寄存器文件是局部矢量寄存器文件232。如果指令指向m2单元243、n2单元244或c单元245,则对应的局部矢量寄存器文件是局部矢量寄存器文件233。在该示例中,寄存器编号是src1字段1303的三个最低有效位。对应的局部矢量寄存器文件232/233调用存储在对应于寄存器编号的寄存器中的数据,并将数据供应到功能单元3420的src1输入。
[0326]
子解码器3413确定srcl字段1303是否是11100。如果是这种情况,则子解码器3413将流0读取信号供应给流引擎125。流引擎125然后将存储在保持寄存器2818中的流0数据供应给功能单元3420的src1输入。
[0327]
子解码器3414确定srcl字段1303是否是11101。如果是这种情况,则子解码器3414将流0读取信号供应给流引擎125。流引擎125然后将存储在保持寄存器2818中的流0数据供应给功能单元3420的src1输入。子解码器3414还向流0供应前进信号。如前所述,流引擎125前进以将流0的数据元素的下一个顺序矢量存储在保持寄存器2818中。
[0328]
由子解码器3413或子解码器3414向流引擎125供应流0读取信号将触发另一数据移动。根据这样的流0读取信号,流引擎125将存储在有效寄存器2819中的数据供应给断言寄存器文件234以供存储。在该示例中,这是断言寄存器文件234内的预定数据寄存器。在该示例中,数据寄存器p0对应于流0。
[0329]
子解码器3415确定srcl字段1303是否是11110。如果是这种情况,则子解码器3415将流1读取信号供应给流引擎125。流引擎125然后将存储在保持寄存器2828中的流1数据供应给功能单元3420的src1输入。
[0330]
子解码器3416确定srcl字段1303是否是11111。如果是这种情况,则子解码器3416将流1读取信号供应给流引擎125。流引擎125然后将存储在保持寄存器2828中的流1数据供应给功能单元3420的src1输入。子解码器3414还向流1供应前进信号。如前所述,流引擎125前进以将流1的数据元素的下一个顺序矢量存储在保持寄存器2828中。
[0331]
由子解码器3415或子解码器3416向流引擎125供应流1读取信号将触发另一数据移动。根据这样的流1读取信号,流引擎125将存储在有效寄存器2829中的数据供应给断言寄存器文件234以供存储。在该示例中,这是断言寄存器文件234内的预定数据寄存器。在该示例中,数据寄存器p1对应于流1。
[0332]
类似的电路被用于响应于src2/cst字段1302的位编码来选择供应给功能单元3402的src2输入的数据。可以以上述方式向功能单元3420的src2输入供应恒定输入。如果
指令解码器113从src1字段1303或src2/cst字段1302生成流0的读取信号,则流引擎125将存储在有效寄存器2819中的数据供应给断言寄存器文件234的断言寄存器p0以供存储。如果指令解码113从src1字段1303或src2/cst字段1302生成流1的读取信号,则流引擎125将存储在有效寄存器2829中的数据供应给断言寄存器文件234的断言寄存器p1以供存储。
[0333]
专用于操作数规范的指令位的确切数量以及数据寄存器和流的数量是设计选择。特别地,单个全局矢量寄存器文件的规范和局部矢量寄存器文件的省略是可行的。该示例采用输入操作数选择字段的位编码来指明流读取并且采用另一个位编码来指明流读取和使流前进。
[0334]
每次读取流数据时,图34中图示说明的处理过程自动地将有效数据转移到断言寄存器文件234中。p单元246然后可以使用转移的有效数据来进一步计算元数据。转移的有效数据也可以被用作掩码或操作数,用于由矢量数据路径侧b116功能单元(包括l2单元241、s2单元242、m2单元243、n2单元244和c单元245)中的一个或多个进行其他操作。存在采用该流有效数据的许多可行的复合逻辑操作。
[0335]
图35是说明用于选择操作数源的另一示例配置的部分示意图3500。在该示例中,相应流有效寄存器2819/2829不需要被自动加载到断言寄存器文件234中的预定寄存器。相反,使用到p单元246的显式指令来移动数据。图35说明指令解码器113的一部分(参见图1),其对一个指令的src1字段1303进行解码以控制p单元246的对应的src1输入。这些相同或相似的电路可以被重复用于指令控制p单元246的src2/cst字段1302(图13)。
[0336]
指令解码器113接收指令的srcl字段1303。操作码字段操作码字段1304和单元字段1305指定p单元246和要执行的功能。图35中图示说明的指令解码器113的相关部分对src1字段1303进行解码。子解码器3511确定src1字段1303是否在00000到01111的范围内。如果是这种情况,则子解码器3511将对应的寄存器编号供应给全局矢量寄存器文件231。在该示例中,该寄存器编号是src1字段1303的四个最低有效位。全局矢量寄存器文件231调用存储在对应于寄存器编号的寄存器中的数据,并将该数据供应给p单元246的src1输入。
[0337]
子解码器3512确定srcl字段1303是否在10000到10111的范围内。如果是这种情况,则子解码器3512将解码的寄存器编号供应给断言寄存器文件234。在该示例中,该寄存器编号是src1字段1303的三个最低有效位。断言寄存器文件234调用存储在对应于寄存器编号的寄存器中的数据,并将该数据供应给断言单元246的src1输入。
[0338]
子解码器3513确定srcl字段1303是否是11100。如果是这种情况,则子解码器3513将流0有效读取信号供应给流引擎125。流引擎125然后将存储在有效寄存器2819中的有效数据供应给p单元246的src1输入。
[0339]
子解码器3514确定srcl字段1303是否是11101。如果是这种情况,则子解码器3514将流1有效读取信号供应给流引擎125。流引擎125然后将存储在有效寄存器2829中的流1有效数据供应给p单元246的src1输入。
[0340]
采用流有效寄存器2819/2829作为操作数的p单元246指令可以是先前描述的任何p单元指令,诸如neg、bitcnt、rmbd、decimate、expand、and、nand、or、nor和xor。
[0341]
上述具体指令可以限于p单元242。因此,图34和图35中概述的操作可以被一起使用。如果指令指定的功能单元是l2单元241、s2单元242、m2单元243、n2单元244或c单元245,则src1字段1303被解释为参照图34所概述的。如果指令指定的功能单元是p单元246,则
src1字段1303如参照图35所概述的那样被解释。可替代地,将流有效寄存器自动保存到图34中图示说明的预定断言寄存器可以在一个示例中实施并且在另一个示例中不实施。
[0342]
在处理单元核心110的一些示例中,提供了用于对矢量元素进行排序的指令。一些这样的指令对作为定点的矢量元素进行排序和/或一些这样的指令对作为浮点的矢量元素进行排序。排序指令的变体可以包括以降序元素对进行排序、以升序对元素进行排序和/或以升序或降序之一对矢量的一半进行排序并且以升序或降序之一对另一半进行排序。其他变体可以包括为vperm指令输出控制输入的排序指令,该指令根据控制输入执行矢量元素的排序。
[0343]
至少部分地提供了对矢量元素的排序的支持,因为排序是例如信号处理和计算机视觉中的常见操作。存在对数据集进行排序的许多原因。例如,中值滤波器被用于移除某些类型的噪声。找到一组数字的中位数的一种方法是对数字进行排序,然后将中间的数字取为中位数。
[0344]
在通信系统中的处理的另一个示例中,基于已知的前导码来检测数据帧的开始。前导码可能在任何时间到达接收器,并且需要被定位以建立连接。为此,对传入数据进行采样,并在许多不同的时间偏移处将其与预期的已知前导码进行比较。这些比较中的每一个都导致一个分数,当针对某一比较的假定时间偏移实际上已经找到前导码时,该分数将是最高的。找到最大分数的一种方法是对各个时间偏移处的分数进行排序。
[0345]
在另一示例中,在多天线和多路径系统中,可以执行一些处理以识别n个最大峰值。多路径是指信号从环境中的障碍物反弹并且因此在不同的到达时间以不同的角度到达接收器。找到n个最大峰值的一种方法是对峰值信号值进行排序。
[0346]
在另一示例中,在机器学习系统中,为图像的每个可能分析计算分数以确定图像可能来自系统经过训练以识别的各种对象中的什么对象,例如鸟、鱼、猫等。找到最大分数的一种方法是对分析分数进行排序。
[0347]
所提供的一些排序指令被设计为加速双调归并排序算法,因为该算法是用于排序的并行算法,其可以在simd架构(诸如处理单元核心110的simd架构)上有效地执行。本文简要描述了该算法。例如,可以在“bitonicsorter”,维基百科(wikipedia)(可在https://en.wikipedia.org/wiki/bitonic_sorter获得)和k.e.batcher,“sorting networks and their applications”,proceedings of afips spring joint computer conference,1968,vol.32,pp.307-314(k.e.batcher,“排序网络及其应用”,afips春季联合计算机会议论文集,1968年,32卷,第307-314页)中找到附加的描述。
[0348]
双调归并排序算法将数据集作为输入并产生越来越多的具有“双调”属性的元素组。双调数字序列是其中数字的值开始增加或减少并且然后在某个点从增加变为减少或从减少变为增加的序列。
[0349]
图36是取自上述维基百科条目的示例,其图示说明十六个元素的双调归并排序。从左侧开始,十六个数字“沿着水平线滑动”并按排序顺序在右侧退出。所示网络被设计用于按升序对数字进行排序,即最大的数字出现在底部的水平线上。每个箭头都是一个比较器。当两个数字到达箭头的末端时,将数字进行比较。如果箭头指向较大的数字,则没有任何变化。否则,互换两个数字,使得箭头指向较大的数字。
[0350]
在带有箭头的框(例如,框3600、3602、3604)中,箭头全部指向上或者全部指向下,
并且将框的上半部分中的每个输入与框的下半部分中的对应的输入进行比较。如果框的输入数字形成双调序列,即单个非递减序列后跟单个非递增序列,反之亦然,则输出是两个双调序列。输出的上半部分和下半部分都是双调的,对于箭头指向下的那些框,上半部分的每个元素都小于或等于下半部分的每个元素,而对于箭头指向上的那些框,情况相反。
[0351]
具有箭头的框被组合以形成较大的框,例如框3606、3608,其中较小的框中的箭头全部指向上或全部指向下。每个较大的框都具有相同的结构:将初始箭头框应用于整个输入序列,然后将两个较小的箭头框应用于初始框的结果的每一半,然后将两个较小的箭头框应用于两个框的结果的每一半,依此类推,直到最后一组框各自只接受两个输入。这种结构被称为蝴蝶网络。如果一个较大的框的输入是双调的,则对于其中较小的框中的箭头全部指向下的那些框,框的输出完全按升序排序,或者对于其中较小的框中的箭头全部指向上的那些框,框的输出完全按降序排序。当数字进入一个较大的框时,第一较小的框将其排序到列表的刚好一半。然后该数字穿过较小的框,该较小的框将其排序到这一半内的列表中的刚好四分之一中。这种情况持续下去直到数字被准确地排序到正确的位置为止。因此,较大的框的输出是完全排序的。
[0352]
较大的框进行组合以形成整个排序网络,该网络可以正确地对任何随意输入序列进行排序,其中最大者在底部。每个较大的框的输出将是经排序的序列,因此每对相邻输出的输出将是双调的。较大的框的每一列取n个经排序的序列,并将这些序列成对串接以形成n/2个双调序列,然后这些双调序列由该列中的框进行排序以形成n/2个经排序的序列。该处理过程从被认为是一个元素的经排序的列表的每个输入开始,并继续通过框的所有列,直到最后一列将输入归并到单个经排序的列表中。应注意,可以通过反转较小的框中的箭头的方向来反转排序顺序。
[0353]
处理单元核心110实施可以用于对十六个元素的组进行排序的指令。这些十六元素排序可以用于实施更大的元素集的双调归并排序。图37是三十二元素双调归并排序的示例。应注意,在中间临时级3700处,存在按升序排序的一组十六个元素和按降序排序的一组十六个元素。在下一级3702中,存在两组十六个元素之间的元素的“互换”。“互换”级3702之后是排序级,排序级以升序对级3702产生的每组十六个元素进行排序。
[0354]
如图38中图示说明的,图37的三十二元素双调归并排序的等效物可以使用以升序对元素进行排序的十六元素排序和以降序对元素进行排序的十六元素排序来实施。在该附图中,vsorti16w按升序对十六个32位元素进行排序,并且vsorti16w按降序对十六个32位元素进行排序。“互换”级3702的等效物通过并行执行矢量最小指令vminw和矢量最大指令vmaxw来实施。vmaxw将两个操作数作为输入,比较对应的simd通道中的值,并为每个通道输出较大的值。vminw以类似的方式操作,为每个通道输出较小的值。表30示出实施图38的操作的示例伪码。在该伪码中,||指示该指令与先前指令并行执行。
[0355]
表30
[0356][0357]
在一些示例中,处理单元核心110提供用于对十六个32位浮点数的矢量进行排序的排序指令。vsortd16sp src,dst指令将浮点数的矢量按降序排序到目的地寄存器的simd通道中,其中最大的数字放置在最低的simd通道中,并且最小的数字放置在最高的simd通道中。vsorti16sp src,dst指令将浮点数的矢量按升序排序到目的地寄存器的simd通道中,其中最小的数字放置在最低的simd通道中,并且最大的数字放置在最高的simd通道中。作为实施双调排序算法的一部分,这些指令可以组合使用以按升序和降序对矢量进行排序。
[0358]
在一些示例中,处理单元核心110提供指令vsortdirsp dir,src,dst,该指令根据操作数“dir”的值以升序或降序对十六个浮点数的输入矢量进行排序。在一些示例中,处理单元核心110提供用于对十六个32位有符号和/或无符号定点或整数的矢量进行排序的排序指令。指令vsortd16w、vsorti16w、vsortdu16w和vsortiu16w如上面关于浮点排序指令所述的那样进行操作,其中指令助记符中的“i”和“d”指示排序方向,并且“u”指示无符号。
[0359]
在一些示例中,处理单元核心110提供一个或多个成双的排序指令,其对矢量中的三十二个16位数据元素进行排序。此外,提供了对矢量中的两组16位数据元素的排序。这些指令是vdsortxy[u]16h指令,其中x是d或i并且y是d或i,h指示半字或16位的数据元素大小,并且u(如果存在)指示无符号数据。x指示输入矢量中的下十六个元素是按降序还是升序排序,并且y指示输入矢量中的上十六个元素是按降序还是升序排序。元素可以是定点、半精度浮点或整数。当执行排序时,输入矢量的相应经排序的上十六个元素被放置在输出的上十六个通道中,并且输入矢量的相应经排序的下十六个元素被放置在输出的下十六个通道中。
[0360]
如图39中图示说明的,vdsortxy[u]16h指令可以用于实施三十二元素双调排序算法。该示例图示说明以升序对三十二个16位元素进行排序,该排序利用使用vdsortid16h的排序级3900,然后是“互换”级3902,然后是使用vdsortii16h的另一个排序级3904。使用vdsortdi16h然后使用vdsortdd16h将产生降序排序。
[0361]“互换”级3902的等效物通过执行矢量最小指令vminw和矢量最大指令vmaxw以及vxymv指令来实施,其中x和y可以是h和l,其中h指示矢量的高半部分并且l指示矢量的低半部分。vlhmv指令将由指令的第一操作数指定的矢量的低半部分移动到输出矢量的高半部分,并且将由第二操作数指定的矢量的高半部分移动到输出矢量的低半部分。vhlmv指令将
由指令的第一操作数指定的矢量的高半部分移动到输出矢量的高半部分,并且将由第二操作数指定的矢量的低半部分移动到输出矢量的低半部分。表31示出实施图39操作的示例伪码。
[0362]
表31
[0363][0364]
在一些示例中,处理单元核心110以“蛮力”方式实施排序指令,其中使用的硬件比较比使用“更智能”排序方法所需的硬件比较更多。一般来说,这种“蛮力”方法包括以下步骤:1)将元素的矢量中的每个元素与矢量中的每个其他元素进行比较;2)基于比较,对于每个元素,对矢量中小于该元素的元素的数量进行计数;3)使用每个元素的计数来确定该元素在输出矢量中的通道。
[0365]
例如,假设输入元素是3、8、2、5并且这些元素要按升序排序。执行比较并对有多少元素小于每个元素进行计数产生以下结果:只有一个元素(元素2)小于元素3,三个元素(元素3、2和5)小于元素8,没有元素小于元素2,并且两个元素(3和2)小于元素5。因此,在输出矢量中,元素2放置在通道0中,元素3放置在通道1中,元素5放置在通道3中,并且元素8被放置在通道4中。
[0366]
应注意,当元素值在元素的矢量中出现不止一次时,上述方法不起作用。例如,如果输入元素是3、8、3、5,则值为3的两个元素都将被放置在通道0中,并且没有元素将被放置在通道1中。这可以通过在输入矢量中的元素的通道编号大于与其进行比较的元素的通道编号时使元素比较为“小于或等于”而不是“小于”来补救。通过这种修改,输入矢量中第二个3的通道编号大于第一个3的通道编号,并且因此第二个3的计数将是一而不是零。
[0367]
图40说明针对这种修改的方法进行的比较。表格4000概括地示出哪些元素使用“小于”进行比较,并且哪些元素使用“小于或等于”进行比较。表格4002示出将来自示例的数字代入表格4000的结果。表格4004示出由表格4002中的比较得出的计数。应注意,当表格4002中的比较为真时,将在表格4004中的对应的位置放置一;否则,在对应的位置放置零。将表格4004中的每一列中的值相加以确定每个输入元素的计数。
[0368]
可以进一步简化“蛮力”方法以减少比较的次数。从图40的表格4000可以看出,对角线上的所有比较都是rn《rn,即元素正在与它们自身进行比较。这些比较永远不会为真,并且可以消除。此外,每对数字被比较两次。例如,在表格4000中,既有比较“r1《r0”,也有比较“r0≤r1”。将第二个比较改为“r1≥r0”相当于说r1不小于r0,即“r1≥r0”等价于!(r1《r0)。因此,如图41的表格4100所示,对于四个输入元素,只需要六个实际比较。通常,对于n个输入元素,所需的比较总数为(n2–
n)/2。
[0369]
一旦确定了通道,排序的最后一步是将输入元素移动到输出矢量中的所识别的通
道中。在一些示例中,使用掩码方法将元素放置在输出通道中。这种方法在图42的示例中图示说明。对于输入矢量中的每个元素,该元素跨越矢量中的所有矢量通道重复,并且基于输出矢量中的通道位置的掩码被应用于重复元素的矢量以生成中间矢量,在该中间矢量中,元素在期望通道位置中,并且零在所有其他通道位置中。然后将中间矢量“或”运算在一起以生成经排序的元素的输出矢量。
[0370]
矢量置换逻辑(例如置换网络)(如果可用)也可以用于将输入元素移动到输出矢量的识别的通道中。在一些示例中,处理单元核心116包括矢量置换逻辑,该矢量置换逻辑可以被配置为响应于指定要执行置换的控制输入执行从指定矢量的任何字节矢量通道到指定输出矢量的任何字节矢量通道的任何字节的任何随意重新布置。要置换的矢量的每个字节由控制输入的对应的字节控制。在控制输入的每个字节中,称为字节选择位的六个位被用于指示输入矢量的哪个字节应路由到对应于控制字节的simd通道,并且称为选项控制位的两个附加位被用于指示其他选项。此类矢量置换逻辑的示例的附加描述可以在2019年8月26日提交的题为“method and apparatus for vector permutation”的共同拥有的美国专利申请号16/551,587中找到,该专利申请通过引用整体并入本文。
[0371]
为了使用矢量置换逻辑来生成经排序的矢量,基于为输入矢量的每个元素识别的输出通道来生成置换网络的控制输入。应注意,所识别的输出通道提供每个输入通道到输出通道的映射,而置换网络的控制输入需要相反的信息,即每个输出通道到输入通道的映射。如图43的示例所图示说明的,一种解决方案是创建将每个输入通道映射到所识别的输出通道的矩阵4300,然后对矩阵4300进行转置(如竖直椭圆所示)以生成每个输出通道到输入通道的映射。为了生成矩阵4300,为每个输入通道识别的输出通道从整数变为1个热位矢量(hot bit vector)。每个竖直椭圆被重新编码为整数,该整数指示对应的输出通道到输入通道的映射。然后基于这些整数创建置换网络的控制输入。
[0372]
应注意,示例矢量置换逻辑对字节通道进行操作。因此,如果输入矢量通道和输出矢量通道较大,则为每个较大的矢量通道编码控制输入中的多个连续字节通道。例如,如果输入矢量通道和输出矢量通道是三十二位,则为输出矢量的每个通道编码控制输入的四个连续字节通道。图43中的表格4302示出假设输入元素是三十二位时的置换网络的结果控制输入。
[0373]
应注意,通过对每个输入元素取“计数”的1的补码,即通过反转2的补码数的每一位,可以将上述按升序的排序改变为按降序的排序。对于使用置换网络生成经排序的输出矢量的示例,描述字节位置的最低有效位不被反转,因为字中的每个字节的相对字节位置是恒定的。
[0374]
在一些示例中,处理单元核心110提供排序指令,这些排序指令将32位元素的矢量作为输入,比较矢量中的元素以确定它们彼此的关系(例如,大于或小于),然后输出基于比较的结果导出的控制字。控制字在作为控制输入被供应给矢量置换指令(例如,诸如在美国专利申请号16/551,587中描述的vperm指令)时产生期望的经排序的输出。在一些示例中,vperm指令可以被配置为基于控制输入执行从输入上的任何字节矢量通道到输出上的任何字节矢量通道的任何字节的任何随意重新布置。
[0375]
输出控制字的排序指令被称为vsortpxxx指令,其中xxx是前面提到的组合集(i vs d、16sp vs 16w vs u16w)。如本文先前所述生成该控制字并将其存储在指令指定的输
出位置。vsortpxxx input,tmp后跟vpermtmp,input,output的执行与vsortxxx input,output的执行相同。例如当输入矢量与一些其他指针/属性/数据相关联时,这样的指令是有用的。考虑表32中的示例。假设“输入”是矢量,其包含每个时间偏移的前导码检测的所有分数,并且假设“related_data”包含前导码开始的时间偏移或“猜测”。为了找到前导码的最佳候选,可以执行所示的指令序列,其结果是“sorted_related_data”将包含该矢量中最接近的n个时间偏移。
[0376]
表32
[0377][0378]
矢量排序指令在c单元245(图2)上执行,c单元245包括用于执行上述指令变体中的一个或多个的排序逻辑和可以用于根据控制输入执行矢量置换的置换网络逻辑。图44是示例c单元245的框图。示例处理单元核心110包括划分为八个64位矢量切片的512位矢量处理架构。每个切片包含相同的处理逻辑,并将512位矢量的相应64位作为输入。c单元245包括八个切片处理部件4402-4408,这些切片处理部件被配置为对输入矢量的相应64位切片执行操作。多路复用逻辑(未示出)将src1和src2输入矢量的每个切片路由到相应切片处理部件4002-4008。每个切片处理部件4402-4408包括对输入矢量的相应64位执行算术操作、浮点操作等的逻辑。
[0379]
每个切片处理部件4402-4408还包括用于将src1和src2输入矢量的相应64位传递到全局处理部件4400以用于诸如矢量排序指令的某些指令的逻辑。全局处理部件4400中的部件操作完整的512位矢量而不是64位量。全局处理部件4400包括矢量控制寄存器cucr0-cucr3 4414、相关(correlation)部件4412和置换部件4410。
[0380]
置换部件4410被配置为执行矢量置换指令及其任何变体。如在先前引用的美国专利申请号16/551,587中更详细地描述的,置换部件4410包括矢量置换逻辑。该矢量置换逻辑可以用于基于如本文先前所述生成的控制输入来生成经排序的输出矢量。
[0381]
相关部件4412被配置为执行诸如绝对差求和(sad)、次序排列(rake)和搜索以及矢量排序指令的操作。相关部件4412包括实施支持sad计算的一类指令的逻辑。在2017年10月10日公布的共同拥有的美国专利号9,788,011中提供了用于8位和32位元素的这种逻辑的示例的详细描述,该专利通过引用整体并入本文。
[0382]
在一些示例中,使用相关部件4412中包含的一部分sad逻辑来执行各种排序指令的“蛮力”比较。图45说明了对16位元素进行操作的示例sad逻辑。该sad逻辑包括绝对差元素(例如,元素4501、4511、4531)的阵列。每个绝对差元素在两个输入矢量c和r的元素对之间执行减法操作,然后取减法操作的结果的绝对值。例如,绝对值差元素4501将矢量元素c[0]和r[0]作为输入,从r[0]中减去c[0],并输出结果的绝对值。另外,从绝对差元素的“列”中可以看出,也将输入元素c[0]从元素r[1]至r[15]中减去,将输入元素c[1]从元素r[1]至r[16]中减去,将输入元素c[2]从元素r[2]至r[17]中减去,等等。在该示例中,sad逻辑阵列具有十六行绝对差元素,例如,行4500、4510、4530,并且每行具有十六个绝对差元素。
[0383]
图46说明图45的绝对差元素和对应乘法器的示例实施方式。反转单元4601例如通
过将数字反转并加一来形成来自c矢量的输入元素的算术反转。通过将进位输入(未示出)断言到加法器4602的最低位来完成加一。如果两个输入之间的差为负,则加法器4602将反转单元4601的输出与来自矢量r的输入元素相加并生成有效进位输出4603。如果来自c矢量的输入元素大于来自r矢量的输入元素,则该差将为负。如果加法器4602生成有效进位输出4603,则反转单元4604形成加法器4602的输出的算术反转;否则,反转单元4604对输入不做任何事情。对应于绝对差元素的乘法器由与门4605实施,因为掩码输入是单个位。如果掩码为一,则绝对值不变。如果掩码值为零,则绝对值设置为全零。与门4605的输出被供应给图45中的对应行的求和器的输入。
[0384]
对于排序操作,绝对差元素(例如元素4501、4511、4531)的阵列被用于所需的比较。为了在要排序的矢量的元素之间执行比较,将c矢量和r矢量设置为相同矢量的元素。进位输出4603被用于确定一个矢量元素输入是否小于另一矢量元素输入。4604中的逻辑可能不同,具体取决于数据是有符号还是无符号的,并且还可以考虑输入的符号。
[0385]
图47说明用于图45的sad逻辑的输入的默认组合。图47的网格中的行0代表图45的行4500,网格中的行1代表行4510,等等,以代表行4530的行15结束。网格的顶行描绘了sad阵列的每一列的r矢量元素输入,并且网格中的条目是要从r矢量元素中减去的sad阵列的每一行的对应c矢量元素输入。例如,考虑行6。该行指示该行中的第一个减法是从r6中减去c0,该行中的下一个减法是在c1和r7之间,等等。
[0386]
如前所述,vdsortxy[u]16h指令根据“x”标记对输入矢量的一半进行排序,并且根据“y”标记对另一半进行排序。为了实现这些指令的期望比较,对绝对差元素阵列的输入进行了修改,如图48图示说明的。因为只有一个输入操作数,在该附图中,要排序的矢量“c”被替换为“r”。列r0至r15中的比较是元素r0至r15的所有唯一对之间的比较,并且r16至r30列中的比较是元素r17至r31的所有唯一对之间的比较。
[0387]
如图49图示说明的,内部“cx”操作数上的单个多路复用器4900用于在绝对差元素阵列内部的内部总线上进行选择。多路复用器4900的输出被广播到下游绝对差元素(比较器)。单个多路复用器4900在元素r1至r15与元素r17至r31之间多路复用,以选择每个绝对差元素的输入。在图49中,单个多路复用器4900由几个小多路复用器表示,这些小多路复用器标有相同的附图标记,以说明与绝对差元素的连接性。
[0388]
如前所述,除了vdsortxy[u]16h指令之外的排序指令对32位元素进行操作。图50说明在元素是32位量的情况下的绝对差元素的阵列的输入。两个相邻的16位比较被用于构造32位比较,例如,将32位元素(r0,r1)与(r2,r3)的一对半字的比较提供比较i0和i1所需的信息,其中i0和i1是由半字集合给出的32位量。“奇数”行中的相邻比较没有用,例如,(r0,r1)与(r1,r2)的比较没有任何意义,因为(r1,r2)具有r1中的i0的高半部分,并且具有r2中的i1的低半部分。奇数行被移除并替换为其他需要的比较。对应于每个标记行的三十二位元素被示出在紧接每个标记行下方的未标记行中。
[0389]
图51说明全局处理部件4400中的一个或多个排序指令的示例实施方式的框图。十六个比较器行5102、5104、5106(例如比较器逻辑)被配置为接收要经由相应多路复用器进行比较的矢量元素。每个比较器行5102、5104、5106是图49的sad逻辑中的绝对差元素行,例如,比较器行0 5102是行4500,比较器行1是行4510,等等。多路复用器被配置为针对16位元素根据图48选择相应比较器行5102、5104、5106的矢量元素,并且针对32位元素根据图50选
择相应比较器行5102、5104、5106的矢量元素。比较器行5102、5104、5106执行的比较的结果被提供给矢量排序逻辑,其包括计数器计算部件5107、置换控制生成部件5108和置换部件4410。
[0390]
计数器计算部件5107被配置为接收由比较器行5102、5104、5106执行的比较的结果并且使用这些结果来确定每个矢量元素的计数。在给定来自比较器行5102、5104、5106的比较结果的情况下确定每个矢量元素的计数在本文中先前参考图40和图41进行了描述。如本文先前所述,输入矢量元素的计数是输出矢量中的矢量元素的通道编号。
[0391]
置换控制生成部件5108被配置为基于为每个输入矢量元素识别的输出通道编号生成置换网络的控制输入。在给定通道编号的情况下生成控制输入在本文中先前参考图43进行了描述。置换控制生成部件5108还被配置为如果正在执行的排序指令是vsortpxxx指令,则输出控制输入作为输出矢量。置换控制生成部件5108还被配置为将控制输入和输入矢量提供给置换部件4410以用于其他排序指令。置换部件4410被配置为基于控制输入生成经排序的输出矢量。
[0392]
图52是可以由处理器(例如,处理单元核110)执行的用于对矢量进行排序的方法的流程图。在该方法中,矢量排序指令由处理器执行5200以从一矢量生成经排序的矢量,其中矢量的通道中的值按照矢量排序指令指示的顺序排序。然后将经排序的矢量存储5202在矢量排序指令指定的位置。本文前面描述了这种矢量排序指令的示例。
[0393]
图53是可以由处理器(例如,处理单元核心110)执行的用于对矢量进行排序的方法的流程图。在该方法中,矢量排序指令由处理器执行5300以从一个矢量生成排序后的矢量,其中该矢量的一部分通道中的值按照矢量排序指令指示的顺序排序,并且矢量的另一部分通道中的值按照矢量排序指令指示的顺序排序。然后将排序后的矢量存储5302在矢量排序指令指定的位置。本文前面描述了这种矢量排序指令的示例。
[0394]
图54是可以由处理器(例如,处理单元核心110)执行的用于对矢量进行排序的方法的流程图。在该方法中,矢量排序指令由处理器执行5400以基于矢量的通道中的值和矢量排序指令指示的矢量的排序顺序来生成矢量置换逻辑的控制输入矢量。然后将控制输入矢量存储5402在矢量排序指令指定的位置中。本文前面描述了这种矢量排序指令的示例。
[0395]
图55说明示例多处理器系统。在该示例中,soc 5500包括处理器100(图1)(称为“处理器a”)并且其与第二处理器5511(称为“处理器b”)组合。每个处理器经由总线5551耦连到一块共享的三级(l3)存储器5550。处理器b包括一块未共享的二级存储器5512。直接存储器访问(dma)引擎5560可以被编程为使用已知或后来开发的dma技术将数据/指令块从l3存储器转移到l2存储器130或l2存储器5512。各种类型的外围设备5562也耦连到存储器总线5551,诸如无线和/或有线通信控制器等。
[0396]
在该示例中,处理器a、处理器b、l3存储器5550都被包括在soc 5500中,可以使用已知或后来开发的封装技术将其包封以形成封装件,该封装件可以被安装到衬底上,诸如印刷电路板(pcb)上。例如,soc 5500可以被包封在球栅阵列(bga)封装件中。在该示例中,外部存储器接口(emi)5552允许处理器a和/或处理器b访问附加外部大容量存储器5554。
[0397]
在该示例中,处理器b是可以用于标量处理和控制功能的处理器。在其他示例中,各种类型的已知或后来开发的处理器可以与dsp 100组合。虽然在该示例中说明了两个处理器,但在另一个示例中,dsp 100的多个副本和/或处理器b的多个副本可以被包括
在soc内,其中dsp 100副本包括对本文描述的一个或多个矢量排序指令的支持。
[0398]
其他实施例
[0399]
虽然本说明书包括有限数量的实施例,但是可以设计不脱离本文描述的范围的其他实施例。
[0400]
例如,本文已经描述了其中矢量的两个半部独立排序的指令,例如,vdsortxy[u]16h。在其他示例中,矢量中的独立排序区域可以是不同的大小和/或可以存在多于两个的独立排序区域。
[0401]
在另一示例中,在本文中假设512位矢量和16位或32位元素/通道来描述排序指令的示例。在其他示例中,矢量可以更小或更大和/或元素的大小可以更大或更小。
[0402]
因此,所附权利要求将涵盖落入本说明书的真实范围内的实施例的任何此类修改。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献