CN111984318A - 伪先进先出(fifo)标签线替换 - Google Patents
伪先进先出(fifo)标签线替换 Download PDFInfo
- Publication number
- CN111984318A CN111984318A CN202010435337.0A CN202010435337A CN111984318A CN 111984318 A CN111984318 A CN 111984318A CN 202010435337 A CN202010435337 A CN 202010435337A CN 111984318 A CN111984318 A CN 111984318A
- Authority
- CN
- China
- Prior art keywords
- tag
- data
- stream
- tags
- unit
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 230000015654 memory Effects 0.000 claims abstract description 113
- 238000000034 method Methods 0.000 claims abstract description 47
- 241001522296 Erithacus rubecula Species 0.000 claims description 3
- 239000013598 vector Substances 0.000 description 244
- 210000004027 cell Anatomy 0.000 description 73
- 238000012545 processing Methods 0.000 description 56
- 239000000872 buffer Substances 0.000 description 42
- 235000019580 granularity Nutrition 0.000 description 22
- 101100385237 Mus musculus Creg1 gene Proteins 0.000 description 16
- 239000011159 matrix material Substances 0.000 description 14
- 238000000605 extraction Methods 0.000 description 13
- 230000008569 process Effects 0.000 description 13
- 238000010586 diagram Methods 0.000 description 12
- 239000000284 extract Substances 0.000 description 11
- 101100534231 Xenopus laevis src-b gene Proteins 0.000 description 10
- 101000773153 Homo sapiens Thioredoxin-like protein 4A Proteins 0.000 description 8
- 102100030272 Thioredoxin-like protein 4A Human genes 0.000 description 8
- 230000008859 change Effects 0.000 description 8
- 230000036961 partial effect Effects 0.000 description 8
- 230000009977 dual effect Effects 0.000 description 7
- 230000006870 function Effects 0.000 description 7
- 230000004044 response Effects 0.000 description 6
- 230000017105 transposition Effects 0.000 description 6
- 230000006399 behavior Effects 0.000 description 5
- 125000004122 cyclic group Chemical group 0.000 description 5
- 230000014759 maintenance of location Effects 0.000 description 5
- 238000012546 transfer Methods 0.000 description 5
- 230000001960 triggered effect Effects 0.000 description 5
- 101150008950 CBK1 gene Proteins 0.000 description 4
- 101100326161 Chlamydomonas reinhardtii BKT gene Proteins 0.000 description 4
- 230000003139 buffering effect Effects 0.000 description 4
- 238000004364 calculation method Methods 0.000 description 4
- 239000002131 composite material Substances 0.000 description 4
- 238000013500 data storage Methods 0.000 description 4
- 210000004457 myocytus nodalis Anatomy 0.000 description 4
- 230000002093 peripheral effect Effects 0.000 description 4
- 230000002441 reversible effect Effects 0.000 description 4
- 210000003771 C cell Anatomy 0.000 description 3
- 101000773151 Homo sapiens Thioredoxin-like protein 4B Proteins 0.000 description 3
- 101100063424 Neurospora crassa (strain ATCC 24698 / 74-OR23-1A / CBS 708.71 / DSM 1257 / FGSC 987) dim-5 gene Proteins 0.000 description 3
- 102100030273 Thioredoxin-like protein 4B Human genes 0.000 description 3
- 230000003247 decreasing effect Effects 0.000 description 3
- 239000008187 granular material Substances 0.000 description 3
- 239000000758 substrate Substances 0.000 description 3
- 230000007704 transition Effects 0.000 description 3
- 230000009286 beneficial effect Effects 0.000 description 2
- 230000008901 benefit Effects 0.000 description 2
- 238000004891 communication Methods 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 238000001914 filtration Methods 0.000 description 2
- 238000007667 floating Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000004806 packaging method and process Methods 0.000 description 2
- 230000002829 reductive effect Effects 0.000 description 2
- 238000012360 testing method Methods 0.000 description 2
- 238000013519 translation Methods 0.000 description 2
- 101100545272 Caenorhabditis elegans zif-1 gene Proteins 0.000 description 1
- 108091081062 Repeated sequence (DNA) Proteins 0.000 description 1
- 230000004913 activation Effects 0.000 description 1
- 239000008186 active pharmaceutical agent Substances 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000000903 blocking effect Effects 0.000 description 1
- 230000001351 cycling effect Effects 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000004069 differentiation Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 239000008393 encapsulating agent Substances 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000008014 freezing Effects 0.000 description 1
- 238000007710 freezing Methods 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 238000007726 management method Methods 0.000 description 1
- 229940050561 matrix product Drugs 0.000 description 1
- 238000004377 microelectronic Methods 0.000 description 1
- 239000003607 modifier Substances 0.000 description 1
- 238000012856 packing Methods 0.000 description 1
- 239000002245 particle Substances 0.000 description 1
- 238000010079 rubber tapping Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30007—Arrangements for executing specific machine instructions to perform operations on data operands
- G06F9/30036—Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/12—Replacement control
- G06F12/121—Replacement control using replacement algorithms
- G06F12/123—Replacement control using replacement algorithms with age lists, e.g. queue, most recently used [MRU] list or least recently used [LRU] list
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/06—Addressing a physical block of locations, e.g. base addressing, module addressing, memory dedication
- G06F12/0646—Configuration or reconfiguration
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/30105—Register structure
- G06F9/30112—Register structure comprising data of variable length
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3867—Concurrent instruction execution, e.g. pipeline or look ahead using instruction pipelines
- G06F9/3869—Implementation aspects, e.g. pipeline latches; pipeline synchronisation and clocking
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3885—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
- G06F9/3887—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1041—Resource optimization
- G06F2212/1044—Space efficiency improvement
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/60—Details of cache memory
- G06F2212/608—Details relating to cache mapping
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Mathematical Physics (AREA)
- Memory System Of A Hierarchy Structure (AREA)
- Advance Control (AREA)
Abstract
本申请题为“伪先进先出(FIFO)标签线替换”。本申请提供了一种方法,该方法包括在一个时钟周期期间针对可用标签线对包括在加标签的存储器系统中的标签组(4008)中的标签(4000)进行搜索,其中加标签的存储器系统包括具有相应的标签的多个标签线,并且其中这些标签被划分成多个不重叠的标签组,并且当在标签组中进行搜索未找到(4008)可用标签线时,在下一时钟周期期间针对可用标签线对多个标签组的下一标签组(4010)中的标签(4000)进行搜索。
Description
相关申请的交叉引用
本申请要求于2019年5月22日提交的美国临时专利申请号62/851,418的权益,其全部内容通过引用并入本文。
背景技术
数字信号处理器(DSP)被优化用于处理可从各种输入信号(诸如传感器数据、视频流、语音通道、雷达信号、生物医学信号等)导出的数据流。操作实时数据的数字信号处理器通常接收输入数据流、对数据流执行滤波功能(诸如编码或解码)并且输出经转换的数据流。该系统被称为实时的是因为如果经转换的数据流在被调度时对于输出不可用则应用失败。典型的视频编码需要可预测的但非时序的输入数据模式。典型的应用需要存储器访问加载数据寄存器文件(RF)中的数据寄存器,并且然后将来自数据寄存器的数据供应给执行数据处理的功能单元。
一个或多个DSP处理核可以与单个集成电路(IC)管芯上的各种外围电路、存储器块等进行组合,以形成片上系统(SoC)。这些系统可以包括多个互连的处理器,这些处理器共享片上和片外存储器的使用。处理器可以包括指令缓存器(ICache)和数据缓存器(DCache)的某种组合,以改善处理能力。此外,具有共享存储器的多个处理器可以被合并到单个嵌入式系统中。在不访问位于同一存储器位置的数据或不执行位于同一存储器位置的代码的情况下,处理器可以物理上共享同一存储器,或者处理器可以将共享存储器的某些部分用作公共共享存储器。
发明内容
本公开的实施例涉及用于伪FIFO标签线替换策略的方法和系统。在一个方面,提供了一种方法,该方法包括:在一个时钟周期期间,针对可用标签线对包括在加标签的存储器系统中的标签组中的标签进行搜索,其中加标签的存储器系统包括具有相应的标签的多个标签线,并且其中标签被划分成多个不重叠的标签组;以及当在标签组中进行搜索未找到可用标签线时,在下一时钟周期期间,针对可用标签线对多个标签组的下一标签组中的标签进行搜索。
在一个方面,提供了一种加标签的存储器系统,其包括:多个标签线;多个标签,其中每个标签与多个标签线中的相应的标签线相关联,并且多个标签被划分成不重叠的标签组;以及存储分派部件,其被配置为执行伪先进先出(FIFO)标签替换,其中在一个时钟周期期间,针对可用标签线对多个标签组中的标签组进行搜索,并且当在标签组中进行搜索未找到可用标签线时,在下一时钟周期期间,针对可用标签线对多个标签组中的下一标签组进行搜索。
在一个方面,提供了一种加标签的存储器系统,其包括:多个标签线;多个标签,其中每个标签与多个标签线中的相应的标签线相关联,并且多个标签被划分成不重叠的标签组;以及存储分派部件,其被配置为以轮循顺序对多个标签组的每个标签组进行搜索,直到定位到可用标签线或已搜索了所有标签组为止,其中搜索开始于包括与先前搜索中分派的标签线相关联的标签的标签组,并且其中在单个时钟周期中对每个搜索到的标签组进行搜索。
附图说明
图1说明示例成双的标量/矢量数据路径处理器;
图2说明图1中说明的成双的标量/矢量数据路径处理器中的寄存器和功能单元;
图3说明全局标量寄存器文件;
图4说明由算法功能单元共享的局部标量寄存器文件;
图5说明由乘法功能单元共享的局部标量寄存器文件;
图6说明由局部/存储单元共享的局部标量寄存器文件;
图7说明全局矢量寄存器文件;
图8说明断言寄存器文件;
图9说明由算法功能单元共享的局部矢量寄存器文件;
图10说明由乘法功能单元和相关功能单元共享的局部矢量寄存器文件;
图11说明处理单元的流水线阶段;
图12说明单个提取包的十六个指令;
图13说明指令编码的示例;
图14说明条件码扩展间隙(slot)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说明先进先出(FIFO)标签替换策略的示例;
图37-图39说明由示例流引擎使用的伪FIFO标签替换策略的示例;
图40是用于标签线替换的方法的流程图;
图41和图42是说明针对可用标签线进行优先级编码器搜索的示例;
图43是用于标签线替换的方法的流程图;
图44是说明针对两个可用标签线进行优先级编码器搜索的示例;以及
图45是多处理器系统的框图。
具体实施方式
为了一致性,各个附图中的相似元件由相似的附图标记表示。
数字信号处理器(DSP)被优化以处理可从各种输入信号(诸如传感器数据、视频流、语音通道、雷达信号、生物医学信号等)导出的数据流。存储器带宽和调度关系到对实时数据进行操作的数字信号处理器。本文描述了示例DSP处理核,其包括用于改善存储器带宽和数据调度的流引擎。
一个或多个DSP处理核可与单个集成电路(IC)管芯上的各种外围电路、存储器块等进行组合,以形成片上系统(SoC)。参见例如“66AK2Hx Multicore KeystoneTM System-on-Chips”,2013,其通过引用并入本文。
在本文描述的示例DSP核中,自主流引擎(SE)耦合到DSP。在此示例中,流引擎包括两个紧密耦合的功能块,这两个功能块可以同时管理两个数据流。在另一示例中,流引擎能够仅管理单个流,而在其他示例中,流引擎能够处理多于两个流。在每种情况下,对于每个流,流引擎包括地址生成级、数据格式化级以及用于等待处理器消耗的格式化数据的一些贮存器。在本文描述的示例中,地址是从算法导出的,这些算法可以涉及多维循环,每个维度均维持迭代计数。在一个示例中,流引擎支持六级嵌套迭代。在其他示例中,支持更多或更少的迭代级。
此外,在本文描述的示例中,流引擎将每个流的数据存储维持为每个都具有标签的间隙阵列。加标签的间隙在本文中也被称为标签线。流引擎使用标签来管理间隙中的数据的存储。更具体地,当从流接收到新数据时,流引擎应用伪先进先出(FIFO)替换策略来标识可用间隙。如本文中更详细地解释的,伪FIFO替换策略倾向于以FIFO顺序分派间隙,但是在特定的使用模式逆着FIFO顺序进行工作的情况下避免停顿(stalling)。
本文参考图1至图18详细描述示例DSP处理器。本文参考图19至图35详细描述能够使用六维嵌套循环来管理两个数据流的示例流引擎。本文参考图36至图44详细描述伪FIFO标签线替换策略的示例。
图1说明包括成双的标量/矢量数据路径115、117的示例处理器100。处理器100包括流引擎125,该流引擎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被形成在单个集成电路上。该单个集成电路可选地包括其他电路。
处理单元核110在指令提取单元111控制下从L1I缓存器121提取指令。指令提取单元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的硬件不参与该功能单元分配。在该示例中,指令分派单元12并行操作若干指令。这种并行指令的数量由执行包的尺寸设定。这在本文进一步描述。
指令分派单元112的分派任务的一部分是确定指令在标量数据路径侧A115中的功能单元上执行还是在矢量数据路径侧B116中的功能单元上执行。每个指令中被称为s位的指令位确定该指令控制哪个数据路径。这在本文进一步描述。
指令解码单元113对当前执行包中的每个指令解码。解码包括识别执行该指令的功能单元、从可能的寄存器文件(RF)中识别用于为相应的数据处理操作供应数据的寄存器以及识别相应的数据处理操作的结果的寄存器目的地。如下面进一步解释的,指令可以包括代替一个寄存器编号操作数字段的常量字段。该解码的结果是信号,这些信号用于控制目标功能单元以便对指定数据执行由相应的指令所指定的数据处理操作。
处理单元核110包括控制寄存器114。控制寄存器114存储用于控制标量数据路径侧A115和矢量数据路径侧B116中的功能单元的信息。该信息可以包括模式信息等。
来自指令解码器113的已解码的指令和存储在控制寄存器114中的信息被供应到标量数据路径侧A115和矢量数据路径侧B116。结果,标量数据路径侧A115和矢量数据路径侧B116中的功能单元根据指令指定的数据执行指令指定的数据处理操作并且将结果存储在一个或多个指令指定的数据寄存器中。标量数据路径侧A115和矢量数据路径侧B116中的每一个包括并行操作的多个功能单元。这些结合图2进一步描述。标量数据路径侧A115和矢量数据路径侧B116之间存在允许数据交换的数据路径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单向通到处理单元10。L2组合式缓存器130将指令经由总线142供应到L1I缓存器121。在该示例中,总线142是512位总线。总线142从L2组合式缓存器130单向通到L1I缓存器121。
L1D缓存器123与标量数据路径侧A115中的寄存器文件经由总线143交换数据。在该示例中,总线143是64位总线。L1D缓存器123与矢量数据路径侧B116中的寄存器文件经由总线144交换数据。在该示例中,总线144是512位总线。总线143和144被图示说明为双向支持处理单元核110数据读取和数据写入两者。L1D缓存器123与L2组合式缓存器130经由总线145交换数据。在该示例中,总线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供应到矢量数据路径侧B116的功能单元。在该示例中,总线147是512位总线。L2组合式缓存器130将第二数据流的数据经由总线148供应到流引擎125。在该示例中,总线148是512位总线。流引擎125将该第二数据流的数据经由总线149供应到矢量数据路径侧B116的功能单元,在该示例中,总线149是512位总线。根据该示例,总线146、147、148和149被图示说明为从L2组合式缓存器130单向通到流引擎125并且通到矢量数据路径侧B116。
在缓存命中之后(如果请求的数据存储在L2组合式缓存器130中),流引擎数据请求直接从L2组合式缓存器130提取。在缓存错失之后(指定的数据没有存储在L2组合式缓存器130中),从另一级缓存器(未图示说明)或从主存储器(未图示说明)寻找该数据。在一些示例中,L1D缓存器123缓存未存储在L2组合式缓存器130中的数据在技术上是可行的。如果支持该操作,则根据在L2组合式缓存器130中错失的流引擎数据请求,L2组合式缓存器130对于流引擎请求的数据监听L1D缓存器1233。如果L1D缓存器123存储该数据,则监听响应包括随后被供应以服务流引擎请求的数据。如果L1D缓存器123没有存储该数据,则监听响应指示此结果并且L2组合式缓存器130服务来自另一级缓存器(未图示说明)或来自主存储器(未图示说明)的该流引擎请求。
在该示例中,根据题为“Unified Memory System Architecture IncludingCache and Directly Addressable Static Random Access Memory”的美国专利号6,606,686,L1D缓存器123和L2组合式缓存器130两者都可以被配置为选定数量的缓存器或直接可寻址的存储器,该专利通过引用并入本文。
在该示例中,处理器100被制造在安装在球栅阵列(BGA)基板上的集成芯片(IC)上。BGA基板和IC管芯一起可以被称为“BGA封装件”、“IC封装件”、“集成电路”、“IC”、“芯片”、“微电子器件”或类似术语。BGA封装件可以包括包封材料,以覆盖和保护IC管芯免受损坏。在另一个示例中,其他类型的已知或以后开发的封装技术可以与处理器100一起使用。
图2进一步说明标量数据路径侧A115和矢量数据路径侧B116中的功能单元和寄存器文件的细节。标量数据路径侧A115包括L1单元211、S1单元222、M1单元223、N1单元224、D1单元225和D2单元226。标量数据路径侧A115包括全局标量寄存器文件(RF)211、L1/S1局部寄存器文件212、M1/N1局部寄存器文件213和D1/D2局部寄存器文件214。矢量数据路径侧B116包括L2单元241、S2单元242、M2单元243、N2单元244、C单元245和P单元246。矢量数据路径侧B116包括全局矢量寄存器文件231、L2/S2局部寄存器文件232、M2/N2/C局部寄存器文件233和断言寄存器文件214。在本文中更详细地描述在功能单元可以从哪个寄存器文件读取或者可以写入哪个寄存器文件。
标量数据路径侧A115包括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的指令指定的寄存器中。
标量数据路径侧A115包括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的指令指定的寄存器中。
标量数据路径侧A115包括M1单元223。M1单元223通常接受两个64位操作数并且产生一个64位结果。这两个操作数都是从全局标量寄存器文件211或M1/N1局部寄存器文件213中的指令指定的寄存器调用的。示例M1单元223执行的指令选择的操作的示例包括:8位、16位和32位乘法操作、Galois字段乘法、带有或不带有舍入的复杂乘法、IEEE浮点乘法操作、复杂的点积操作、32位计数操作、复杂的共轭乘法操作以及按位逻辑操作、移位、加和减。结果被写入全局标量寄存器文件211、L1/S1局部寄存器文件212、M1/N1局部寄存器文件213或D1/D2局部寄存器文件214的指令指定的寄存器中。
标量数据路径侧A115包括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的指令指定的寄存器中。
矢量数据路径侧B116包括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的指令指定的寄存器中。
矢量数据路径侧B116包括S2单元242。S2单元242通常接受两个512位操作数并且产生一个512位结果。这两个操作数都是从全局矢量寄存器文件231、L2/S2局部寄存器文件232或断言寄存器文件234中的指令指定的寄存器调用的。在该示例中,S2单元242与S1单元222类似地执行指令。结果被写入全局矢量寄存器文件231、L2/S2局部寄存器文件232、M2/N2/C局部寄存器文件233或断言寄存器文件234的指令指定的寄存器中。
矢量数据路径侧B116包括M2单元243。M2单元243通常接受两个512位操作数并且产生一个512位结果。这两个操作数都是从全局矢量寄存器文件231或M2/N2/C局部寄存器文件233中的指令指定的寄存器调用的。在该示例中,除了更宽的512位数据之外,M2单元243执行与M1单元222类似的指令。结果被写入全局矢量寄存器文件231、L2/S2局部寄存器文件232或M2/N2/C局部寄存器文件233的指令指定的寄存器中。
矢量数据路径侧B116包括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的指令指定的寄存器中。
矢量数据路径侧B116包括相关(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用于存储伽罗瓦(Galois)域乘法操作(GFMPY)的多项式,并且控制寄存器CUCR1用于存储伽罗瓦域多项式发生器函数。
矢量数据路径侧B116包括P单元246。矢量断言(P)单元246在局部断言寄存器文件234的寄存器上执行基础逻辑操作。P单元246具有从断言寄存器文件234读取和对断言寄存器文件234写入的直接访问权。该逻辑操作包括单寄存器一元操作,诸如:NEG(否定),其将单个寄存器的每个位反转;BITCNT(位计数),其返回单个寄存器中具有预定数字状态(1或0)的位的数量的计数;RMBD(最右位检测),其返回从最低有效位位置(最右)到具有预定数字状态(1或0)的第一位位置的位位置的数量;DECIMATE,其选择待输出的每个指令指定的第N(第1、第2、第4等)位;以及EXPAND,其将每个位重复指令指定的N次(2、4等)。该逻辑操作还包括双寄存器二元操作,诸如:AND,其将两个寄存器的数据按位取“与”;NAND,其将两个寄存器的数据按位取“与”和“非”;OR,其将两个寄存器的数据按位取“或”;NOR,其将两个寄存器的数据按位取“或”和“非”;以及XOR,其对两个寄存器的数据取“异或”。该逻辑操作包括将数据从断言寄存器文件234的断言寄存器转移到另一个指定断言寄存器或转移到全局矢量寄存器文件231中的指定数据寄存器。P单元246的一个用途是用于控制进一步SIMD矢量操作的SIMD矢量比较结果的操纵。BITCNT指令可以用于对断言寄存器中“1”的数量进行计数以确定来自断言寄存器的有效数据元素的数量。
图3说明全局标量寄存器文件211。存在16个独立的64位宽标量寄存器,其标记为A0-A15。全局标量寄存器文件211的每个寄存器可以被读取或写入作为64位的标量数据。所有的标量数据路径侧A115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元226)可以对全局标量寄存器文件211读取或写入。全局标量寄存器文件211可以被读取为32位或读取为64位并且被写入为64位。指令的执行确定读取数据的尺寸。矢量数据路径侧B116功能单元(L2单元241、S2单元242、M2单元243、N2单元244、C单元245和P单元246)可以在下面描述的限制条件下经由交叉路径117从全局标量寄存器文件211读取。
图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中的数据可以包括用于地址计算的基础地址和偏移地址。
图5说明L1/S1局部寄存器文件212。在该示例中,L1/S1局部寄存器文件212包括八个独立的64位宽的标量寄存器,其标记为AL0-AL7。在该示例中,指令编码允许L1/S1局部寄存器文件212包括高达16个寄存器。在该示例中,实施八个寄存器以降低电路尺寸和复杂性。L1/S1局部寄存器文件212的每个寄存器可以被读取或写入作为64位的标量数据。所有的标量数据路径侧A115功能单元(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。在该示例中,实施八个独立的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读取。
图7说明全局矢量寄存器文件231。存在十六个独立的512位宽的矢量寄存器。全局矢量寄存器文件231的每个寄存器可以被读取或写入作为64位的标量数据,标记为B0-B15。指令类型确定数据尺寸。所有的矢量数据路径侧B116功能单元(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读取。
图8说明断言(P)局部寄存器文件234。存了八个独立的64位宽的寄存器,其标记为P0-P7。P局部寄存器文件234的每个寄存器可以被读取或写入作为64位的标量数据。矢量数据路径侧B116功能单元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矢量操作。
图9说明L2/S2局部寄存器文件232。在该示例中,实施八个独立的512位宽的矢量寄存器。在该示例中的指令编码允许L2/S2局部寄存器文件232包括高达十六个寄存器。在该示例中,实施八个寄存器以降低电路尺寸和复杂性。L2/S2局部矢量寄存器文件232的每个寄存器可以被读取或写入作为64位的标量数据,标记为BL0-BL7。L2/S2局部矢量寄存器文件232的每个寄存器可以被读取或写入作为512位的矢量数据,标记为VBL0-VBL7。指令类型确定数据尺寸。所有的矢量数据路径侧B116功能单元(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。在该示例中,实施八个独立的512位宽的矢量寄存器。在该示例中。指令编码允许M2/N2/C局部寄存器文件233包括高达十六个寄存器。在该示例中,实施八个寄存器以降低电路尺寸和复杂性。M2/N2/C局部矢量寄存器文件233的每个寄存器可以被读取或写入作为64位的标量数据,标记为BM0-BM7。M2/N2/C局部矢量寄存器文件233的每个寄存器可以被读取或写入作为512位的矢量数据,标记为VML0-VML7。所有的矢量数据路径侧B116功能单元(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读取。
对由一侧的所有功能区可访问的全局寄存器文件和由一侧的一些功能单元可访问的局部寄存器文件的规定是设计选择。在另一个示例中,可以做出不同的可访问性规定,诸如采用对应于本文所述的全局寄存器文件的一类寄存器文件。
交叉路径117允许标量数据路径侧A115和矢量数据路径侧B116之间的有限数据交换。在每个操作周期期间,一个64位数据字可以被从全局标量寄存器文件A 211调用以用作矢量数据路径侧B116的一个或多个功能单元的操作数,并且一个64位数据字可以被从全局矢量寄存器文件231调用以用作标量数据路径侧A 115的一个或多个功能单元的操作数。任何标量数据路径侧A 115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元226)都可以从全局矢量寄存器文件231读取64位操作数。该64位操作数是全局矢量寄存器文件231的访问的寄存器中的512位数据的最低有效位。多个标量数据路径侧A115功能单元可以采用与相同操作周期期间的操作数相同的64位交叉路径数据。然而,在单个操作周期中,单个64位操作数被从矢量数据路径侧B116转移到标量数据路径侧A 115。任何矢量数据路径侧B116(L2单元241、S2单元242、M2单元243、N2单元244、C单元245和P单元246)都可以从全局标量寄存器文件211读取64位操作数。如果相应的指令是标量指令,则交叉路径操作数数据被视为64位操作数。如果相应的指令是矢量指令,则操作数的高448位由零填充。多个矢量数据路径侧B116功能单元可以采用与相同操作周期期间的操作数相同的64位交叉路径数据。在一个示例中,在任何单个操作周期中,单个64位操作数被从标量数据路径侧A 115转移到矢量数据路径侧B116。
流引擎125(图1)在某些受限的情况下传输数据。流引擎125控制两个数据流。一个流包括特定类型的元素序列。对这些流进行操作的程序顺序读取数据,进而在每个元素上操作。每个流具有下列基本属性:流数据具有良好定义的开始时间和结束时间;在整个流中,流数据具有固定的元素尺寸和类型;以及流数据具有固定的元素序列。一旦流被打开,则流引擎125执行以下操作:计算地址;从L2统一缓存器130(其可能需要来自更高级的存储器的缓存服务,例如在L2中缓存错失的情况下)提取所定义的数据类型;执行数据类型操纵,诸如零扩展、符号扩展、数据元素整理/调换(诸如矩阵转置);以及将数据直接传送到处理器核110中的程序化数据寄存器文件。因此,流引擎125有益于对表现良好的数据的实时数字滤波操作。流引擎125从这些存储器提取任务释放相应的处理器,从而使能其他处理功能。
流引擎125提供若干益处。例如,流引擎125允许多维存储器访问,增加功能单元的可用带宽,由于流缓冲器旁通L1D缓存器123而使缓存错失拖延(stalls)的数量最小化,以及降低维持循环所需要的标量操作的数量。流引擎125还管理地址指针,并且处理释放用于其他计算的地址生成指令间隙(slot)以及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期间,处理器寄存该提取包。
在包括十六个32位宽的字的提取包中提取指令。图12说明单个提取包的十六个指令1201-1216。提取包在512位(16字)边界上对准。该示例采用固定的32位指令长度,其使得解码器容易对准。恰当对准的指令提取可以将多个指令加载到并行指令解码器中。当预定指令对准存储在与固定指令包提取耦连的存储器(通过使提取包在512位边界上对准)中时,预定指令对准可以获得这种恰当对准的指令提取。相反地,可变长度的指令需要在解码之前定位每个指令边界的初始步骤。固定长度指令集通常允许更规则的指令字段的布局,这简化每个解码器的结构,有益于宽发布(wide issue)VLIW处理器。
个体指令的执行由每个指令中的p位部分地控制。在该示例中,该p位是32位宽的间隙的位0。p位确定指令是否与下一个指令并行执行。在该示例中,从较低地址到较高地址扫描指令。如果指令的p位是1,则下一个跟随的指令(较高存储器地址)与该指令并行执行(与该指令在同一个周期内)。如果指令的p位是0,则下一个跟随的指令在该指令之后的周期内被执行。
处理器核110(图1)和L1I缓存器121流水线(图1)相互解耦。从L1I缓存器返回的提取包可以采用不同数量的时钟周期,这取决于外部情况,诸如是否在L1I缓存器121中命中或在L2组合式缓存器130中命中。因此程序访问级1112可以采用几个时钟周期来代替如在其他级中的一个时钟周期。
并行执行的指令组成执行包。在该示例中,执行包可以包括用于十六个指令的高达十六个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)条件码扩展。这些间隙类型中的一些在本文进一步解释。
分派和解码阶段1120(图11)包括指令分派到适当执行单元(DS)级1121;指令预解码(DC1)级1122;以及指令解码及操作数读取(DC2)级1222。在指令分派到适当执行单元级1121期间,提取包被划分成执行包中并且分配给合适的功能单元。在指令预解码级1122期间,源寄存器、目的地寄存器和相关联的路径被解码用于执行功能单元中的指令。在指令解码及操作数读取级1223期间,执行更加详细的单元解码,并且从寄存器文件读取操作数。
执行阶段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说明处理单元核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)中的一个的操作。
在图13的示例中,dst字段1301指定相应寄存器文件中的寄存器作为指令结果的目的地。src2/cst字段1302具有几个含义,其取决于指令操作码字段1304和单元字段1305。一个含义指定相应寄存器文件的寄存器作为第二操作数。另一个含义是直接常量。根据指令类型,字段1302被视为扩展到指定数据长度的无符号整数和零或者视为扩展到指定数据长度的有符号整数和符号。
src1字段1303指定相应的寄存器文件中的寄存器作为第一源操作数。操作码字段1304指定指令的类型。单元字段1305结合侧位1306指示功能单元中的哪一个用于执行指令。除下面描述的指令选项外,操作码的详细解释超出本描述的范围。
s位1306指明标量数据路径侧A 115或矢量数据路径侧B116。如果s=0,则选择标量数据路径侧A 115,这将功能单元限制到图2中图示说明的L1单元221、S1单元222、M1单元223、N1单元224、D1单元225、D2单元226以及相应的寄存器文件。类似地,s=1选择矢量数据路径侧B116,其将功能单元限制到图2中图示说明的L2单元241、S2单元242、M2单元243、N2单元244、P单元246以及相应的寄存器文件。
p位1307标记执行包。p位确定该指令是否与随后的指令并行执行。从较低地址到较高地址扫描p位。如果对于当前指令p=1,则下一个指令与当前指令并行执行。如果对于当前指令p=0,则下一个指令在当前指令之后的周期中执行。并行执行的所有指令组成执行包。执行包可以包含高达十六个指令。执行包中的每个指令使用不同的功能单元。
处理单元核110的大多数指令不包括用于条件执行的直接编码。然而,可以将指令变为有条件的。将指令变为有条件的动作被称为断言(predication),并且存储该条件的寄存器被称为断言寄存器(predicate register)。执行包可以包括两个32位条件码扩展间隙,这些间隙对同一执行包中的指令的4位条件信息进行编码。在本文中,将这些条件码间隙称为条件码扩展间隙0和条件码扩展间隙1,并将4位条件信息称为creg/z字段。
表1示出了creg/z字段的编码。creg位标识断言寄存器,并且z位指示断言是否基于断言寄存器中的零或非零。条件指令的执行取决于存储在指定数据寄存器中的值。如果z=1,则测试是针对等于零的,如果z=0,则测试是针对非零的。creg=0并且z=0的情况被视为正确以允许无条件指令执行。注意z位栏中的“z”指的是上面提到的零/非零比较选择并且“x”是不关心状态。
表1
图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单元226指令的四个creg/z位,字段1407是未使用的/保留的,并且字段1408被编码为一组独特位(CCEX0)以识别条件码扩展间隙0。当检测到条件码扩展间隙0的该独特ID时,采用creg/z位来控制同一执行包中的任意相应的L1单元221、L2单元241、S1单元222、S2单元242、D1单元225、D2单元226指令的条件执行。注意,恰当编码的条件码扩展间隙0可以使得执行包中的一些指令是有条件的并且一些指令是无条件的。
图15说明用于条件码扩展间隙1 1501的编码。字段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指令的条件执行。
再次参考图13,在一些指令中,可以对操作码字段1304中的称为常量扩展位的位进行编码,以指示src2/CST字段1302中的常量将被扩展。执行包可以包括两个32位常量扩展间隙,每个32位常量扩展间隙可以存储27位,这27位与字段1302中的5位常量串接(concatenated)为高阶位以形成32位常量。图16说明常量扩展间隙0 1600的字段。字段1601存储扩展的32位常量的27个最高有效位。字段1602被编码一组独特位(CSTX0)以识别常量扩展间隙0。在该示例中,常量扩展间隙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指令中的一个的常量。
以如下方式使用常量扩展间隙0和常量扩展间隙1。指令解码器113根据指令操作码位确定常量在字段1302中,称为直接字段,并且确定该常量是否要从操作码字段130中先前提到的常量扩展位扩展。如果指令解码器113检测到常量扩展间隙0或常量扩展间隙1,则指令解码器113为对应于检测到的常量扩展间隙的指令检查该执行包内的指令。如果一个相应指令具有等于1的常量扩展位,则进行常量扩展。
图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的输入。
符号扩展单元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)。
表2列出用于各种选项的符号扩展单元1703的操作。
表2
如上面结合图13所描述的,常量扩展间隙0和常量扩展间隙1两者都可以包括p位以定义执行包。在该示例中,如在条件码扩展间隙的情况中,常量扩展间隙0和常量扩展间隙1具有被编码为1的位0(p位)。因此,常量扩展间隙0和常量扩展间隙1都不可以在执行包的最后一个指令间隙中。
执行包可以包括常量扩展间隙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确定这种情况是无效操作并且不被支持。替代地,该组合可以由施加到标记为常量扩展的每个相应功能单元指令的常量扩展间隙的扩展位支持。
L1单元221、S1单元222、L2单元241、S2单元242和C单元245通常以单指令多数据(SIMD)模式进行操作。在该SIMD模式中,相同的指令被施加到来自两个操作数的打包数据。每个操作数保持设置在预定间隙中的多个数据元素。SIMD操作通过在数据边界处的进位控制来启用。这种进位控制使能对变化的数据宽度进行的操作。
图18说明进位控制逻辑。与门1801接收操作数宽度的算法逻辑单元(对于标量数据路径侧A115功能单元是64位,并且对于矢量数据路径侧B116功能单元是512位)内的位N的进位输出。与门1801还接收在下面进一步解释的进位控制信号。与门1801的输出被供应到操作数宽度的算法逻辑单元的位N+1的进位输入。与门(诸如与门1801)被设置在可能的数据边界处的每一对数位之间。例如,对于8位数据,这种与门将在位7和位8、位15和位16、位23和位24等之间。每一个这种与门接收相应的进位控制信号。如果数据尺寸是最小尺寸,则每个进位控制信号是0,从而有效地阻挡相邻位之间的进位传输。如果选择的数据尺寸需要两个算法逻辑单元区段,则相应的进位控制信号是1。下面的表3示出如矢量数据路径侧B116功能单元所使用的512位宽的操作数的情况下的示例进位控制信号,其可以被划分成8位区段、16位区段、62位区段、64位区段、128位区段或256位区段。在表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位)数据。在这些指令类型的第一类型中,功能单元(L2单元241或S2单元242)对两个通用数据寄存器中的打包数据执行SIMD比较并且将结果供应到断言数据寄存器。指令指定数据尺寸、两个通用数据寄存器操作数和目的地断言寄存器。在该示例中,每个断言数据寄存器包括对应于通用数据寄存器的每个最小数据尺寸部分的一个位。在当前示例中,通用数据寄存器是512位(64字节)并且断言数据寄存器是64位(8字节)。断言数据寄存器的每个位对应于通用数据寄存器的八个位。在指定的数据尺寸(8、16、32、64、128或256位)上执行比较。如果比较为真,则功能单元将“1”供应到对应于该数据尺寸部分的所有断言寄存器位。如果比较为假,则功能单元将零供应到对应于该数据尺寸部分的断言寄存器位。在该示例中,启用的比较操作包括:“小于”、“大于”以及“等于”。
在该指令类型的第二类型中,功能单元(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单元ENG功能可以用于:将小于比较结果转换成大于或等于比较结果,将大于比较结果转换成小于或等于比较结果,或者将等于比较结果转换成不等于比较结果。
流引擎
图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列出基础流的寻址参数。在该示例中,ELEM_BYTES的范围是从1到64字节,如表5所示。
表4
表5
上面的定义将流的连续元素映射到存储器中的增加的地址,这适用于多种算法。一些算法通过以降低的存储器地址或反向流寻址的方式读取元素来更好的服务。例如,离散卷积计算矢量点积,如下式给出:
其中f[]和g[]表示存储器中的阵列。对于每个输出,算法以正向方向读取f[],并且以反向方向读取g[]。实际的滤波器将[x]和[t-x]的指数范围限制到有限数量的元素。为了支持这种模式,流引擎支持以降低的地址顺序读取元素。
矩阵乘法运算对流引擎提出了独特的问题。矩阵乘积中的每个元素是来自第一矩阵的行与来自第二矩阵的列之间的矢量点积。程序通常以行主序或列主序存储矩阵。行主序将单个行的所有元素连续存储在存储器中。列主序将单个列的所有元素连续存储在存储器中。矩阵通常以与语言的默认阵列顺序相同的顺序存储。作为结果,矩阵乘法运算中的两个矩阵中只有一个映射到流引擎的2维流定义。在典型的示例中,索引逐步通过一个阵列上的列和另一阵列上的行。流引擎用转置的流来支持隐式矩阵转置。转置的流避免在存储器中明确转换数据的成本。代替以严格连续元素顺序访问数据,流引擎以横向顺序有效交换内部两个循环维度,沿第二维度将元素提取到连续矢量通道中。
该算法能够起作用,但是对于小元素尺寸的实施是不切实际的。一些算法工作于多个列和行在一起的矩阵拼接。因此,流引擎定义单独的转置粒度。硬件规定最小的粒度。转置粒度需要至少是与元素尺寸一样大的。转置粒度导致流引擎在沿维度1移动之前从维度0提取一个或多个连续元素。当粒度等于元素尺寸时,从行主序阵列提取单个列。否则,粒度指定每次从行主序阵列提取两个、四个或更多个列。通过交换该描述中的行和列,这也适用于列主序布局。参数GRANULE指示以字节为单位的转置粒度。
另一种常见矩阵乘法运算技术交换矩阵乘法的最里面的两个循环。当横穿另一个矩阵的行读取时,生成的内部循环不再向下读取一个矩阵的列。例如,该算法可以将一项提升到内部循环以外,用标量值将其代替。最内部循环可以通过在单个标量与矢量相乘之后进行矢量求和来实现。或者,标量值可以在矢量的整个长度上复制,并且使用矢量与矢量相乘。该示例的流引擎用元素重复模式直接支持后一情况和相关的使用模式。在该模式中,流引擎读取比全矢量尺寸更小的颗粒/粒集(granule)并且复制该颗粒以填充下一个矢量输出。
流引擎将每个复数处理为具有两个子元素的单个元素,其给出了复数的实部和虚部(直角坐标)或量值部分和角度部分(极坐标)。不是所有的程序或外围设备都与这些子元素应该存在于存储器中的顺序一致。因此,流引擎提供了无成本互换复数的两个子元素的能力。该特征互换元素的一半而不解释元素的内容并且可以用于互换任意类型的子元素对,而不仅仅是复数。
算法通常优选以高精度工作,但是高精度值比较低精度值需要更多的存储设备和带宽。通常,程序在存储器中以低精度存储数据,将这些值提升到较高精度以便计算,然后将这些值降低到较低精度以便存储。流引擎通过允许算法指定一种类型提升水平来直接支持这种操作。在该示例中,每个子元素可以以整数类型的符号扩展或零扩展被提升到较大类型尺寸。在一些示例中,流引擎支持浮点提升,其分别将16位和32位浮点值提升到32位和64位格式。
流引擎将流定义为数据元素的离散序列,处理单元核110消耗连续打包成矢量的数据元素。矢量类似于流,因为矢量包含多个同类元素和一些隐式序列。因为流引擎读取流,但是处理单元核110消耗矢量,因此流引擎以一致的方式将流映射到矢量上。
矢量包括相同尺寸的通道(lane),每个通道包含子元素。处理单元核110将矢量的最右边的通道指示为通道0,而不管当前端字节序(endian)模式如何。通道编号从右到左递增。矢量内的通道的实际数量根据矢量的长度和子元素的数据尺寸变化。
图20说明格式化器1903的格式化操作的序列。格式化器1903包括三个区段:输入区段2010;格式化区段2020;和输出区段2030。输入区段2010接收从由流地址生成器1901访问的系统存储器1910调用的数据。该数据可以通过线性提取流2011或转置提取流2012来实现。
格式化区段2020包括各种格式化块。在格式化器1903内通过这些块执行的格式化在下面进一步描述。复数互换块2021可选地将形成复数元素的两个子元素互换。类型提升块2022可选地将每个数据元素提升到更大数据尺寸。提升包括用于无符号整数的零扩展和用于有符号整数的符号扩展。抽取(decimation)块2023可选地抽取数据元素。在该示例中,抽取可以是2:1即每隔另一个数据元素保留一个,或者是4:1即每四个数据元素保留一个。元素重复块2024可选地使个体数据元素重复。在该示例中,该数据元素重复是2的整数幂(2N,其中N是整数),包括2倍、4倍、8倍、16倍、32倍和64倍。在该示例中,数据重复可以在多个目的地矢量上扩展。矢量长度掩码/组重复块2025具有两个主功能。独立指定的矢量长度VECLEN控制供应到每个输出数据矢量的数据元素。当组重复关闭时,输出数据矢量中的过量通道被零填充并且这些通道被标记为无效。当组重复开启时,指定的矢量长度的输入数据元素被重复以填充输出数据矢量。
输出区段2030保持数据以用于输出到相应的功能单元。用于处理器2031的寄存器和缓冲器存储将被处理单元核110(图1)的功能单元用作操作数的格式化数据矢量。
图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。
图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。
流引擎将最里面的流维度直接映射到矢量通道。流引擎将最里面的流维度内的靠前的元素映射到较低的通道编号并且将靠后的元素映射到较高的通道编号,无论该流以增加地址顺序提前还是以减小地址顺序提前。无论流如何定义顺序,流引擎以增加通道的顺序将元素存放到矢量中。对于非复合数据,流引擎将第一元素放置在处理单元核110(图1)提取的矢量的通道0中,将第二元素放在通道1中,以此类推。对于复合数据,流引擎将第一元素放置在通道0和通道1中,将第二元素放置在通道2和通道3中,以此类推。不管流方向如何,元素内的子元素保持相同的相对顺序。对于非互换的复合元素,每对中具有较低地址的子元素被放置在偶数编号的通道中,并且每对中具有较高地址的子元素被放置在奇数编号的通道中。对于互换的复合元素,放置被反转。
流引擎用处理单元核110从最内部流维度所能提取的尽可能多的元素填充CPU提取的每个矢量。如果最内部维度不是矢量长度的倍数,则流引擎填充零以将该维度拉长到多倍矢量长度。如在下面记载的,流引擎将这些通道标记为无效。因此对于较高维度的流,来自外部维度的每次迭代的第一元素抵达矢量的通道0。流引擎将最内部维度映射到矢量中的连续通道。对于转置的流,如果转置交换了维度1和维度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维度2311中的迭代计数是九,并且1维度2322中的迭代计数是十三。注意ELEM_BYTES缩放最内部维度。第一维度具有ELEM_BYTES尺寸的ICNT0元素。流地址生成器不缩放外部维度。因此,DIM1=88,其是十一个元素,其中每个元素被缩放八个字节。
图24说明图23的示例流内的元素的顺序。流引擎以图示为顺序2400的顺序提取该流的元素。前九个元素来自矩阵2320的第一行,从左到右为跃程(hop)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说明流引擎如何提取图25的示例流中具有四字节转置粒度的流。提取模式2600从每个行提取元素对(因为值为四的粒度是值为二的ELEM_BYTES的两倍),但是除此之外向下移动各列。一旦流引擎到达一对列的底部,流引擎用下一对列重复该模式。
图27说明流引擎如何提取图25的示例流中具有八字节转置粒度的流。整体结构保持相同。如提取模式2700所示,流引擎从每一行提取四个元素(因为值为八的粒度是值为二的ELEM_BYTES的四倍),随后在列上移动到下一行。
迄今为止检查的流从存储器恰好读取每个元素一次。流可以从存储器读取给定元素多次,实际上在一部分存储器上循环。FIR滤波器表现出两个常见的循环模式:重新读取每个输出的相同的滤波分接,以及从滑动窗口读取输入样品。两个连续的输出需要来自两个重叠窗口的输入。
图28说明图1的流引擎125的细节。流引擎125包含三个主区段:流0 2810;流12820;以及共享的L2接口2830。流0 2810和流1 2820两者都包含并行操作的相同硬件。流02810和流1 2820两者共享L2接口2830。每个流2810和2820以每周期具有高达512位/周期的速率提供处理单元核110(图1)数据,这通过专用流路径和共享的成双L2接口来使能。
每个流引擎125包括相应的专用的6维(6D)流地址生成器2811/2821,其每一个可以每周期产生一个新的非对准请求。如本文进一步描述的,地址生成器2811/2821输出与由流参数定义的序列中的元素重叠的512位对准地址。
每个地址生成器2811/2821连接到相应的专用微工作台后援缓冲器(μTLB)2812/2822。μTLB 2812/2822每个周期将单个48位虚拟地址转换为44位物理地址。每个μTLB2812/2822具有8个条目,其覆盖具有4KB页的最小32KB或具有2MB页的最大16MB。每个地址生成器2811/2811每周期产生两个地址。μTLB 2812/2822每周期仅转化一个地址。为了保持吞吐量,流引擎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
当地址生成器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个间隙,其中每个间隙由先前描述的元数据加标签。每个间隙在八字节的八个块中持有64个字节的数据。
数据贮存器2816/2826以及相应的存储分派/跟踪逻辑2814/2824和引用队列2815/2825实现了参照图19讨论的数据FIFO 1902。
相应的蝴蝶网络/蝶形网络(Butterfly network)2817/2827包括实现格式化器1903(图19、图20)的七级蝴蝶网络。蝴蝶网络2817/2827接收128字节的输入并且产生64字节的输出。该蝴蝶网络的第一级实际是半级,其收集来自匹配未对准提取的两个间隙的字节并且将收集的字节合并为单个旋转的64字节阵列。剩余的六级形成标准的蝴蝶网络。相应的蝴蝶网络2817/2827执行以下操作:将下一个元素向下旋转到字节通道0;如果被请求,则以二次幂提升数据类型;如果被请求,则将复数的实部和虚部互换;并且如果处理单元核110目前处于大端字节序(endian)模式,将大端字节序转换为小端字节序。用户指定元素尺寸、类型提升以及实/虚互换作为流的参数的一部分。
流引擎125尝试在处理单元核110的需求之前提取并格式化该数据,以便维持充足的吞吐量。相应的流头寄存器2818/2828提供少量的缓冲,使得该过程保留充足的流水线化。相应的流头寄存器2818/2828在架构上不是直接可见的。每个流还具有相应的流有效寄存器2819/2829。有效寄存器2819/2829指示相应的流头寄存器2818/2828中的哪个元素有效。
两个流2810/2820共享一对独立的L2接口2830:L2接口A(IFA)2833和L2接口B(IFB)2834。对于1024位/周期的聚合带宽,每个L2接口经由相应的总线147/149直接向L2控制器130(图1)提供512位/周期的吞吐量。L2接口使用基于信用的多核总线架构(MBA)协议。在题为“Multicore Bus Architecture with Non-Blocking High PerformanceTransaction Credit System”的美国专利9,904,645更详细地描述MBA协议,该专利通过引用并入本文。L2控制器为每个接口分配命令信用池(pool of command credits)。当读取L2RAM、L2缓存器和多核共享存储器控制器(MSMC)存储器(如本文更详细地描述的)时,该池具有足够的信用以使得每个接口可以发送足够的请求来获得充足的回读(read-return)带宽。
为了使性能最大化,在该示例中,两个流都可以使用这两个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示出流模板的流字段定义。
字段名 | 图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 |
表7
循环0是最里面的循环并且循环5是最外面的循环。在当前示例中,DIM0等于物理定义连续数据的ELEM_BYTES。因此流模板寄存器2900没有定义DIM0。流引擎125将迭代计数解释为无符号整数并且将维度解释为无缩放的有符号整数。在任一级处的为零的迭代计数(ICNT0、ICNT1、ICNT2、ICNT3、ICNT4或ICNT5)指示空流。每个迭代计数必须至少是一以定义有效流。上述模板指定元素的类型、流的长度和维度。流指令分别指定起始地址。例如由存储该起始地址的标量寄存器文件211中的标量寄存器来规范。因此程序可以使用相同的模板(但是存储开始地址的寄存器不同)打开多个流。
图30说明图29示出的标识字段2911的子字段定义的示例。如图30中示出的,标识字段2911是6字节或48位。图30示出字段的位数量。表8示出这些字段的定义。
表8
元素类型(ELTYPE)字段3001定义流中的元素的数据类型。ELTYPE字段3001的四位的编码如表9所示来定义。
表9
实数/复数类型确定流引擎是否将每个元素视为实数或复数的两个部分(实部/虚部或者量值/角度),并且还指定是否互换复数的两个部分。复数类型具有两倍于子元素尺寸的总元素尺寸。否则,子元素尺寸等于总元素尺寸。
子元素尺寸以类型提升和矢量通道宽度为目的确定类型。例如,当流请求类型提升时,16位子元素被提升为32位子元素或64位子元素。由于核110以小端字节序顺序列出矢量,因此当处理单元核110(图1)以大端字节序模式操作时,矢量通道宽度是重要的。
总元素尺寸指定流的最小粒度,其为最内部循环的每个迭代确定流提取的字节数量。流读取完整的元素,或者以递增顺序或者以递减顺序。因此,流的最内部维度跨过ICNT0×总元素尺寸的字节。
“转置(TRANSPOSE)”字段3002确定流引擎是否以转置的顺序访问流。转置的顺序交换内部的两个寻址级。TRANSPOSE字段3002还指示用于转置该流的粒度。TRANSPOSE字段3002的三位的编码被定义为如表10所示以用于正常2D操作。
转置 | 含义 |
000 | 转置禁用 |
001 | 在8位边界上转置 |
010 | 在16位边界上转置 |
011 | 在32位边界上转置 |
100 | 在64位边界上转置 |
101 | 在128位边界上转置 |
110 | 在256位边界上转置 |
111 | 保留 |
表10
流引擎125实际可以以与元素尺寸不同的粒度对数据元素进行转置,因此允许程序从每行提取多列元素。转置粒度不可以小于元素尺寸。TRANSPOSE字段3002以在下文中进一步描述的方式与DIMFMT字段3009交互。
“提升(PROMOTE)”字段3003控制流引擎是否提升流中的子元素以及提升的类型。当被启用时,流引擎125以2的幂数的尺寸提升类型。PROMOTE字段3003的三位的编码如表11所示来定义。
表11
当PROMOTE为000时,其对应于1倍提升,每个子元素不改变并且占用宽度等于由ELTYPE指定的尺寸的矢量通道。当PROMOTE为001时,对应于2倍提升和零扩展,每个子元素被视为无符号整数并且被零扩展到两倍于由ELTYPE指定的宽度的矢量通道。2倍提升对于64位的初始子元素尺寸是无效的。当PROMOTE为010时,对应于4倍提升和零扩展,每个子元素被视为无符号整数并且被零扩展到四倍于由ELTYPE指定的宽度的矢量通道。4倍提升对于32位或64位的初始子元素尺寸是无效的。当PROMOTE为011时,对应于8倍提升和零扩展,每个子元素被视为无符号整数并且被零扩展到八倍于由ELTYPE指定的宽度的矢量通道。8倍提升对于16位、32位或64位的初始子元素尺寸是无效的。当PROMOTE为101时,对应于2倍提升和符号扩展,每个子元素被视为有符号整数并且被符号扩展到两倍于由ELTYPE指定的宽度的矢量通道。2倍提升对于64位的初始子元素尺寸是无效的。当PROMOTE为110时,对应于4倍提升和符号扩展,每个子元素被视为有符号整数并且被符号扩展到四倍于由ELTYPE指定的宽度的矢量通道。4倍提升对于32位或64位的初始子元素尺寸是无效的。当PROMOTE为111时,对应于对应于8倍提升和零扩展,每个子元素被视为有符号整数并且被符号扩展到八倍于由ELTYPE指定的宽度的矢量通道。8倍提升对于16位、32位或64位的初始子元素尺寸是无效的。
VECLEN字段3004定义流的以字节为单位的流矢量长度。流引擎125将流分解成VECLEN个字节长的元素组。VECLEN字段3004的三位的编码被定义为如表12所示。
VECLEN | 流矢量长度 |
000 | 1字节 |
001 | 2字节 |
010 | 4字节 |
011 | 8字节 |
100 | 16字节 |
101 | 32字节 |
110 | 64字节 |
111 | 保留 |
表12
VECLEN不可以小于以字节为单位的元素尺寸与重复因子的乘积。如表11所示,64位的最大VECLEN等于矢量数据路径侧B116的优选矢量尺寸。当VECLEN比处理单元核110的本机矢量宽度更短时,流引擎125填补提供给处理单元核110的矢量中的额外通道。GRDUP字段3006确定填补的类型。VECLEN字段3004以下面描述的方式与ELDUP字段3005和GRDUP字段3006交互。
ELDUP字段3005指定重复每个元素的次数。元素尺寸与元素重复量相乘不可以超出64个字节。ELDUP字段3005的三位的编码被定义为如表13所示。
ELDUP | 重复因子 |
000 | 不重复 |
001 | 2次 |
010 | 4次 |
011 | 8次 |
100 | 16次 |
101 | 32次 |
110 | 64次 |
111 | 保留 |
表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之间的交互。以下示例中的每一个示出流引擎如何将流映射到横跨不同流矢量长度和矢量数据路径侧B116的矢量尺寸的矢量上。该示例的流包括64位/8字节的二十九个元素(E0到E28)。该流可以是二十九个元素的线性流或者是29个元素的内部循环。该表图示说明诸如图21所示的八字节通道。每个图示说明的矢量进而被存储在相应的流头寄存器2818/2828中。
表14图示说明当VECLEN为64字节时如何将示例流映射到64字节处理器矢量内的位上。
表14
如表14所示,该流在四个矢量上扩展。如前所述,扩展超出该流的矢量4内的通道被零填充。当VECLEN具有等于本机矢量长度的尺寸时,GRDUP的值无关紧要,因为在这种VECLEN的情况下,不能发生重复。
除了32字节的VECLEN之外,表15示出与表14中示出的相同的参数。组重复被禁用(GRDUP=0)。
表15
流的二十九个元素分布到八个矢量中的通道0至3上。矢量1至7中的额外通道4至7被零填充。在矢量8中,通道1具有流元素(E28),并且其他通道被零填充。
除了十六字节的VECLEN之外,表16示出与表14示出的相同的参数。组重复被禁用(GRDUP=0)。
表16
流的二十九个元素分布到十五个矢量中的通道0至通道1上。矢量1至14中的额外通道2至7被零填充。在矢量15中,通道1具有流元素(E28),并且其他通道被零填充。
除了八字节的VECLEN之外,表17示出与表14示出的相同的参数。组重复被禁用(GRDUP=0)。
表17
流的二十九个元素出现在二十九个矢量中的通道0中。矢量1至29中的额外通道1至7被零填充。
除了三十二位的VECLEN之外,表18示出与表15示出的相同的参数。组重复被启用(GRDUP=1)。
表18
流的二十九个元素分布到八个矢量中的通道0至7上。每个矢量1至7包括四个重复的元素。重复因子(2)这一结果是因为VECLEN(32字节)是64字节的本机矢量长度的一半。在矢量8中,通道0具有流元素(E28)并且通道1至3被零填充。矢量9的通道4至7重复该模式。
除了十六字节的VECLEN之外,表19示出与表16示出的相同的参数。组重复被启用(GRDUP=1)。
表19
流的二十九个元素分布到十五个矢量中的通道0至7上。每个矢量1至7包括两个重复四次的元素。重复因子(4)这一结果是因为VECLEN(16字节)是64字节的本机矢量长度的四分之一。在矢量15中,通道0具有流元素(E28)并且通道1被零填充。该模式在矢量15的通道2和3、通道4和5以及通道6和7中被重复。
除了八字节的VECLEN之外,表20示出与表17示出的相同的参数。组重复被启用(GRDUP=1)。
表20
流的二十九个元素全部出现二十九个矢量中的通道0至7上。每个矢量包括重复八次的一个元素。重复因子(8)这一结果是因为VECLEN(8字节)是64字节的本机矢量长度的八分之一。因此在矢量1至29中每个通道是相同的。
图31说明被包括在图19的格式化器块1903内的矢量长度掩码/组重复块2025的示例。输入寄存器3100接收来自图20中示出的元素重复块2024的矢量输入。输入寄存器3100包括布置成64个1字节块(字节0至字节63)的64个字节。注意,字节0至字节63各自的长度等于ELEM_BYTES的最小值。一组多路复用器3101至3163将来自源寄存器3100的输入字节耦合到输出寄存器3170。每个相应的多路复用器3101至3163将输入供应到输出寄存器3170的相应的字节1至字节63。并非输入寄存器3100的所有字节(字节0至字节63)都被耦合到每个多路复用器3101至3163。应注意,没有多路复用器供应输出寄存器3170的字节0。在该示例中,输出寄存器3170的字节0由输入寄存器3100的字节0供应。
多路复用器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个最低有效位。通过处理单元核110(图1)经由如下所述的流读取提前指令消耗数据的速率来设置格式化器1903(图19)中的数据移动的速率。只要流包括附加数据元素,该组重复格式化就反复进行。
元素重复(ELDUP)和组重复(GRUDP)是独立的。应注意,这些特征包括独立的规格和参数设定值。因此元素重复和组重复可以一起使用或分开使用。因为这些是指定的,因此元素重复允许溢出到下一个矢量,而组重复不允许。
再次参考图30,DECIM字段3007控制相应的流的数据元素抽取。流引擎125从相应的流头寄存器2818/2828中的存储装置上的流中删除数据元素以用于向请求功能单元展示。抽取移除整个数据元素,而不是子元素。DECIM字段3007被定义为如表21所列出那样。
DECIM | 抽取因子 |
00 | 不抽取 |
01 | 2次 |
10 | 4次 |
11 | 保留 |
表21
如果DECIM字段3007等于00,则不发生抽取。数据元素在不改变的情况下被传递到相应的流头寄存器2818/2828。如果DECIM字段3007等于01,则发生2:1的抽取。在存储于流头寄存器2818/2828中之后,流引擎125从数据流中移除奇数元素。格式化网络的限制要求所采用的2:1的抽取具有至少2倍的数据提升(PROMOTE不能为000)、ICNT0必须是2的倍数,并且总矢量长度(VECLEN)必须足够大以保持单个提升重复的元素。对于被转置的流(TRANSPOSE≠0),转置粒度(granule)必须是提升之前的以字节为单位的元素尺寸的至少两倍。如果DECIM字段3007等于10,则发生4:1的抽取。在数据流被存储于流头寄存器2818/2828中之后,流引擎125保持每一第四数据元素,即从数据流中每四个数据元素移除三个元素。格式化网络的限制要求所采用的4:1的抽取具有至少4倍的数据提升(PROMOTE不能为000、001或101)、ICNT0必须是4的倍数,并且总矢量长度(VECLEN)必须足够大以保持单个提升重复的元素。对于经转置的流(TRANSPOSE≠0),在一个示例中,抽取移除列,并且不移除行。因此,在这种情况下,对于2:1的抽取,转置粒度必须是提升之前的以字节为单位的元素尺寸的至少两倍(GRANULE≥2×ELEM_BYTES),并且对于4:1的抽取,转置粒度必须是提升之前的以字节为单位的元素尺寸的至少四倍(GRANULE≥4×ELEM_BYTES)。
“节流(THROTTLE)”字段3008控制流引擎如何领先于处理单元核110激进地提取。该字段的两位的编码被定义为如表22所示。
THROTTLE | 描述 |
00 | 最小的节流,最大的提前提取 |
01 | 较少的节流,较多的提前提取 |
10 | 较多的节流,较少的提前提取 |
11 | 最大的节流,最小的提前提取 |
表22
THROTTLE不改变流的含义,并且仅作为提示(hint)。流引擎可以忽略该字段。程序不应该依赖于具体的节流行为来判断程序正确性,因为架构不指定精确的节流行为。THROTTLE允许程序员向硬件提供关于程序行为的提示。通过默认,流引擎尝试尽可能远地领先于处理单元核110以隐藏尽可能多的延迟(等效于THROTTLE=11),同时向处理单元核110提供充足的流吞吐量。尽管某些应用需要这种水平的吞吐量,但这种吞吐量可能导致其他应用的不良系统水平行为。例如,流引擎丢弃穿过环境切换的所有提取的数据。因此,激进的提前提取可能导致具有大量环境切换的系统中的带宽浪费。
DIMFMT字段3009定义流模板寄存器2900的循环计数字段ICNT0 2901、ICNT12902、ICNT2 2903、ICNT3 2804、ICNT4 2905和ICNT5 2906中的哪一个、循环维度字段DIM12911、DIM2 2912、DIM3 2913、DIM4 2914和DIM5 2915中的哪一个以及寻址模式字段AM03013、AM1 3014、AM2 3015、AM3 3016、AM4 3017和AM5 3018(FLAGS字段2921的一部分)中的哪一个对于该特定流是有效的。表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中的每一个是三位并且被解码为如表24所列出的那样。
AMx字段 | 含义 |
00 | 线性寻址 |
01 | 由CBK0设置循环寻址块尺寸 |
10 | 由CBK0+CBK1+1设置循环寻址块尺寸 |
11 | 保留 |
表24
在线性寻址中,地址根据地址算法是正向还是反向而前进。在循环寻址中,地址保留在定义的地址块内。在达到循环地址块的末端之后,地址卷绕到块的开始极限。循环寻址块被限制到2N个地址,其中N是整数。循环地址算法可以通过切断位之间的进位链并且不允许所选数量的最高有效位改变来进行操作。因此超越循环块的末端的算法仅改变最低有效位。块尺寸被设置为如表25所列出的那样。
表25
在该示例中,循环块尺寸通过由CBK0编码的数值(第一循环地址模式01)来设置或者通过由CBK0+CBK1+1编码的数值(第二循环地址模式10)来设置。例如,在第一循环地址模式中,循环地址块尺寸的范围可以是从512字节到16M字节。对于第二循环地址模式,循环地址块尺寸的范围可以是从1K字节到64G字节。因此编码的块尺寸是2(B+9)字节,其中B是编码块数,对于第一块尺寸(AMx为01)其为CBK0并且对于第二块尺寸(AMx为10)其为CBK0+CBK1+1。
处理单元110(图1)通过少量的指令和专用寄存器来使流引擎125(图28)被编程。程序利用SEOPEN和SECLOSE开始和结束流。SEOPEN开启新的流,并且流保持开启直到被SECLOSE明确终止或被SEOPEN替换为新的流为止。SEOPEN指令指定指示开启流0或流1的流编号。SEOPEN指令指定存储该流的开始地址的数据寄存器。SEOPEN指令还指定存储如上所述的流模板的流模板寄存器。SEOPEN指令的变元(argument)在表26中列出。
变元 | 描述 |
流开始地址寄存器 | 存储流开始地址的标量寄存器 |
流编号 | 流0或流1 |
流模板寄存器 | 存储流模板数据的矢量寄存器 |
表26
在该示例中,流开始地址寄存器是通用标量寄存器文件211(图2)中的寄存器。SEOPEN指令可以经由示例指令编码1300(图13)的src1字段1303(图13)指定该流开始地址。SEOPEN指令在操作码中指定流0或流1。在该示例中,流模板寄存器是通用矢量寄存器文件221中的矢量寄存器。SEOPEN指令可以经由src2/cst字段1302(图13)指定该流模板寄存器。如果指定的流是激活的,则SEOPEN指令关闭先前的流并且用指定的流代替该流。
SECLOSE明确将流标记为未激活,并刷新任何未完成的活动。对流的任何其他引用都会触发异常。SECLOSE还允许程序过早终止一个或两个流。
SESAVE指令通过捕获指定流的充足的状态信息来保存流的状态,以便将来重新开始该流。SERSTR指令恢复先前保存的流。SESAVE指令保存流元数据,并且不保存任何流数据。该流响应于SERSTR指令而重新提取流数据。
每个流可以处于三种状态之一:未激活、激活,或重置后冻结。两个流均以未激活状态开始。开启流将使流移动到激活状态。关闭流将使流返回到未激活状态。在没有中断和异常的情况下,流通常不会进行其他状态转换。为了解决中断,流引擎添加了第三个状态:冻结。冻结状态表示中断的激活流。
在该示例中,四个位(每个流两位)定义两个流的状态。每个流的一个位驻留在流引擎内,并且另一个位驻留在处理器核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通道的一个位。在该示例中,最小ELEM_BYTES是1个字节。处理器100的优选数据路径宽度和流头寄存器2818/2828的数据长度为64字节(512位)。有效寄存器2819/2829因此具有64位的数据宽度。有效寄存器2819/2829中的每个位指示流头寄存器2818/2828中的相应字节是否有效。在该示例中,0指示流头寄存器内的相应字节是无效的,并且1指示相应的位是有效的。
在该示例中,对于读取流头寄存器2818/2828中的相应一个以及转移数据到请求功能单元,相应的有效寄存器2819/2829中的无效/有效数据自动转移到对应于特定流的断言寄存器文件243(图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以及元素是实数还是复数来产生对应于最小数据尺寸的输出“总元素尺寸(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字节。
表27
第二输入PROMOTE被供应到解码器3202。解码器3202产生对应于PROMOTE输入的输出提升因子。PROMOTE的各个编码的含义如表28所示,表28针对各个PROMOTE编码示出以字节为单位的解码器3202的示例输出。扩展类型(零扩展或符号扩展)的差异与解码器3202无关。
表28
解码器3201和3201的输出被供应到乘法器3203。由乘法器3202产生的乘积是对应于TOTAL ELEMENT SIZE和提升因子的通道尺寸。因为提升因子是2的整数次幂(2N),所以该乘法可以通过TOTAL ELEMENT SIZE的相应移位来实现。例如当提升因子为1时没有移位,当提升因子为2时偏移1位,当提升因子为4时偏移2位,并且当提升因子为8时偏移3位。
“通道数(NUMBER OF LANES)”单元3204接收矢量长度VECLEN和通道尺寸(LANESIZE)并且生成NUMBER OF LANES。表29示出针对以字节为单位的通道尺寸和矢量长度VECLEN的多个通道的示例解码。
表29
如前所述,VECLEN必须大于或等于元素尺寸与重复因子的乘积。如表29所示,VECLEN也必须大于或等于元素尺寸与提升因子的乘积。这意味着VECLEN必须足够大以保证元素不能与其通过类型提升块2022(图20)产生的扩展分开。表29中的对角线下方的标记为“-”的单元指示不允许的参数组合。
单元3204的输出“通道数(NUMBER OF LANES)”充当“通道/剩余元素控制字(LANE/REMAINING ELEMENTS CONTROL WORD)”单元3211的一个输入。第二输入来自多路复用器3212。多路复用器3212接收Loop0输入和Loop1输入。Loop0输入和Loop1输入代表相应循环的当前迭代中剩余元素的数量。
图33说明图28中示出的地址生成器2811的部分示意图。地址生成器2811形成地址以用于提取相应流引擎的限定的流中的下一个元素。开始地址寄存器3301存储数据流的开始地址。如上之前所述,在该示例中,开始地址寄存器3301是全局标量寄存器文件211中的由开启相应的流的SEOPEN指令认定的标量寄存器。该开始地址可以通过被包括在地址生成器2811内的控制逻辑从指定的标量寄存器中被复制并且被本地存储在相应的地址生成器2811/2821处。流的第一循环采用Loop0计数寄存器3311、加法器3312、乘法器3313和比较器3314。Loop0计数寄存器3311存储第一循环(Loop0)的迭代计数的工作副本。对于Loop0加法器3312的每次迭代,当由下一个地址信号触发时,对循环计数加1,循环计数被存回到Loop0计数寄存器3311中。乘法器3313将当前循环计数与量值ELEM_BYTES相乘。ELEM_BYTES是Loop0中的每个数据元素的以字节为单位的尺寸。Loop0以ELEM_BYTES的迭代步长尺寸遍历存储器中物理连续的数据元素。
比较器3314将存储在Loop0计数寄存器3311中的计数(由加法器3313递增之后)与来自相应流模板寄存器2900(图29)的ICNT0 2901(图29)的值进行比较。当加法器3312的输出等于流模板寄存器2900的ICNT0 2901的值时,Loop0的迭代完成。比较器3314生成有效Loop0结束信号。Loop0计数寄存器3311被重置为0并且下一个更高循环(在此情况下为Loop1)的迭代被触发。
用于更高循环(Loop1、Loop2、Loop3、Loop4和Loop5)的电路类似于图33中示出的电路。每个循环包括相应的工作循环计数寄存器、加法器、乘法器和比较器。每个循环的加法器由前一个循环的循环结束信号触发。每个乘法器的第二输入是来自相应流模板的相应维度DIM1、DIM2、DIM3、DIM4和DIM5。每个循环的比较器将工作循环寄存器计数与相应流模板寄存器2900的相应迭代值ICNT1、ICNT2、ICNT3、ICNT4和ICNT5进行比较。循环结束信号生成下一个更高循环的迭代。来自Loop5的循环结束信号结束该流。
图33还说明Loop0计数的生成。Loop0计数等于存储在相应工作计数寄存器3311中的更新数据。Loop0计数在工作Loop0计数寄存器3311的每次变化时被更新。类似地生成用于更高循环(Loop1、Loop2、Loop3、Loop4和Loop5)的循环计数。
图33还说明Loop0地址的生成。Loop0地址等于来自乘法器3313的数据输出。Loop0地址在工作Loop0计数寄存器3311的每次变化时被更新。用于Loop1、Loop2、Loop3、Loop4和Loop5的类似电路产生相应的循环地址。在该示例中,Loop0计数寄存器3311和其他循环计数寄存器被实现为向上计数寄存器。在另一个示例中,初始化和比较操作为向下计数电路。
再次参考图32,循环向下计数(诸如Loop0/)的值可以由Loopx/=ICNTx-Loopx给出,即循环向下计数是流模板寄存器中指定的初始迭代计数与如图33所示的产生的循环向上计数之间的差。
LANE/REMAINING ELEMENTS CONTROL WORD单元3211(图32)基于来自NUMBER OFLANES单元3204的通道的数量和由多路复用器3212选择的循环向下计数来生成控制字3213。多路复用器3212的控制输入是来自图30的字段3002的转置(TRANSPOSE)信号。如果TRANSPOSE被禁用(“000”),则多路复用器3212选择Loop0向下计数Loop0/。对于TRANSPOSE的所有其他合法值(“001”、“010”、“011”、“100”、“101”和“110”),多路复用器3212选择Loop1向下计数Loop1/。流引擎将最里面的维度映射到矢量中的连续通道。对于正常的流,这是Loop0。对于转置的流,这是Loop1,因为转置交换了这两个维度。
LANE/REMAINING ELEMENTS CONTROL WORD单元3211生成如下所示的控制字3213。控制字3213具有数量等于来自单元3204的通道的数量的位。如果选定循环的元素的剩余计数大于或等于通道的数量,则所有通道都是有效的。对于这种情况,控制字3213全部是一,这表明矢量长度VECLEN内的所有通道都是有效的。如果选定循环的元素的剩余计数非零且小于通道的数量,则一些通道是有效的并且一些通道是无效的。根据上面结合图21和图22所描述的通道分配,从最低有效通道开始向流元素分配通道。在这些情况下,控制字3213包括设置为一的多个最低有效位,其数量等于选定循环向下计数的数量。控制字3213的所有其他位被设置为零。在图32中说明的示例中,通道的数量等于八并且存在五个有效(1)最低有效位,随后是三个无效(0)最高有效位,这对应于具有在最终迭代中剩余的五个元素的循环。
控制字扩展单元3214基于LANE SIZE的量值来扩展控制字3213。经扩展的控制字包括用于每个最小尺寸通道的一个位。在该示例中,最小流元素尺寸是1字节(8位),并且因此最小通道尺寸是一字节(8位)。在该示例中,保持寄存器2818/2828的尺寸等于64字节(512位)的矢量尺寸。因此,经扩展的控制字具有64位,一个位用于流保持寄存器2818/2828的每个字节。这个经扩展的控制字填充相应的有效寄存器2819和2829(图28)的最低有效位。
对于VECLEN等于矢量长度的情况,该描述是完备的。经扩展的控制字包括用于相应有效寄存器2819/2829内的所有位置的位。存在VECLEN不等于矢量长度的一些附加考虑。当VECLEN不等于矢量长度时,经扩展的控制字不具有足够的位来填充相应的有效寄存器2819/2829。如图32所说明的,经扩展的控制字填充相应的有效寄存器2819/2829的最低有效位,因此为VECLEN宽度内的通道提供了有效/无效位。为超出VECLEN宽度直到流头寄存器2818的数据宽度的通道提供另一种机制。
仍然参考图32,说明多路复用器3215和组重复单元3216以提供需要的附加有效/无效位。参见对VECLEN的描述,如果组重复没有被启用(GRDUP=0),则过量通道是无效的。多路复用器3215的第一输入是INVALID 0信号,该INVALID 0信号包括数量等于VECLEN的多个位。当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的位全部为一。这发生于表18中示出的组重复示例的矢量1至7以及表19中示出的组重复示例的矢量1至14。在这些情况下,来自控制字扩展单元3214的经扩展的控制字的所有位为一并且流头寄存器2818的所有通道是有效的。因此组重复单元3216用一填充所有的过量通道。在其他结果中,剩余流数据元素的数量小于VECLEN内的通道的数量。这发生于表18中的组重复示例中示出的矢量8以及表19中示出的组重复示例中的矢量15。在这些情况下,VECLEN内的一些通道是有效的并且一些是无效的。组重复单元3216用具有与经扩展的控制字位相同的模式的位来填充过量通道。在任一情况下,对应于经扩展的控制位的过量通道被填充。
仍然参考图32,说明最低有效位和最高有效位之间的边界3217。该边界的位置由VECLEN的尺寸相对于流头寄存器2818的尺寸来设置。
图34是说明上述流输入操作数编码的部分示意图3400。图34说明对一个指令的src1字段1303进行解码以控制功能单元3420的相应src1输入端的的指令解码器113(参见图1)的一部分。这些相同或相似的电路被重复以用于指令控制功能单元3420的src2/cst字段1302。此外,这些电路被重复以用于执行包内的能够采用流数据作为被同时分派的操作数的每个指令。
指令解码器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输入端。
子解码器3412确定src1字段1303是否处于从10000到10111的范围内。如果是这种情况,则子解码器3412将相应的寄存器编号供应到相应的局部矢量寄存器文件。如果指令指向L2单元241或S2单元242,则相应的局部矢量寄存器文件是局部矢量寄存器文件232。如果指令指向M2单元243、N2单元244或C单元245,则相应的局部矢量寄存器文件是局部矢量寄存器文件233。在该示例中,该寄存器编号是src1字段1303的三个最低有效位。相应的局部矢量寄存器文件232/233调用存储在对应于该寄存器编号的寄存器中的数据并且将该数据供应到功能单元3420的src1输入端。
子解码器3413确定src1字段1303是否为11100。如果是这种情况,则子解码器3413将流0读取信号供应到流引擎125。然后,流引擎125将存储在保持寄存器2818中的流0数据供应到功能单元3420的src1输入端。
子解码器3414确定src1字段1303是否为11101。如果是这种情况,则子解码器3414将流0读取信号供应到流引擎125。然后,流引擎125将存储在保持寄存器2818中的流0数据供应到功能单元3420的src1输入端。子解码器3414还将提前信号供应到流0。如前所述,流引擎125提前在保持寄存器2818中存储流0的数据元素的下一个连续矢量。
通过子解码器3413或子解码器3414将流0读取信号供应到流引擎125将触发另一个数据移动。根据这种流0读取信号,流引擎125将存储在有效寄存器2819中的数据供应到用于存储的断言寄存器文件234。根据该示例,这是断言寄存器文件234内的预定数据寄存器。在该示例中,数据寄存器P0对应于流0。
子解码器3415确定src1字段1303是否为11110。如果是这种情况,则子解码器3415将流1读取信号供应到流引擎125。然后,流引擎125将存储在保持寄存器2828中的流1数据供应到功能单元3420的src1输入端。
子解码器3416确定src1字段1303是否为11111。如果是这种情况,则子解码器3416将流1读取信号供应到流引擎125。然后,流引擎125将存储在保持寄存器2828中的流1数据供应到功能单元3420的src1输入端。子解码器3414还将提前信号供应到流1。如前所述,流引擎125提前在保持寄存器2828中存储流1的数据元素的下一个连续矢量。
通过子解码器3415或子解码器3416将流1读取信号供应到流引擎125将触发另一个数据移动。根据这种流1读取信号,流引擎125将存储在有效寄存器2829中的数据供应到用于存储的断言寄存器文件234。根据该示例,这是断言寄存器文件234内的预定数据寄存器。在该示例中,数据寄存器P1对应于流1。
类似的电路被用于响应于src2/cst字段1302的位编码而选择供应到功能单元3402的src2输入端的数据。可以用如上所述的方式向功能单元3520的src2输入端供应常量输入。如果指令解码器113生成用于来自src1字段1303或src2/sct字段1302的流0的读取信号,则流引擎125将存储在有效寄存器2819中的数据供应到用于存储的断言寄存器文件234的断言寄存器P0。如果指令解码113生成用于来自src1字段1303或src2/sct字段1302的流1的读取信号,则流引擎125将存储在有效寄存器2829中的数据供应到用于存储的断言寄存器文件234的断言寄存器P1。
致力于操作数规范的指令位的准确数量以及数据寄存器和流的数量是设计选择。尤其是,单个全局矢量寄存器文件的规范以及局部矢量寄存器文件的省略是可能的。该示例采用输入操作数选择字段的位编码来指示流读取并且采用另一个位编码来指示流读取和提前该流。
图34中说明的过程在每次流数据被读取时将有效数据自动转移到断言寄存器文件234中。然后转移的有效数据被P单元246用于元数据的进一步计算。通过一个或多个矢量数据路径侧B116功能单元包括L2单元241、S2单元242、M2单元243、N2单元244和C单元245,转移的有效数据还可以用作其他操作的掩码或操作数。存在采用该流有效数据的大量可行的复合逻辑操作。
图35是说明用于选择操作数源的另一示例配置的部分示意图3500。在该示例中,相应的流有效寄存器2819/2829不需要被自动加载到断言寄存器文件234中的预定寄存器。相反,至P单元246的明确指令用于移动数据。图35说明指令解码器113(参见图1)的一部分,其对一个指令的src1字段1303进行解码以控制P单元246的相应src1输入。这些相同或相似的电路可以被复制用于指令控制P单元246的src2/cst字段1302(图13)。
指令解码器113接收指令的src1字段1303。操作码字段1304和单元字段1305指定P单元246和将被执行的功能。图35中说明的指令解码器113的相关部分对src1字段1303进行解码。子解码器3511确定src1字段1303是否在00000至01111的范围内。如果是这种情况,则子解码器3511将相应的寄存器编号供应到全局矢量寄存器文件231。在该示例中,该寄存器编号是src1字段1303的四个最低有效位。全局矢量寄存器文件231调用存储在对应于该寄存器编号的寄存器中的数据并且将该数据供应到P单元246的src1输入端。
子解码器3512确定src1字段1303是否在10000至10111的范围内。如果是这种情况,则子解码器3512将解码的寄存器编号供应到断言寄存器文件234。在该示例中,该寄存器编号是src1字段1303的三个最低有效位。断言寄存器文件234调用存储在对应于该寄存器编号的寄存器中的数据并且将该数据供应到断言单元246的src1输入端。
子解码器3513确定src1字段1303是否是11100。如果是这种情况,则子解码器3513将流0有效读取信号供应到流引擎125。然后流引擎125将存储在有效寄存器2819中的有效数据供应到P单元246的src1输入端。
子解码器3514确定src1字段1303是否是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字段1303被解释为如关于图34所概述的那样。如果由指令指定的功能单元是P单元246,则src1字段1303被解释为如关于图35所概述的那样。可替代地,图34中说明的将流有效寄存器自动保存到预定断言寄存器可以在一个示例中被实施,并且不在另一个示例中实施。
如本文先前参考图28所述,流引擎125将相应的数据贮存器2816/2826组织为由元数据加标签的间隙阵列,该元数据包括与该间隙相关联的49位虚拟地址、有效位、就绪位、激活位和最后一个引用值。存储分派和跟踪2814/2824管理相应的数据贮存器2816/2826的内容,并维护每个间隙的元数据。表30示出了有效位、就绪位和激活位的可能状态组合。元数据在本文中可以被称为标签,并且元数据内的有效位、就绪位和激活位在本文中可以被统称为标签位。
表30
对于每个传出命令中的每个地址,存储分派和跟踪2814/2824执行以下标签查找,以确定所请求地址处的数据是否已经在相应的数据贮存器2816/2826中。最初,存储分派和跟踪2814/2824将地址与相应的标签阵列中的相关标签进行比较。如果发现标签匹配,即命中,则取消传出命令,并且记住与地址匹配的间隙编号。如果未发现标签匹配,即错失,则为该地址分派一个空闲间隙,将有效位设置为1,并且将就绪位设置为0。此外,更新传出命令以将数据引导到分派的间隙,将引用插入到引用队列中,将激活位设置为1以指示引用队列中的激活引用,并将该间隙的最后一个引用更新为引用队列中的引用的插入指针的值。
为了最大程度地重复使用间隙并最大程度地减少停顿,存储分派和跟踪2814/2824通常按以下方式分派间隙:1)如果可用,则选择紧跟在最近分派的间隙之后的间隙(FIFO顺序);2)否则,按FIFO顺序选择下一个可用间隙(如果有的话);3)如果没有可用间隙,则停顿地址生成器2811/2821并重复上述两个步骤,直到分派成功。该方法倾向于按照与流引擎125的一般存储器访问行为相匹配的FIFO顺序来分派间隙,但在间隙的特定重复使用模式逆着FIFO顺序进行工作的情况下避免了停顿。此外,较旧的标签(在流序列中较早分派的存储器位置)将在较新的标签之前被替换。
地址生成器2811/2821不能生成新地址,直到将先前生成的地址分派给间隙,因此当没有间隙可用于分派时,地址生成器2811/2821等待(停顿)直到间隙变得可用。只要引用队列2815/2825有条目,地址生成器2811/2821的停顿就不会停止CPU读取路径。
在紧接最近分派的间隙之后的间隙不可用的情况下使用传统的FIFO方法选择下一个可用间隙可能导致从最后分派的间隙开始扫描整个标签集,在该示例中为三十二个标签。图36的示例说明这种传统的FIFO方法。在该示例中,标签位的扫描从当前指针(CP)位置(紧接在最后分派的间隙之后的位置)开始。在该示例中,定位可用间隙的扫描开始于CP指向间隙3的标签,并终止于确定为可用的间隙8。将间隙8分派给触发扫描的地址,并且然后使CP指向间隙9。下一次需要可用间隙时,定位可用间隙的扫描开始于间隙9的标签,并且终止于确定为可用的间隙17。将间隙17分派给触发扫描的地址,并且然后使CP指向间隙18。
在一些示例中,存储分派和跟踪2814/2824使用伪FIFO标签替换策略来找到可用间隙。并不是按FIFO顺序扫描所有间隙的所有标签直到定位可用间隙或已扫描所有标签,而是将这些标签分为连续标签的不重叠组,例如,如图37所示的针对八个连续间隙的八个标签的四个组,并且在时钟周期中搜索单个组。更具体地,当需要可用间隙时,在CP的位置处从标签的当前组(CG)(即最后发生间隙分派的组)中开始搜索。如果在当前组中找到可用间隙,则分派该间隙,CP移动到分派的间隙之后的下一个间隙的标签,并且当前组仍为当前组。例如,在图37中,当前组为组0,并且CP指向间隙3的标签。当需要可用间隙时,搜索将在组0中从当前CP位置处开始。
如果当前组中没有可用间隙,则地址生成器2811/2821停顿,当前组移动到下一个组,并且CP移动到指向新的当前组中的第一间隙的标签。在下一时钟周期中,从新的当前组中的CP位置开始搜索可用间隙。在每个后续时钟周期中重复此过程,直到找到可用间隙为止。当在当前组中找到可用间隙时,分派该间隙,并且CP移动到下一个间隙的标签。如果下一个间隙的标签在当前组中,则当前组仍为当前组。如果下一个间隙的标签不在当前组中,则将组指针(GP)改变为指向包含下一个间隙的组。
图38和图39是说明伪FIFO标签替换策略的简单示例。在图38的示例中,间隙5的标签位指示该间隙是可用的,当前组为组0,并且CP指向间隙3的标签。当需要可用间隙时,搜索将在组0中在间隙3的标签处开始。搜索将按连续的间隙顺序搜索标签,直到搜索确定间隙5的可用的。分派间隙5,CP移动到指向间隙6的标签,并且当前组仍为组0。当需要另一个可用间隙时,搜索将在组0中从标签6处开始。
在图39的示例中,当前组是组0,CP指向间隙3的标签,并且组0中没有可用间隙。当需要可用间隙时,搜索将在组0中从间隙3的标签处开始。搜索将按连续的间隙顺序搜索标签,直到搜索确定组0中没有可用间隙。分派停顿,当前组设置为组1,并且CP移动到指向组1的开始处的间隙8的标签。在下一时钟周期期间,在组1上搜索与间隙8的标签一起使用的可用间隙。
图40是用于在加标签的存储器系统中进行标签线替换的方法的流程图,该方法例如可以作为管理数据贮存器2816/2826中的加标签的间隙的阵列的一部分而由流引擎125执行。该方法可以用于在加标签的存储器系统中搜索和分派可用间隙或标签线。应注意,CP和GP都以循环或轮循方式操作,使得当CP到达最终标签组的末端时,GP移动到指示初始组,并且CP移动到该组中的初始标签。
最初,检查由CP指示的标签,以确定4000相关联的标签线是否可用于分派。如果标签指示标签线可用,则将标签线分派4002给地址数据,并且修改标签以指示标签线被分派。然后将CP移动4003到指向下一个标签线的标签。如果尚未到达4004当前标签组的末端,则该方法结束。当随后调用该方法时,GP指示与先前调用相同的组,并且CP指向紧接在先前分派的标签线的标签之后的标签。如果已经到达当前标签组的末端,则将GP设置4010为下一组,并且该方法终止。当随后调用该方法时,GP指示该下一个组,并且CP指向该组中的初始标签。
如果与CP指示的标签相关联的标签线不可用4000,则将CP移动4006到下一个标签线的标签。如果尚未到达4008当前标签组的末端,则检查由CP 4000指示的标签线的相关联的标签线的可用性。继续搜索标签的过程,直到在当前标签组中找到可用的标签线或到达4008标签组的末端为止。如果在定位到可用标签线之前已到达当前组的末端,则GP被设置4010到下一组,并且该方法终止。当随后调用该方法时,GP指示该下一组,并且CP指向该组中的初始标签。
在上述方法的一些示例中,不是在到达标签组的末端时终止对可用标签线的搜索,而是搜索循环回到标签组的开头并搜索标签中的其他标签,直到找到可用标签线或到达启动搜索时CP的原始位置处的标签为止。例如,假设启动搜索时CP指向组0中的标签线4的标签。还要假设标签线4–7在组0中不可用。不是在搜索到标签线7的标签时终止搜索,而是从标签线0的标签继续搜索。如果标签线0–3不可用,当到达标签线4的标签时,搜索终止。
在一些示例中,使用优先级编码器搜索来搜索组中的标签,其中标签的优先级基于在启动搜索时CP的位置。例如,如果在启动搜索时CP指向标签线4的标签,则标签线6的标签具有最高优先级,标签线7的标签具有次高优先级,标签线0的标签具有次高优先级等。此外,一般来说,具有最高优先级的组中的第一个可用标签线被选择用于分派。继续前面的示例,如果标签线6可用,则选择标签线6用于分派。然而,如果标签线6不可用,但标签线7可用,则选择标签线7用于分派。例如,在2019年8月30日的https://www.electronics-tutorials.ws/combination/comb_4.html可获得的Electronics Tutorials(电子学教程)中的“Priority Encoder and Digital Encoder Tutorial(优先级编码器和数字编码器教程)”中更详细地解释了优先级编码器,其通过引用并入本文。在一些示例中,使用存储分派和跟踪2814/2824中的组合逻辑来实现用于标签线搜索的优先级编码器。
图41和图42是说明可用标签线的优先级编码器搜索的示例。图41示出了基于CP的值的组中的标签的优先级。例如,如果CP指向标签线4的标签,则优先级顺序为标签线4、标签线5、标签线6、标签线7、标签线0、标签线1、标签线2和标签线3。图42说明优先级搜索模式,其假设CP指向标签线4的标签。
图43是用于在加标签的存储器系统中的标签线替换的方法的流程图,该方法可以例如作为管理数据贮存器2816/2826中的加标签的间隙的阵列的一部分而由流引擎125执行。该方法(基于优先级编码器搜索)可以用于在加标签的存储器系统中搜索和分派可用间隙或标签线。最初,通过优先级编码器对当前组中的标签进行测试4300,以确定是否存在与该组中的任何标签相关联的任何可用标签线。如果存在至少一个可用标签线4302,则基于标签优先级分派4304可用标签线。如本文先前所描述的,标签的优先级是基于在启动搜索时的CP来确定的,并且最高优先级的可用标签线被分派。
然后将CP移动4306到在所分派的标签线之后的下一个标签线的标签。如果已经到达4308当前组的末端,则将GP移动4310到下一个组,并且该方法终止;否则,GP不改变,并且该方法终止。如果当前组中没有标签线可用4302,则将CP和GP移动4312到下一组,并且该方法终止。
在一些示例中,不是一次使用优先级编码器来搜索当前组中所有标签线的标签,而是使用优先级编码器来搜索从CP到当前组的末端的标签。如果未找到可用标签线,则搜索当前组中的其余标签。例如,如果CP指向标签线6的标签,则第一优先级编码器搜索查找标签线6和7的标签。如果这些标签线都不可用,则使用优先级编码器搜索标签线0-5的标签。
如本文先前所述,在一些示例中,存储分派和跟踪2814/2824可以搜索两个间隙或标签线而不是一个。如果使用优先级编码器搜索,则基于标签的优先级在该组中搜索两个可用标签线。例如,如果CP指向标签线4的标签,并且标签线4、6和7可用,则分派标签线4和标签线6,因为这两个标签线具有可用标签线的最高优先级。在一些示例中,如果当前组中没有两个标签线,则将CP和GP移动到下一组,在下一时钟周期中搜索该下一组。在一些示例中,如果当前组中仅一个标签线可用,则分派该标签线,并在下一时钟周期中搜索下一组中的可用标签线。图44是说明当CP指向标签线4的标签并且搜索针对两个可用标签线时当前组内的优先级搜索模式的示例。
图45说明示例多处理器系统。在该示例中,SoC 4500包括处理器100(图1)(被称为“处理器A”),并且其与第二处理器4511(被称为“处理器B”)进行组合。每个处理器经由总线4551耦合到一块共享的三级(L3)存储器4550。处理器B包括一块未共享的L2存储器4512。直接存储器访问(DMA)引擎4560可以被编程为使用已知的或以后开发的DMA技术从L3存储器向L2存储器130或L2存储器4512传递数据/指令块。各种类型的外围设备4562也耦合到存储器总线4551,诸如无线和/或有线通信控制器等。
在该示例中,处理器A、处理器B、L3存储器4550全部被包含在SoC 4500中,SoC4500可以被包封以形成封装件,该封装件可以使用已知或以后开发的封装技术安装在诸如印刷电路板(PCB)的基板上。例如,SoC 4500可以被包封在球栅阵列(BGA)封装件中。在此示例中,外部存储器接口(EMI)4552允许处理器A和/或处理器B访问附加外部大容量存储器4554。
在该示例中,处理器B是可以用于标量处理和控制功能的处理器。在其他示例中,可以将各种类型的已知或以后开发的处理器与DSP 100进行组合。虽然在该示例中说明了两个处理器,但在另一示例中,DSP 100的多个副本和/或处理器B的多个副本可以被包含在SoC中并利用如本文所述的并入流引擎125中的伪FIFO标签线替换策略。
其他实施例
尽管已经针对有限数量的实施例描述了本公开,但是可以设计不脱离本文所公开的本发明的范围的其他实施例。
例如,本文已经描述了一些实施例,其中存在三十二个标签,每个标签与相应的标签线相关联,并且标签被分成八个标签的四组。在其他实施例中,可以存在更多或更少的标签和标签线、更多或更少的组和/或每组更多或更少的标签。
在另一示例中,尽管在本文中参考管理流引擎贮存器中的间隙描述了伪FIFO替换策略,但是该策略可以用于任何存储器系统,其中标签被用于管理线或间隙中的数据存储。
因此,可预期所附权利要求将覆盖落入本公开的真实范围内的实施例的任何此类修改。
Claims (20)
1.一种方法,其包括:
在一个时钟周期期间,针对可用标签线对包括在加标签的存储器系统中的标签组中的标签进行搜索,其中所述加标签的存储器系统包括具有相应的标签的多个标签线,并且其中所述标签被划分成多个不重叠的标签组;并且
当在所述标签组中进行搜索未找到可用标签线时,在下一时钟周期期间,针对可用标签线对所述多个标签组的下一标签组中的标签进行搜索。
2.根据权利要求1所述的方法,其中对所述标签组中的标签进行搜索开始于所述标签组中的紧接在与先前搜索中分派的标签线相关联的标签之后的标签。
3.根据权利要求1所述的方法,其中对标签组中的标签进行搜索进一步包括:找到可用标签线,分派所述标签线以及将指针设置到与下一标签线相关联的标签。
4.根据权利要求1所述的方法,其中所述加标签的存储器系统包括三十二个标签线,每个标签线具有相关联的标签,并且每个标签组包括八个标签。
5.根据权利要求1所述的方法,其中所述加标签的存储器系统被包括在处理器的流引擎中。
6.根据权利要求1所述的方法,其中优先级编码器被用于搜索每个标签组中的标签。
7.根据权利要求1所述的方法,其中对标签组中的标签进行搜索进一步包括针对两个可用标签线对所述标签组中的标签进行搜索,并且对所述下一标签组中的标签进行搜索进一步包括当在所述标签组中进行搜索未找到两个可用标签线时,针对两个可用标签线对所述下一标签组进行搜索。
8.一种加标签的存储器系统,其包括:
多个标签线;
多个标签,其中每个标签与所述多个标签线中的相应的标签线相关联,并且所述多个标签被划分成不重叠的标签组;以及
存储分派部件,其被配置为执行伪先进先出标签替换即伪FIFO标签替换,其中在一个时钟周期期间,针对可用标签线对所述多个标签组中的标签组进行搜索,并且当在所述标签组中进行搜索未找到可用标签线时,在下一时钟周期期间,针对可用标签线对所述多个标签组的下一标签组进行搜索。
9.根据权利要求8所述的加标签的存储器系统,其中对所述标签组进行搜索开始于所述标签组中的紧接在与先前搜索中分派的标签线相关联的标签之后的标签。
10.根据权利要求8所述的加标签的存储器系统,其中当在所述标签组中找到可用标签线时,分派所述标签线,并且将指针设置到与下一标签线相关联的标签。
11.根据权利要求8所述的加标签的存储器系统,其中所述多个标签线包括三十二个标签线,每个标签线具有相关联的标签,并且每个标签组包括八个标签。
12.根据权利要求8所述的加标签的存储器系统,其中所述加标签的存储器系统被包括在处理器的流引擎中。
13.根据权利要求6所述的加标签的存储器系统,其中优先级编码器被用于搜索标签组中的标签。
14.根据权利要求8所述的加标签的存储器系统,其中在所述时钟周期期间针对两个可用标签线对所述标签组进行搜索,并且当在所述第一标签组中进行搜索未找到两个可用标签线时,在所述下一时钟周期期间针对两个可用标签线对所述下一标签组进行搜索。
15.一种加标签的存储器系统,包括:
多个标签线;
多个标签,其中每个标签与所述多个标签线中的相应的标签线相关联,并且所述多个标签被划分成不重叠的标签组;以及
存储分派部件,其被配置为以轮循顺序对所述多个标签组中的每个标签组进行搜索,直到定位到可用标签线或已搜索了所有标签组为止,其中所述搜索开始于包括与先前搜索中分派的标签线相关联的标签的标签组,并且其中在单个时钟周期中对每个搜索到的标签组进行搜索。
16.根据权利要求15所述的加标签的存储器系统,其中所述存储分派部件进一步被配置为使用优先级编码器来搜索每个标签组。
17.根据权利要求15所述的加标签的存储器系统,其中所述多个标签线包括三十二个标签线,每个标签线具有相关联的标签,并且每个标签组包括八个标签。
18.根据权利要求15所述的加标签的存储器系统,其中所述加标签的存储器系统被包括在处理器的流引擎中。
19.根据权利要求15所述的加标签的存储器系统,其中所述存储分派部件进一步被配置为针对两个可用标签线对每个标签组进行搜索,直到在同一标签组中定位到两个可用标签线或者已搜索了所有标签组为止。
20.根据权利要求15所述的加标签的存储器系统,其中所述加标签的存储器系统被包括在数字信号处理器中。
Applications Claiming Priority (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201962851418P | 2019-05-22 | 2019-05-22 | |
US62/851,418 | 2019-05-22 | ||
US16/589,108 US11113208B2 (en) | 2019-05-22 | 2019-09-30 | Pseudo-first in, first out (FIFO) tag line replacement |
US16/589,108 | 2019-09-30 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111984318A true CN111984318A (zh) | 2020-11-24 |
Family
ID=73442194
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010435337.0A Pending CN111984318A (zh) | 2019-05-22 | 2020-05-21 | 伪先进先出(fifo)标签线替换 |
Country Status (2)
Country | Link |
---|---|
US (1) | US12019561B2 (zh) |
CN (1) | CN111984318A (zh) |
Family Cites Families (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5347642A (en) | 1989-11-30 | 1994-09-13 | Nec Electronics Inc. | Cache memory management unit |
US5893121A (en) | 1997-04-23 | 1999-04-06 | Sun Microsystems, Inc. | System and method for swapping blocks of tagged stack entries between a tagged stack cache and an untagged main memory storage |
US6606686B1 (en) | 1999-07-15 | 2003-08-12 | Texas Instruments Incorporated | Unified memory system architecture including cache and directly addressable static random access memory |
WO2003088048A1 (en) | 2002-04-08 | 2003-10-23 | University Of Texas System | Non-uniform cache apparatus, systems, and methods |
US7237067B2 (en) | 2004-04-22 | 2007-06-26 | Hewlett-Packard Development Company, L.P. | Managing a multi-way associative cache |
US9690625B2 (en) | 2009-06-16 | 2017-06-27 | Oracle America, Inc. | System and method for out-of-order resource allocation and deallocation in a threaded machine |
US9224186B2 (en) | 2013-09-27 | 2015-12-29 | Apple Inc. | Memory latency tolerance in block processing pipelines |
US9367470B2 (en) | 2013-11-01 | 2016-06-14 | Cisco Technology, Inc. | Bounded cache searches |
US9904645B2 (en) | 2014-10-31 | 2018-02-27 | Texas Instruments Incorporated | Multicore bus architecture with non-blocking high performance transaction credit system |
US9514059B2 (en) | 2014-12-22 | 2016-12-06 | Texas Instruments Incorporated | Hiding page translation miss latency in program memory controller by selective page miss translation prefetch |
US9501412B2 (en) | 2015-02-17 | 2016-11-22 | Gainspan Corporation | External memory tagging and stack ordering of memory tags |
JP2017033446A (ja) | 2015-08-05 | 2017-02-09 | 株式会社リコー | 情報処理システム、情報処理システムの制御方法、及びプログラム |
US10884943B2 (en) | 2018-08-30 | 2021-01-05 | International Business Machines Corporation | Speculative checkin of ERAT cache entries |
-
2020
- 2020-05-21 CN CN202010435337.0A patent/CN111984318A/zh active Pending
-
2022
- 2022-10-21 US US17/970,674 patent/US12019561B2/en active Active
Also Published As
Publication number | Publication date |
---|---|
US20230065512A1 (en) | 2023-03-02 |
US12019561B2 (en) | 2024-06-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11748270B2 (en) | Tracking streaming engine vector predicates to control processor execution | |
US20240296050A1 (en) | Converting a stream of data using a lookaside buffer | |
CN109144568B (zh) | 将有效位通道作为矢量断言暴露于cpu | |
US12045617B2 (en) | Two-dimensional zero padding in a stream of matrix elements | |
US10949206B2 (en) | Transposing a matrix using a streaming engine | |
US11755456B2 (en) | Tracking debug events from an autonomous module through a data pipeline | |
US10942741B2 (en) | Storage organization for transposing a matrix using a streaming engine | |
US20240192956A1 (en) | Inserting predefined pad values into a stream of vectors | |
WO2021067332A1 (en) | Method and apparatus for vector sorting using vector permutation logic | |
US20240184586A1 (en) | Mechanism to queue multiple streams to run on streaming engine | |
WO2020237231A1 (en) | Inserting predefined pad values into a stream of vectors | |
US12019561B2 (en) | Pseudo-first in, first out (FIFO) tag line replacement | |
US11500784B2 (en) | Pseudo-first in, first out (FIFO) tag line replacement |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |