CN108205447A - 使用早期和后期地址以及循环计数寄存器来跟踪架构状态的流引擎 - Google Patents

使用早期和后期地址以及循环计数寄存器来跟踪架构状态的流引擎 Download PDF

Info

Publication number
CN108205447A
CN108205447A CN201711379376.8A CN201711379376A CN108205447A CN 108205447 A CN108205447 A CN 108205447A CN 201711379376 A CN201711379376 A CN 201711379376A CN 108205447 A CN108205447 A CN 108205447A
Authority
CN
China
Prior art keywords
stream
data
instruction
register
memory
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.)
Granted
Application number
CN201711379376.8A
Other languages
English (en)
Other versions
CN108205447B (zh
Inventor
J·茨维西亚克
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Texas Instruments Inc
Original Assignee
Texas Instruments Inc
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Texas Instruments Inc filed Critical Texas Instruments Inc
Priority to CN202211481556.8A priority Critical patent/CN115827065A/zh
Publication of CN108205447A publication Critical patent/CN108205447A/zh
Application granted granted Critical
Publication of CN108205447B publication Critical patent/CN108205447B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0875Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches with dedicated cache, e.g. instruction or stack
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/32Address formation of the next instruction, e.g. by incrementing the instruction counter
    • G06F9/322Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address
    • G06F9/325Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address for loops, e.g. loop detection or loop counter
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0862Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches with prefetch
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0893Caches characterised by their organisation or structure
    • G06F12/0897Caches characterised by their organisation or structure with two or more cache hierarchy levels
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F13/00Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • G06F13/14Handling requests for interconnection or transfer
    • G06F13/16Handling requests for interconnection or transfer for access to memory bus
    • G06F13/1668Details of memory controller
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3004Arrangements for executing specific machine instructions to perform operations on memory
    • G06F9/30047Prefetch instructions; cache control instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3824Operand accessing
    • G06F9/383Operand prefetching
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0806Multiuser, multiprocessor or multiprocessing cache systems
    • G06F12/0811Multiuser, multiprocessor or multiprocessing cache systems with multilevel cache hierarchies
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/10Address translation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/10Providing a specific technical effect
    • G06F2212/1016Performance improvement
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/45Caching of specific data in cache memory
    • G06F2212/452Instruction code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/45Caching of specific data in cache memory
    • G06F2212/454Vector or matrix data
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/60Details of cache memory
    • G06F2212/6026Prefetching based on access pattern detection, e.g. stride based prefetch

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Advance Control (AREA)

Abstract

一种在数字数据处理器(100)中使用的流引擎(125,200),其指定由多个嵌套循环定义的固定只读数据流。地址生成器(1901)生成数据元素的地址。流首寄存器(2718,2728)存储接下来要提供给功能单元的以作为操作数使用的数据元素。该流引擎(125,2700)为嵌套循环中的每一个存储接下来要取回的数据元素的早期地址和该流首寄存器(2718,2728)中的数据元素的后期地址。该流引擎(125,2700)为嵌套循环中的每一个存储接下来要取回的数据元素的早期循环计数(3701‑3704)和该流首寄存器(2718,2728)中的数据元素的后期循环计数(3705‑3708)。

Description

使用早期和后期地址以及循环计数寄存器来跟踪架构状态的 流引擎
相关申请
本申请的专利申请是对于2014年7月15日提交的名称为《高度集成的可扩展的柔性DSP百万模块架构(HIGHLY INTEGRATED SCALABLE,FLEXIBLE DSP MEGAMODULEARCHITECTURE)》的美国专利申请序列号14/331,986的改进,其要求2013年7月15日提交的美国临时专利申请序列号61/846,148的优先权。
技术领域
本发明的技术领域是数字数据处理,并且更具体地说是用于操作数取回的流引擎(streaming engine)的控制。
背景技术
现代数字信号处理器(DSP)面临着多重挑战。工作量不断增加,需要增加带宽。片上系统(SOC)的尺寸和复杂性不断增加。内存(memory)系统延迟严重影响某些类别的算法。随着晶体管越来越小,内存和寄存器变得不太可靠。随着软件栈越来越大,潜在的交互和错误的数量变得越来越大。
内存带宽和调度对于在实时数据上操作的数字信号处理器是个问题。在实时数据上操作的数字信号处理器通常接收输入数据流,对数据流执行过滤功能(例如编码或解码)并输出经过转换的数据流。该系统被称为实时,因为如果转换的数据流在调度时不可用于输出,则应用程序失效。典型的视频编码需要可预测但非连续的输入数据模式。在可用的地址生成和内存访问资源中,对应的内存访问通常很难实现。一个典型的应用程序需要内存访问来加载数据寄存器堆(register file)中的数据寄存器,并且然后提供给执行数据处理的功能单元。
发明内容
本发明是在数字信号处理器中使用的流引擎。通过在控制寄存器中存储对应的参数来指定固定的数据流序列。数据流包括多个嵌套循环(nested loop)。一旦开始,数据流是只读的,不能被写入。这通常对应于实时过滤操作的需要。
流引擎包括产生数据元素地址的地址生成器和存储接下来要提供给功能单元以作为操作数使用的数据元素的流首寄存器/流磁头寄存器(stream head register)。流引擎在流缓冲器中取回中央处理单元内核使用之前的流数据。
该流引擎包括早期地址寄存器,其存储接下来要从内存中取回的数据元素的流内存地址,和后期地址寄存器,其存储与存储在流磁头寄存器/流首寄存器(stream headregister)中的数据元素对应的流内存地址。早期地址寄存器和后期地址寄存器两者都存储用于嵌套循环的地址。
流引擎包括早期计数寄存器,其存储用于与接下来要从内存中取回的数据元素相对应的每个嵌套循环的计数,和后期计数寄存器,其存储与存储在所述流首寄存器中的数据元素对应的每个嵌套循环的计数。早期计数寄存器和后期计数寄存器两者最初存储对应于循环计数的数据,所述循环计数以等于在流模板寄存器(stream template register)中指定的对应嵌套循环的循环计数的量改变所述内存地址。
附图说明
在附图中示出了本发明的这些和其他方面,其中:
图1示出了根据本发明一个实施例的双标量/矢量数据路径处理器;
图2示出了图1中所示的双标量/矢量数据路径处理器中的寄存器和功能单元;
图3示出了全局标量寄存器堆;
图4示出了由算术功能单元共享的本地标量寄存器堆;
图5示出了由乘法功能单元共享的本地标量寄存器堆;
图6示出了由加载/存储单元共享的本地标量寄存器堆;
图7示出了全局矢量寄存器堆;
图8示出了断定(predicate)寄存器堆;
图9示出了由算术功能单元共享的本地矢量寄存器堆;
图10示出了由乘法和相关功能单元共享的本地矢量寄存器堆;
图11示出了根据本发明的一个优选实施例的中央处理单元的流水线(pipeline)阶段;
图12示出了单个取回包的16个指令;
图13示出了本发明使用的指令的指令编码的示例;
图14示出了条件码扩展槽(slot)0的位编码;
图15示出了条件码扩展槽1的位编码;
图16示出了常数扩展槽0的位编码;
图17是示出了常数扩展的部分框图;
图18示出了根据本发明的用于SIMD操作的进位控制;
图19示出了本发明的流引擎的概念图;
图20示出了矢量中的通道(lane)分配的第一示例;
图21示出了矢量中的通道分配的第二示例;
图22示出了基本的二维流;
图23示出了图21的示例流内的元素的顺序;
图24示出了从较大的矩形中提取较小的矩形;
图25示出了流引擎如何以4字节的转置粒度取回该示例的流;
图26示出了流引擎如何以8字节的转置粒度取回该示例的流;
图27示出了本发明的流引擎的细节;
图28示出了本发明的流模板寄存器;
图29示出了本发明的流模板寄存器的标志字段的子字段定义;
图30示出了显示本发明的数据的流引擎供应的部分示意图;
图31示出了存储数据流的一个实施例的概念图;
图32示出了流引擎中的数据缓冲器的高速缓存架构的细节(现有技术);
图33是示出循环0的早期地址和早期循环计数的生成的局部示意图;
图34是示出早期地址生成器的操作的流程图;
图35是示出循环0的后期地址和后期循环计数的生成的局部示意图;
图36是示出后期地址生成器的操作的流程图;
图37示出了存储早期循环计数和后期循环计数的扩展控制寄存器的示例性位分配;
图38示出了存储早期地址和后期地址的扩展控制寄存器的示例性位分配;
图39示出了扩展控制寄存器的示例性位分配,所述扩展控制寄存器存储在流引擎中产生错误的取回的虚拟地址;
图40示出了扩展控制寄存器的示例性位分配,所述扩展控制寄存器存储了详述检测到的错误的性质的数据;
图41示出了本发明的错误检测和校正;
图42是示出了本发明的取回滞后可应用的多处理器多存储器系统的示意图;
图43是示出了包括采用滞后的优先级技术的本发明的一种示例性实施例的硬件的局部示意图;以及
图44是示出了采用滞后的优先权技术的流程图。
具体实施方式
图1示出了根据本发明的一个优选实施例的双标量/矢量数据路径处理器。处理器100包括分离的一级指令高速缓存(L1I)121和一级数据高速缓存(L1D)123。处理器100包括保存指令和数据两者的二级组合指令/数据高速缓存(L2)130。图1示出了一级指令高速缓存121与二级组合指令/数据高速缓存130之间的连接(总线142)。图1示出了一级数据高速缓存123与二级组合指令/数据高速缓存130之间的连接(总线145)。在处理器100的优选实施例中,二级组合指令/数据高速缓存130存储用于备份一级指令高速缓存121的指令和用于备份一级数据高速缓存123的数据两者。在优选实施例中,二级组合指令/数据高速缓存130以图1中未示出的方式进一步连接到较高级高速缓存和/或主内存。在优选实施例中,中央处理单元内核110、一级指令高速缓存121、一级数据高速缓存123和二级组合指令/数据高速缓存130形成在单个集成电路上。该单个集成电路可选地包括其他电路。
中央处理单元内核110根据指令取回单元111所控制从一级指令高速缓存121中取回指令。指令取回单元111确定要执行的接下来的指令,并且调用取回包大小的这种指令集。取回包的性质和大小在下面进一步详述。如本领域中已知的,在高速缓存命中(cachehit)时(如果这些指令被存储在一级指令高速缓存121中),指令直接从一级指令高速缓存121取回。在高速缓存未命中(cache miss)时(指定的指令取回包未存储在一级指令高速缓存121中),在二级组合高速缓存130中寻找这些指令。在优选实施例中,一级指令高速缓存121中的高速缓存行的大小等于取回包的大小。这些指令的内存位置是二级组合高速缓存130中的命中或未命中。命中由二级组合高速缓存130提供服务。未命中由较高级别的高速缓存(未示出)或由主内存(未示出)提供服务。如本领域所知,所请求的指令可同时提供给一级指令高速缓存121和中央处理单元内核110两者以加速使用。
在本发明的优选实施例中,中央处理单元内核110包括多个功能单元,所述功能单元执行指令指定的数据处理任务。指令分派(instruction dispatch)单元112确定每个取回的指令的目标功能单元。在优选实施例中,中央处理单元110作为能够在对应功能单元中同时操作多个指令的超长指令字(VLIW)处理器进行操作。优选地,编译器在一起执行的执行包中组织指令。指令分派单元112将每个指令指向其目标功能单元。分配给指令的功能单元完全由编译器生成的指令指定。中央处理单元内核110的硬件未参与这个功能单元分配。在优选实施例中,指令分派单元112可以在多个指令上并行操作。这种并行指令的数量由执行包的大小来设置。这将在下面进一步详述。
指令分派单元112的分派任务的一部分确定是在标量数据路径侧A115还是矢量数据路径侧B 116中的功能单元上执行。每个指令中被称为s位的指令位确定哪个数据路径是指令控制的。这将在下面进一步详述。
指令解码单元113解码当前执行包中的每个指令。解码包括识别执行指令的功能单元、识别可能的寄存器堆中的提供用于对应的数据处理操作的数据的寄存器以及识别对应的数据处理操作的结果的寄存器目的地。如下面进一步解释的,指令可以包括代替一个寄存器编号操作数字段的常数字段。该解码的结果是用于控制目标功能单元以执行由指定数据上的对应指令指定的数据处理操作的信号。
中央处理单元内核110包括控制寄存器114。控制寄存器114以与本发明无关的方式存储用于控制标量数据路径侧A115和矢量数据路径侧B 116中的功能单元的信息。该信息可以是模式信息等。
来自指令解码113的解码指令和存储在控制寄存器114中的信息被提供给标量数据路径侧A115和矢量数据路径侧B 116。结果,标量数据路径侧A115和矢量数据路径侧B116内的功能单元对指令指定数据执行指令指定的数据处理操作并将结果存储在指令指定的一个或更多个数据寄存器中。标量数据路径侧A115和矢量数据路径侧B 116中的每一个包括优选并行操作的多个功能单元。这些将在下面结合图2进一步详述。在标量数据路径侧A 115与矢量数据路径侧B 116之间存在允许数据交换的数据路径117。
中央处理单元内核110进一步包括非基于指令的模块。仿真单元118允许响应于指令确定中央处理单元内核110的机器状态。这个功能通常会用于算法开发。中断/异常单元119使得中央处理单元内核110能够对外部异步事件(中断)做出响应,并对执行不正确的操作的尝试(异常)作出响应。
中央处理单元内核110包括流引擎125。流引擎125将来自通常高速缓存在二级组合高速缓存130中的预定地址的两个数据流提供给矢量数据路径侧B的寄存器堆。这提供了从内存(如在二级组合高速缓存130中的高速缓存)直接到功能单元操作数输入的控制数据移动。这在下面进一步详述。
图1示出了各部分之间的总线的示例性数据宽度。一级指令高速缓存121经由总线141向指令取回单元111提供指令。总线141优选地是512位总线。总线141从一级指令高速缓存121到中央处理单元内核110是单向的。二级组合高速缓存130经由总线142向一级指令高速缓存121提供指令。总线142优选地是512位总线。总线142从二级组合高速缓存130到一级指令高速缓存121是单向的。
一级数据高速缓存123经由总线143与标量数据路径侧A 115中的寄存器堆交换数据。总线143优选地是64位总线。一级数据高速缓存123经由总线144与矢量数据路径侧B116中的寄存器堆交换数据。总线144优选地是512位总线。总线143和144被示出为双向支持中央处理单元内核110的数据读取和数据写入两者。一级数据高速缓存123经由总线145与二级组合高速缓存130交换数据。总线145优选地是512位总线。总线145被示出为用于中央处理单元内核110的数据读取和数据写入两者的双向支持高速缓存服务。
二级组合高速缓存130经由总线146将第一数据流的数据提供给流引擎125。总线146优选地是512位总线。流引擎125经由总线147将该第一数据流的数据提供给矢量数据路径侧B 116的功能单元。总线147优选地是512位总线。二级组合高速缓存130经由总线148将第二数据流的数据提供给流引擎125。总线148优选地是512位总线。流引擎125经由总线149将该第二数据流的数据提供给矢量数据路径侧B 116的功能单元。总线149优选地是512位总线。根据本发明的优选实施例,总线146,147,148和149被示出为从二级组合高速缓存130到流引擎125以及矢量数据路径侧B 116是单向的。
在本发明的优选实施例中,根据名称为《包括高速缓存和直接可寻址的静态随机存储器的统一的内存系统架构(UNIFIED MEMORY SYSTEM ARCHITECTURE INCLUDING CACHEAND DIRECTLY ADDRESSABLE STATIC RANDOM ACCESS MEMORY)》的第6,606,686号美国专利,一级数据高速缓存123和二级组合高速缓存130两者可被配置为选定数量的高速缓存或直接可寻址内存。
图2示出了标量数据路径侧A 115和矢量数据路径侧B 116内的功能单元和寄存器堆的进一步细节。标量数据路径侧A 115包括全局标量寄存器堆211、L1/S1本地寄存器堆212、M1/N1本地寄存器堆213和D1/D2本地寄存器堆214。标量数据路径侧A 115包括L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元237。矢量数据路径侧B 116包括全局矢量寄存器堆231、L2/S2本地寄存器堆232、M2/N2/C本地寄存器堆233和断定寄存器堆234。矢量数据路径侧B 116包括L2单元241、S2单元242、M2单元243、N2单元244、C单元245和P单元246。哪些功能单元可以从哪些寄存器堆读取或写入哪些寄存器堆是有限制的。这些将在下面详述。
标量数据路径侧A 115包括L1单元221。L1单元221通常接受两个64位操作数并产生一个64位结果。两个操作数各自从全局标量寄存器堆211或L1/S1本地寄存器堆212中的指令指定寄存器中被调用。L1单元221优选地执行以下指令选择操作:64位加/减操作;32位最小/最大操作;8位单指令多数据(SIMD)指令,如绝对值之和,最小值和最大值的确定;循环最小/最大操作;和寄存器堆之间的各种移动操作。该结果可写入全局标量寄存器堆211、L1/S1本地寄存器堆212、M1/N1本地寄存器堆213或D1/D2本地寄存器堆214的指令指定寄存器中。
标量数据路径侧A 115包括S1单元222。S1单元222通常接受两个64位操作数并产生一个64位结果。两个操作数各自从全局标量寄存器堆211或L1/S1本地寄存器堆212中的指令指定寄存器中被调用。S1单元222优选地执行与L1单元221相同类型的操作。在L1单元221和S1单元222所支持的数据处理操作之间,可选地可以有稍微的变化。该结果可写入全局标量寄存器堆211、L1/S1本地寄存器堆212、M1/N1本地寄存器堆213或D1/D2本地寄存器堆214的指令指定寄存器中。
标量数据路径侧A 115包括M1单元223。M1单元223通常接受两个64位操作数并产生一个64位结果。两个操作数各自从全局标量寄存器堆211或M1/N1本地寄存器堆213中的指令指定寄存器中被调用。M1单元223优选地执行以下指令选择操作:8位乘法操作;复数点乘积操作;32位位计数操作;复共轭乘法运算;和位逻辑运算、移动、相加和相减。该结果可写入全局标量寄存器堆211、L1/S1本地寄存器堆212、M1/N1本地寄存器堆213或D1/D2本地寄存器堆214的指令指定寄存器中。
标量数据路径侧A 115包括N1单元224。N1单元224通常接受两个64位操作数并产生一个64位结果。两个操作数各自从全局标量寄存器堆211或M1/N1本地寄存器堆213中的指令指定寄存器中被调用。N1单元224优选地执行与M1单元223相同类型的操作。可以有一些双重操作(称为双重发布指令),其一起使用M1单元223和N1单元224两者。该结果可写入全局标量寄存器堆211、L1/S1本地寄存器堆212、M1/N1本地寄存器堆213或D1/D2本地寄存器堆214的指令指定寄存器中。
标量数据路径侧A 115包括D1单元225和D2单元237。D1单元225和D2单元237通常各自接受两个64位操作数,并各自产生一个64位结果。D1单元225和D2单元237通常执行地址计算和对应的加载和存储操作。D1单元225用于64位的标量加载和存储。D2单元237用于512位的矢量加载和存储。D1单元225和D2单元237还优选地执行:对加载和存储的数据交换、打包和解包;64位SIMD算术运算;和64位位逻辑运算。D1/D2本地寄存器堆214将通常存储用于对应的加载和存储的地址计算中的基地址和偏移地址。两个操作数各自从全局标量寄存器堆211或D1/D2本地寄存器堆214中的指令指定寄存器中调用。计算结果可以写入全局标量寄存器堆211、L1/S1本地寄存器堆212、M1/N1本地寄存器堆213或D1/D2本地寄存器堆214的指令指定寄存器中。
矢量数据路径侧B 116包括L2单元241。L2单元221通常接受两个512位操作数并产生一个512位结果。两个操作数各自从全局矢量寄存器堆231、L2/S2本地寄存器堆232或断定寄存器堆234中的指令指定寄存器中被调用。除了较宽的512位数据之外,L2单元241优选地执行与L1单元221类似的指令。该结果可写入全局矢量寄存器堆231、L2/S2本地寄存器堆222、M2/N2/C本地寄存器堆233或断定寄存器堆234的指令指定寄存器中。
矢量数据路径侧B 116包括S2单元242。S2单元242通常接受两个512位操作数并产生一个512位结果。两个操作数各自从全局矢量寄存器堆231、L2/S2本地寄存器堆232或断定寄存器堆234中的指令指定寄存器中被调用。除了较宽的512位数据之外,S2单元242优选地执行与S1单元222类似的指令。该结果可写入全局矢量寄存器堆231、L2/S2本地寄存器堆222、M2/N2/C本地寄存器堆233或断定寄存器堆234的指令指定寄存器中。可以有一些双重操作(称为双重发布指令),其一起使用L2单元241和S2单元242两者。该结果可写入全局矢量寄存器堆231、L2/S2本地寄存器堆232或M2/N2/C本地寄存器堆233的指令指定寄存器中。
矢量数据路径侧B 116包括M2单元243。M2单元243通常接受两个512位操作数并产生一个512位结果。两个操作数各自从全局矢量寄存器堆231或M2/N2/C本地寄存器堆233中的指令指定寄存器中调用。除了较宽的512位数据之外,M2单元243优选执行与M1单元222类似的指令。该结果可写入全局矢量寄存器堆231、L2/S2本地寄存器堆232或M2/N2/C本地寄存器堆233的指令指定寄存器中。
矢量数据路径侧B 116包括N2单元244。N2单元244通常接受两个512位操作数并产生一个512位结果。两个操作数各自从全局矢量寄存器堆231或M2/N2/C本地寄存器堆233中的指令指定寄存器中调用。N2单元244优选地执行与M2单元243相同类型的操作。可以有一些双重操作(称为双重发布指令),其一起使用M2单元243和N2单元244两者。该结果可写入全局矢量寄存器堆231、L2/S2本地寄存器堆232或M2/N2/C本地寄存器堆233的指令指定寄存器中。
矢量数据路径侧B 116包括C单元245。C单元245通常接受两个512位操作数并产生一个512位结果。两个操作数各自从全局矢量寄存器堆231或M2/N2/C本地寄存器堆233中的指令指定寄存器中调用。C单元245优选地执行:“rake”和“搜索”指令;多达512个2位PN*8位乘以I/Q复数乘以每个时钟周期;8位和16位绝对差和(SAD)的计算,每个时钟周期多达512个SAD;水平相加和水平最小/最大指令;和矢量置换指示。C单元245还包括用于控制C单元245指令的某些操作的4个矢量控制寄存器(CUCR0至CUCR3)。在某些C单元245操作中,控制寄存器CUCR0至CUCR3被用作操作数。优选地使用控制寄存器CUCR0至CUCR3:控制一般置换指令(VPERM);并作为SIMD多重DOT(点)乘积操作(DOTPM)和SIMD多重绝对差和(SAD)操作的掩码。控制寄存器CUCR0优选地用于存储伽罗瓦字段乘法运算(Galios Field Multiplyoperation,GFMPY)的多项式。控制寄存器CUCR1优选地用于存储伽罗瓦字段多项式生成器功能。
矢量数据路径侧B 116包括P单元246。P单元246对本地断定寄存器堆234的寄存器执行基本逻辑运算。P单元246具有直接访问以读取和写入断定寄存器堆234。这些操作包括AND(与)、ANDN(与非)、OR(或)、XOR(异或)、NOR(或非)、BITR、NEG(求补)、SET(设置)、BITCNT(计数)、RMBD、BIT Decimate(位抽取)和Expand(扩展)。P单元246的通常预期的用途包括对用于控制另一个SIMD矢量操作的SIMD矢量比较结果的操作。
图3示出了全局标量寄存器堆211。有16个独立的64位宽标量寄存器,标记为A0至A15。全局标量寄存器堆211的每个寄存器可以作为64位标量数据被读取或写入。所有标量数据路径侧A 115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元237)都可以读或写全局标量寄存器堆211。全局标量寄存器堆211可以作为32位或64位被读取,并且只可以作为64位被写入。指令执行确定读取的数据大小。在下面将详细描述的限制下,矢量数据路径侧B 116功能单元(L2单元241、S2单元242、M2单元243、N2单元244、C单元245和P单元246)可以经由交叉路径117从全局标量寄存器堆211读取。
图4示出了D1/D2本地寄存器堆214。有16个独立的64位宽标量寄存器,标记为D0至D16。D1/D2本地寄存器堆214的每个寄存器可以作为64位标量数据读出或写入。所有标量数据路径侧A 115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元237)都可以写入全局标量寄存器堆211。只有D1单元225和D2单元237可以从D1/D1本地标量寄存器堆214读取。预计存储在D1/D2本地标量寄存器堆214中的数据将包括在地址计算中使用的基地址和偏移地址。
图5示出了L1/S1本地寄存器堆212。图5所示出的实施例具有8个独立的64位宽标量寄存器,标记为AL0至AL7。优选的指令编码(参见图13)允许L1/S1本地寄存器堆212包括多达16个寄存器。图5的实施例仅实现8个寄存器以减小电路的尺寸和复杂度。L1/S1本地寄存器堆212的每个寄存器可以作为64位标量数据读出或写入。所有标量数据路径侧A 115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元237)都可以写入L1/S1本地标量寄存器堆212。只有L1单元221和S1单元222可以从L1/S1本地标量寄存器堆212读取。
图6示出了M1/N1本地寄存器堆213。图6所示出的实施例具有8个独立的64位宽标量寄存器,标记为AM0至AM7。优选的指令编码(参见图13)允许M1/N1本地寄存器堆213包括多达16个寄存器。图6的实施例仅实现8个寄存器以减小电路的尺寸和复杂度。M1/N1本地寄存器堆213的每个寄存器可以作为64位标量数据读出或写入。所有标量数据路径侧A 115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元237)都可以写入M1/N1本地标量寄存器堆213。只有M1单元223和N1单元224可以从M1/N1本地标量寄存器堆213读取。
图7示出了全局矢量寄存器堆231。有16个独立的512位宽标量寄存器。全局矢量寄存器堆231的每个寄存器可以作为标记为B0至B15的64位标量数据被读取或写入。全局矢量寄存器堆231的每个寄存器可以作为标记为VB0至VB15的512位矢量数据被读取或写入。指令类型确定数据大小。所有的矢量数据路径侧B 116功能单元(L2单元241、S2单元242、M3单元243、N2单元244、C单元245和P单元246)可以读或写全局标量寄存器堆231。在以下将详述的限制下,标量数据路径侧A 115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元237)可以经由交叉路径117从全局矢量寄存器堆231读取。
图8示出了P本地寄存器堆234。有8个独立的64位宽的寄存器,被标记为P0至P15。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矢量操作。
图9示出了L2/S2本地寄存器堆232。图9中所示出的实施例具有8个独立的512位宽的标量寄存器。优选的指令编码(参见图13)允许L2/S2本地寄存器堆232包括多达16个寄存器。图9的实施例仅实现8个寄存器以减小电路的尺寸和复杂度。L2/S2本地矢量寄存器堆232的每个寄存器可以作为标记为BL0至BL7的64位标量数据读取或写入。L2/S2本地矢量寄存器堆232的每个寄存器可以作为标记为VBL0至VBL7的512位矢量数据读取或写入。指令类型确定数据大小。所有的矢量数据路径侧B 116功能单元(L2单元241、S2单元242、M2单元233、N2单元244、C单元245和P单元246)可以写入L2/S2本地矢量寄存器堆232。只有L2单元241和S2单元242可以从L2/S2本地矢量寄存器堆232读取。
图10示出了M2/N2/C本地寄存器堆233。图10中所示出的实施例具有8个独立的512位宽标量寄存器。优选的指令编码(参见图13)允许L1/S1本地寄存器堆212包括多达16个寄存器。图10的实施例仅实现8个寄存器以减小电路的尺寸和复杂度。M2/N2/C本地矢量寄存器堆233的每个寄存器可以作为标记为BM0至BM7的64位标量数据读取或写入。M2/N2/C本地矢量寄存器堆233的每个寄存器可以作为标记为VBM0至VBM7的512位矢量数据读取或写入。所有的矢量数据路径侧B 116功能单元(L2单元241、S2单元242、M2单元243、N2单元244、C单元245和P单元246)可以写入M2/N2/C本地矢量寄存器堆233。只有M2单元233、N2单元244和C单元245可以从M2/N2/C本地矢量寄存器堆233读取。
提供一侧的所有功能单元可访问的全局寄存器堆和由一侧的仅仅一些功能单元可访问的本地寄存器堆是设计的选择。本发明可以仅采用与所公开的全局寄存器堆对应的一种类型的寄存器堆来实施。
交叉路径117允许标量数据路径侧A 115与矢量数据路径侧B 116之间的有限数据交换。在每个操作周期期间,可以从全局标量寄存器堆A 211中调用一个64位数据字,以用作矢量数据路径侧B 116的一个或更多个功能单元的操作数,并且可以从全局矢量寄存器堆231中调用一个64位数据字,以用作标量数据路径侧A 115的一个或更多个功能单元的操作数。任何标量数据路径侧A 115功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元237)均可以从全局矢量寄存器堆231中读取64位操作数。该64位操作数是全局矢量寄存器堆232的被访问的寄存器中的512位数据的最低有效位。多个标量数据路径侧A 115功能单元可以在相同的操作周期期间使用与操作数相同的64位交叉路径数据。然而,在任何单个操作周期中,只有一个64位操作数被从矢量数据路径侧B 116传送到标量数据路径侧A 115。任何矢量数据路径侧B 116功能单元(L2单元241、S2单元242、M2单元243、N2单元244、C单元245和P单元246)均可以从全局标量寄存器堆211读取64位操作数。如果对应的指令是标量指令,则交叉路径操作数数据被视为任何其他64位操作数。如果对应的指令是矢量指令,则操作数的高448位被填零。多个矢量数据路径侧B 116功能单元可以在相同的操作周期期间使用相同的64位交叉路径数据作为操作数。在任何单个操作周期中,只有一个64位操作数从标量数据路径侧A 115传送到矢量数据路径侧B 116。
流引擎125在某些受限制的情况下传输数据。流引擎125控制两个数据流。流由一系列特定类型的元素组成。对流进行操作的程序依次读取数据,依次对每个元素进行操作。每个流都有以下基本属性。流数据具有定义明确的(well-defined)开始时间和结束时间。流数据在整个流中具有固定的元素大小和类型。流数据具有固定序列的元素。因此程序不能在流内随机搜索。流数据在活动时是只读的。程序不能在从流读取的同时写入流。一旦流被打开,流引擎125就:计算地址;从二级统一高速缓存(其可能需要来自更高级别的内存中的高速缓存服务)中取回已定义的数据类型;执行如零扩展、符号扩展、如矩阵变换等数据元素排序/交换等的数据类型操作;并将数据直接传递到中央处理单元内核110内的编程的数据寄存器堆。因此,流引擎125对于表现良好的数据的实时数字滤波操作是有用的。流引擎125从对应的中央处理单元内核110释放这些内存取回任务,从而启用其他处理功能。
流引擎125提供以下益处。流引擎125允许多维内存访问。流引擎125增加了功能单元的可用带宽。由于流缓冲器绕过一级数据高速缓存123,因此流引擎125最小化高速缓存未命中停顿(stall)的数量。流引擎125减少维持循环所需的标量操作的数量。流引擎125管理地址指针。流引擎125处理地址生成,自动释放地址生成指令槽和D1单元224和D2单元237,用于其它计算。
中央处理单元内核110在指令流水线上操作。指令取回自下面进一步描述的固定长度的指令包。所有指令都需要相同数量的流水线阶段进行取回和解码,但需要执行阶段的数量不尽相同。
图11示出了以下流水线阶段:程序取回阶段1110、分派和解码阶段1110以及执行阶段1130。程序取回阶段1110包括用于所有指令的三个阶段。分派和解码阶段包括用于所有指令的三个阶段。执行阶段1130包括依赖于指令的一至四个阶段。
取回阶段1110包括程序地址生成阶段1111(PG)、程序访问阶段1112(PA)和程序接收阶段1113(PR)。在程序地址生成阶段1111(PG)期间,程序地址在中央处理单元内核110中生成,并且读取请求被发送到一级指令高速缓存L1I的内存控制器。在程序访问阶段1112(PA)期间,一级指令高速缓存L1I处理该请求,访问其内存中的数据,并向中央处理单元内核110边界(boundary)发送取回包。在程序接收阶段1113(PR)期间,中央处理单元内核110注册取回包。
指令总是取回的16个32位宽槽,一次构成一个取回包。图12示出了单个取回包的16个指令1201至1216。取回包在512位(16字)边界上对齐。优选实施例采用固定的32位指令长度。由于几个原因,固定长度指令是有利的。固定长度指令实现简单的解码器对齐。正确对齐的指令取回可以将多个指令加载到并行指令解码器中。当存储在与固定的指令包取回相联接(coupled)的内存(在512位边界上对齐的取回包)时,可以通过预定的指令对齐来实现这种正确对齐的指令取回。对齐的指令取回允许并行解码器在指令大小的取回位上操作。可变长度指令需要在其可以解码前定位每个指令边界的初始步骤。固定长度指令集通常允许指令字段的更规则的布局。这简化了每个解码器的构造,这对于广泛发布的VLIW中央处理器是有利的。
各个指令的执行部分地由每个指令中的p位控制。这个p位优选地是32位宽的槽的位0。p位确定指令是否与下一个指令并行执行。指令从较低地址到较高地址进行扫描。如果指令的p位是1,则下一个指令(更高的内存地址)(在与该指令相同的周期内)与该指令并行执行。如果指令的p位是0,则在指令之后的周期中执行下一个指令。
中央处理单元内核110和一级指令高速缓存L1I 121流水线相互不联接/解耦(de-coupled)。来自一级指令高速缓存L1I的取回包返回可以采取不同数量的时钟周期,这取决于诸如在一级指令高速缓存121中存在命中还是在二级组合高速缓存130中存在命中的外部情况。因此,程序访问阶段1112(PA)可能需要若干时钟周期,而不是像其他阶段中那样需要一个时钟周期。
并行执行的指令构成执行包。在优选实施例中,执行包可以包括多达十六个指令。执行包中没有两个指令可以使用相同的功能单元。槽是五种类型之一:1)在中央处理单元内核110的功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225、D2单元237、L2单元241、S2单元242、M2单元243、N2单元244、C单元245和P单元246)的一个上执行的独立(self-contained)指令;2)无单位指令,例如NOP(无操作)指令或多个NOP指令;3)分支指令;4)常数的字段扩展;和5)有条件的代码扩展。下面将进一步解释这些槽类型中的一些。
调度和解码阶段1110包括指令分派到适当的执行单元阶段1121(DS)、指令预解码阶段1122(D1)和指令解码、操作数读取阶段1222(D2)。在指令分派到适当的执行单元阶段1121(DS)期间,取回包被分成执行包并分配给适当的功能单元。在指令预解码阶段1122(D1)期间,源寄存器、目的地寄存器和相关路径被解码以执行功能单元中的指令。在指令解码期间,操作数读取阶段1222(D2)更详细地进行单元解码,以及从寄存器堆中读取操作数。
执行阶段1130包括执行阶段1131至1135(E1至E5)。不同类型的指令需要不同数量的这些阶段才能完成执行。流水线的这些阶段在理解中央处理单元内核110周期边界处的装置状态方面起着重要的作用。
在执行1阶段1131(E1)期间,评估指令的条件并操作操作数。如图11所示,执行1阶段1131可以从流缓冲器1141和示意性地示出为1142的寄存器堆之一接收操作数。对于加载和存储指令,执行地址生成并且将地址修改写入寄存器堆。对于分支指令,PG阶段的分支取回包受到影响。如图11所示,加载和存储指令访问在此处示意性地示出为内存1151的内存。对于单周期指令,结果被写入目的地寄存器堆。这假设指令的任何条件被评估为真。如果条件被评估为假,则在执行1阶段1131之后,该指令不写入任何结果或不具有任何流水线操作。
在执行2阶段1132(E2)期间,加载指令将地址发送到内存。存储指令将地址和数据发送到内存。饱和结果的单周期指令会在发生饱和时在控制状态寄存器(CSR)中设置SAT位。对于2个周期的指令,结果写入目的地寄存器堆。
在执行3阶段1133(E3)期间,执行数据内存访问。饱和结果的任何乘法指令会在饱和发生时在控制状态寄存器(CSR)中设置SAT位。对于3个周期的指令,结果被写入目的地寄存器堆。
在执行4阶段1134(E4)期间,加载指令将数据带到中央处理单元内核110边界。对于4个周期指令,结果被写入目的地寄存器堆。
在执行5阶段1135(E5)期间,加载指令将数据写入寄存器。这在图11中示意性地示出为来自内存1151的输入到执行5阶段1135。
图13示出了本发明使用的功能单元指令的指令编码1300的示例。本领域技术人员将认识到,其他指令编码是可行的并且在本发明的范围内。每个指令由32位组成,并且控制单独可控制的功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225、D2单元237、L2单元241、S2单元242、M2单元243、N2单元244、C单元245和P单元246)之一的操作。位字段定义如下。
creg字段1301(位29至31)和z位1302(位28)是在条件指令中使用的可选字段。这些位用于条件指令来识别断定寄存器和条件。z位1302(位28)指示预测是否基于断定寄存器中的零或非零。如果z=1,则测试用于具有零的等式。如果z=0,则测试用于非零。creg=0和z=0的情况被视为始终为真,以允许无条件的指令执行。creg字段1301和z字段1302如表1所示在指令中被编码。
表1
条件指令的执行取决于存储在指定数据寄存器中的值。该数据寄存器在用于所有功能单元的全局标量寄存器堆211中。注意,z位列中的“z”是指上述的零/非零比较选择,并且“x”是无关状态。这种编码只能将16个全局寄存器的一个子集指定为断定寄存器。这个选择是为了保留指令编码中的位。注意,无条件指令没有这些可选位。对于无条件指令,字段1301和1302(28至31)中的这些位优选地用作附加的操作码位。
dst字段1303(位23至27)指定对应的寄存器堆中的寄存器作为指令结果的目的地。
src2/cst字段1304(位18至22)根据指令操作码字段(所有指令的位4至12以及无条件指令的附加位28至31)具有多个含义。第一个含义是将对应的寄存器堆的寄存器指定为第二操作数。第二个含义是直接常量。根据指令类型,这被视为无符号整数并且零扩展到指定的数据长度,或被视为有符号的整数并且符号扩展到指定的数据长度。
src1字段1305(位13至17)指定对应寄存器堆中的寄存器作为第一源操作数。
所有指令的操作码(opcode)字段1306(位4至12)(以及无条件指令的附加位28至31)指定指令的类型并指定适当的指令选项。这包括使用的功能单元和执行的操作的明确指定。除了下面详述的指令选项之外,操作码的详细解释超出了本发明的范围。
e位1307(位2)仅用于可以扩展常量的直接常数指令。如果e=1,则直接常数以下面详述的方式扩展。如果e=0,则直接常数不被扩展。在这种情况下,直接常数由src2/cst字段1304(位18至22)来指定。注意,这个e位1307仅用于某些指令。因此,通过适当的编码,该e位1307可以从不需要它的指令中省略,并且该位用作附加的操作码位。
s位1307(位1)指定标量数据路径侧A 115或矢量数据路径侧B 116。如果s=0,则选择标量数据路径侧A 115。这将功能单元限制于图2所示的L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元237以及对应的寄存器堆。类似地,s=1选择矢量数据路径侧B 116,将功能单元限制为图2所示出的L2单元241、S2单元242、M2单元243、N2单元244、P单元246和对应的寄存器堆。
p位1308(位0)标记执行包。p位确定指令是否与下列指令并行执行。p位从低地址到高地址进行扫描。如果对于当前指令,p=1,则下一个指令与当前指令并行执行。如果对于当前指令,p=0,则在当前指令之后的周期中执行下一个指令。所有并行执行的指令构成一个执行包。一个执行包可以包括多达十二个指令。执行包中的每个指令都必须使用不同的功能单元。
存在两个不同的条件代码扩展槽。每个执行包可以包括这些唯一的32位条件代码扩展槽中的每一个,其包括相同执行包中的指令的4位creg/z字段。图14示出了条件码扩展槽0的编码,且图15示出条件码扩展槽1的编码。
图14示出了具有32位的条件码扩展槽0的编码。字段1401(位28至31)在相同的执行包中指定分配给L1单元221指令的4个creg/z位。字段1402(位27至24)在相同的执行包中指定分配给L2单元241指令的4个creg/z位。字段1403(位19至23)在相同的执行包中指定分配给S1单元222指令的4个creg/z位。字段1404(位16至19)在相同的执行包中指定分配给S2单元242指令的4个creg/z位。字段1405(位12至15)在相同的执行包中指定分配给D1单元225指令的4个creg/z位。字段1406(位8至11)在相同的执行包中指定分配给D2单元245指令的4个creg/z位。字段1407(位6和7)未使用/保留。字段1408(位0至5)被编码为一组唯一位(CCEX0),以识别条件码扩展槽0。一旦检测到条件码扩展槽0的该唯一ID,就采用对应的creg/z位来控制在相同的执行包中的任何L1单元221、L2单元241、S1单元222、S2单元242、D1单元224和D2单元225指令的有条件执行。这些creg/z位的解释如表1所示。如果对应的指令是有条件的(包括creg/z位),则条件码扩展槽0中的对应位会覆盖指令中的条件码位。注意,执行包不能有多于一个指令指向一个特定执行单元。指令的执行包不可包括多于一个条件码扩展槽0。因此,creg/z位到功能单元指令的映射是明确的。将creg/z位设置为等于“0000”将使指令无条件。因此,适当编码的条件码扩展槽0可以使一些对应的指令有条件并使一些指令无条件。
图15示出了具有32位的条件码扩展槽1的编码。字段1501(位28至31)在相同的执行包中指定分配给M1单元223指令的4个creg/z位。字段1502(位27至24)在相同的执行包中指定分配给M2单元243指令的4个creg/z位。字段1503(位19至23)在相同的执行包中指定分配给C单元245指令的4个creg/z位。字段1504(位16至19)在相同的执行包中指定分配给N1单元224指令的4个creg/z位。字段1505(位12至15)在相同的执行包中指定分配给N2单元244指令的4个creg/z位。字段1506(位5至11)未使用/保留。字段1507(位0至5)被编码为一组唯一位(CCEX1),以识别条件码扩展槽1。一旦检测到条件码扩展槽1的该唯一ID,就采用对应的creg/z位来控制在相同的执行包中任何M1单元223、M2单元243、C单元245、N1单元224和N2单元244指令的有条件执行。这些creg/z位的解释如表1所示。如果对应的指令是有条件的(包括creg/z位),则条件码扩展槽1中的对应位会覆盖指令中的条件码位。注意,执行包不能有多于一个指令指向一个特定的执行单元。指令的执行包不可包括多于一个条件码扩展槽1。因此,creg/z位到功能单元指令的映射是明确的。将creg/z位设置为等于“0000”使指令无条件。因此,适当编码的条件码扩展槽1可以使一些指令有条件并使一些指令无条件。
条件码扩展槽0和条件码扩展槽1两者都可以包括p位,以定义如上面结合图13所述的执行包。在优选实施例中,如图14和图15所示,码扩展槽0和条件码扩展槽1优选地具有始终编码为1的位0(p位)。因此,条件码扩展槽0和条件码扩展槽1都不能位于执行包的最后一个指令槽中。
存在两个不同的常数扩展槽。每个执行包可以包括这些唯一的32位常数扩展槽中的每一个,其包括待作为高阶位与5位常数字段1305连接的27位,以形成32位常数。如在上面的指令编码描述中所指出的,只有一些指令将src2/cst字段1304定义为常数而不是源寄存器标识符。这些指令中的至少一些可以使用常数扩展槽来将该常数扩展到32位。
图16示出了常数扩展槽0的字段。每个执行包可以包括常数扩展槽0的一个实例和常数扩展槽1的一个实例。图16示出了常数扩展槽0 1600包括两个字段。字段1601(位5至31)构成扩展的32位常数的最高有效27位,其包括作为五个最低有效位的目标指令scr2/cst字段1304。字段1602(位0至4)被编码为一组唯一位(CSTX0)以标识常数扩展槽0。在优选实施例中,常数扩展槽0 1600只能用于扩展相同执行包中的L1单元221指令、D1单元225指令中的数据、S2单元242指令、D2单元237指令中的偏移量、M2单元243指令、N2单元244指令、分支指令或C单元245指令中的一个的常数。除了位0至4被编码为一组唯一位(CSTX1)以标识常数扩展槽1外,常数扩展槽1类似于常数扩展槽0。在优选实施例中,常数扩展槽1只能用于扩展在相同的执行包中的L2单元241指令、D2单元237指令中的数据、S1单元222指令、D1单元225指令中的偏移量、M1单元223指令或N1单元224指令中的一个的常数。
常数扩展槽0和常数扩展槽1的使用方法如下。目标指令必须是允许常数规格的类型。如本领域中已知的,这是通过用常数的最低有效位替换一个输入操作数寄存器指定字段来实现的,如上面关于scr2/cst字段1304所描述的那样。指令解码器113确定这种情况,称为来自指令操作码位的直接字段。目标指令还包括专用于发信号通知是否不扩展指定常数(优选地,常数扩展位=0)或者扩展常数(优选地,常数扩展位=1)的一个常数扩展位(e位1307)。如果指令解码器113检测到常数扩展槽0或常数扩展槽1,则它进一步检查该执行包内的其它指令,用于对应于检测到的常数扩展槽的指令。只有一个对应的指令具有等于1的常数扩展位(e位1307)时才进行常数扩展。
图17是示出了常数扩展的部分框图1700。图17假定指令解码器113在相同的执行包中检测到常数扩展槽和对应的指令。指令解码器113将来自常数扩展槽(位字段1601)的27个扩展位和来自对应指令的5个常量位(位字段1305)提供给连接器1701。连接器1701从这两个部分形成单个32位字。在优选实施例中,来自常数扩展槽(位字段1601)的27个扩展位是最高有效位,并且5个常数位(位字段1305)是最低有效位。该组合的32位字被提供给多路复用器1702的一个输入。来自对应指令字段1305的5个常数位将第二输入提供给多路复用器1702。多路复用器1702的选择由常数扩展位的状态控制。如果常数扩展位(e位1307)是1(扩展的),则多路复用器1702选择连接的32位输入。如果常数扩展位是0(未扩展的),则多路复用器1702从对应的指令字段1305中选择5个常数位。多路复用器1702将该输出提供给符号扩展单元1703的输入。
符号扩展单元1703从来自多路复用器1703的输入中形成最终操作数值。符号扩展单元1703接收控制输入标量/矢量和数据大小。标量/矢量输入指示对应的指令是标量指令还是矢量指令。数据路径侧A 115的功能单元(L1单元221、S1单元222、M1单元223、N1单元224、D1单元225和D2单元237)只能执行标量指令。指向这些功能单元之一的任何指令都是标量指令。数据路径侧B功能单元L2单元241、S2单元242、M2单元243、N2单元244和C单元245可以执行标量指令或矢量指令。指令解码器113根据操作码位确定指令是标量指令还是矢量指令。P单元246只可以执行标量指令。数据大小可以是8位(字节B)、16位(半字H)、32位(字W)或64位(双字D)。
表2列出了各种选项的符号扩展单元1703的操作。
表2
常数扩展槽0和常数扩展槽1两者都可以包括p位,以定义如上面结合图13所述的执行包。在优选实施例中,如条件码扩展槽的情况那样,常数扩展槽0和常数扩展槽1优选地具有始终编码为1的位0(p位)。因此,常数扩展槽0和常数扩展槽1都不能位于执行包的最后一个指令槽中。
在执行包中包括常数扩展槽0或1以及标记为常数扩展(e位=1)的多于一个对应的指令在技术上是可行的。对于常数扩展槽0,这将意味着在执行包中的L1单元221指令、D1单元225指令中的数据、S2单元242指令、D2单元237指令中的偏移量、M2单元243指令或N2单元244指令于中的多于一个具有为1的e位。对于常数扩展槽1,这意味着在执行包中的L2单元241指令、D2单元237指令中的数据、S1单元222指令、D1单元225指令中的偏移量、M1单元223指令或N1单元224指令中的多于一个具有为1的e位。向多于一个指令提供相同的常数扩展不被认为是有用的功能。因此,在一个实施例中,指令解码器113可以确定这种情况是无效操作并且不被支持。或者,该组合可以通过应用于标记为常数扩展的每个对应功能单元指令的常数扩展槽的扩展位来支持。
特殊矢量断定指令使用断定寄存器堆234中的寄存器来控制矢量操作。在当前实施例中,所有这些SIMD矢量断定指令对选定的数据大小进行操作。数据大小可以包括字节(8位)数据、半字(16位)数据、字(32位)数据、双字(64位)数据、四字(128位)数据和半矢量(256位)数据。断定寄存器的每一位控制是否对对应的数据字节执行SIMD操作。P单元245的操作允许基于多于一个矢量比较的各种复合矢量SIMD操作。例如,可以使用两个比较来确定范围。候选矢量与具有在第一数据寄存器内打包的范围的最小值的第一矢量参考进行比较。候选矢量的第二比较是利用具有在第二数据寄存器内打包的范围的最大值的第二参考矢量来进行的。两个结果断定寄存器的逻辑组合将允许矢量条件操作来确定候选矢量的每个数据部分是在范围内还是在范围之外。
L1单元221、S1单元222、L2单元241、S2单元242和C单元245通常以单指令多数据(SIMD)模式操作。在这种SIMD模式下,相同的指令被应用于来自两个操作数的打包数据。每个操作数保存设置在预定槽中的多个数据元素。SIMD操作是通过在数据边界的进位控制来启用的。这种进位控制可以在不同的数据宽度上进行操作。
图18示出了进位控制。与门1801在操作数宽算术逻辑单元(标量数据路径侧A 115功能单元为64位,矢量数据路径侧B 116功能单元为512位)内接收位N的进位输出。与门1801还接收将在下面进一步解释的进位控制信号。与门1801的输出被提供给操作数宽算术逻辑单元的位N+1的进位输入。诸如与门1801的与门设置在可能的数据边界的每一对位之间。例如,对于8位数据,这种与门将位于位7和8之间、位15和16之间、位23和24之间等。每个这种与门接收对应的进位控制信号。如果数据大小是最小值,则每个进位控制信号为0,有效地阻止相邻位之间的进位传送。如果所选数据大小需要两个算术逻辑单元部分,则对应的进位控制信号为1。下面的表3示出了用于512位宽操作数的情况下的示例进位控制信号,其例如可以被分成8位、16位、32位、64位、128位或256位的矢量数据路径侧B 116功能单元所使用。在表3中,高32位控制高位(位128至511)进位,并且低32位控制低位(位0至127)进位。不需要控制最高有效位的进位输出,因此只需要63个进位控制信号。
表3
对于2的整数幂(2N)的数据大小操作在本领域中是常见的。然而,这种进位控制技术不限于2的整数幂。本领域技术人员将会理解如何将该技术应用于其他数据大小和其他操作数宽度。
图19示出了本发明的流引擎的概念图。图19示出了单个流的过程。流引擎1900包括流地址生成器1901。流地址生成器1901依序生成流的元素的地址,并将这些元素地址提供给系统内存1910。内存1910调用存储在元素地址处的数据(数据元素),并将这些数据元素提供到数据先进先出(FIFO)内存1902。数据FIFO 1902在内存1910和CPU 1920之间提供缓冲。数据格式器1903从数据FIFO内存1902接收数据元素并根据流定义提供数据格式化。这个过程将在下面描述。流引擎1900将来自数据格式化器1903的格式化的数据元素提供给CPU 1920。CPU 1920上的程序消耗该数据并产生输出。
流元素通常驻留在正常的内存中。内存本身不在流上施加特定的结构。程序通过指定以下流属性来定义流,从而施加结构:流的第一个元素的地址;流中元素的大小和类型;流中的数据的格式化;和与该流相关的地址序列。
流引擎根据遍历内存的指针来定义流的元素的地址序列。多级嵌套循环控制指针所采用的路径。循环级别的迭代计数表示级别重复的次数。维度(dimension)给出了该循环级别的指针位置之间的距离。
在基本的前向流中,最内层的循环总是消耗来自内存的物理上连续的元素。这个最内层循环的隐含维度是1个元素。指针本身以连续增加的顺序从一个元素移动到另一个元素。在内部循环之外的每个级别,该循环根据该循环级别的维度的大小将指针移动到新的位置。
这种寻址形式允许程序在少量参数中指定规则路径通过内存。表4列出了基本流的寻址参数。
表4
上面的定义将流的连续元素映射到内存中的增加地址。这适用于大多数算法,但不是全部。一些算法通过以减少内存地址的逆向流寻址读取元素来更好地服务。例如,离散卷积计算矢量点积,按照公式:
在大多数DSP代码中,f[]和g[]表示内存中的阵列。对于每个输出,该算法在正向读取f[],但是在相反方向读取g[]。实际的过滤器将[x]和[t-x]的索引范围限制为有限个元素。为了支持这种模式,流引擎支持按递减地址顺序读取元素。
矩阵乘法给流引擎带来了独特的问题。矩阵乘积中的每个元素是第一个矩阵的行与第二个矩阵的列之间的矢量点积。程序通常都以行主顺序或列主顺序来存储矩阵。行主顺序将单个行的所有元素连续存储在内存中。列主顺序将单个列的所有元素连续存储在内存中。矩阵通常以与语言的默认阵列顺序相同的顺序存储。结果,矩阵乘法中的两个矩阵中只有一个映射到流引擎的二维流定义。在一个典型的示例中,第一索引遍历阵列第一阵列上的列但是第二阵列上的行。这个问题对于流引擎并不是唯一的。矩阵乘法的访问模式与大多数通用目的的内存层次结构相差甚远。一些软件库转置了两个矩阵中的一个,以便在乘法期间都可以按行(或按列)访问。流引擎支持利用转置流的隐式矩阵转置。转置流避免了显式转换内存中数据的成本。流引擎不是按严格的连续元素顺序访问数据,而是按照遍历顺序有效地交换内部两个循环维度,沿着第二维度将元素取回到连续的矢量通道中。
这个算法是有效的,但对于小的元素大小来说实施起来是不切实际的。一些算法在矩阵瓦片(tile)上工作,这些矩阵瓦片是多列和多行的。因此,流引擎定义了一个单独的转置粒度。硬件强加一个最小的粒度。转置粒度也必须至少与元素大小一样大。转置粒度导致流引擎沿着维度1移动之前根据维度0取回一个或更多个连续元素。当粒度等于元素大小时,这将导致从行主阵列取回单个列。否则,粒度指定从行主阵列中一次取回2、4或更多列。这也适用于通过交换描述中的行和列用于列主布局。参数GRANULE表示以字节为单位的转置粒度。
另一种常见的矩阵乘法技术交换矩阵乘法的最内层的两个循环。由此产生的内部循环不再读取一个矩阵的列,而读取另一个矩阵的行。例如,该算法可以吊起(hoist)一个项到内循环之外,用标量值替换它。在矢量机上,最内层的循环可以非常有效地用单个标量乘矢量(scalar-by-vector)乘法,然后是矢量加法实施。本发明的中央处理单元内核110没有标量乘矢量乘法。相反,程序必须在整个矢量长度上复制标量值,并使用矢量乘矢量(vector-by-vector)乘法。本发明的流引擎直接支持这种以及具有元素复制模式的相关使用模型。在这种模式下,流引擎读取小于全矢量大小的粒子,并复制该粒子以填充下一个矢量输出。
流引擎将每个复数作为具有两个子元素的单个元素来处理,这两个子元素给出复数的实部和虚部(矩形)或大小和角度(极坐标)部分。并不是所有的程序或外设都同意这些子元素应该在内存中出现的顺序。因此,流引擎提供了交换复数的两个子元素的能力,而无需花费成本。此特征交换元素的一半而不解释元素的内容,并可用于交换任何类型的子元素对,而不仅仅是复数。
算法通常更喜欢以高精度工作,但是高精度值需要比低精度值更多的存储和带宽。通常,程序将以低精度将数据存储在内存中,将这些值提升(promote)到更高的精度用于计算,然后将这些值降级以降低精度用于存储。流引擎通过允许算法指定一级类型的提升来直接支持这一点。在本发明的优选实施例中,对于整数类型,每个子元素可以被提升为具有符号或零扩展的下一个较大类型的大小。流引擎可以支持浮点提升,分别将16位浮点值和32位浮点值提升为32位格式和64位格式也是可行的。
流引擎将流定义为数据元素的离散序列,中央处理单元内核110消耗在矢量中连续打包的数据元素。矢量尽可能类似于流,它们包括具有一些隐式序列的多个同类元素。因为流引擎读取流,但是中央处理单元内核110消耗矢量,所以流引擎必须以一致的方式将流映射到矢量上。
矢量由相同大小的通道组成,每条通道包括一个子元素。中央处理单元内核110将矢量的最右侧的通道指定为通道0,而不管装置的当前端模式(endian mode)。通道数从右到左增加。矢量中实际的通道数量根据矢量的长度和子元素的数据大小而变化。
图20示出了矢量中的通道分配的第一示例。矢量2000分为8个64位通道(8x64位=512位矢量长度)。通道0包括位0至63;行1包括位64至125;通道2包括位128至191;通道3包括位192至255,通道4包括位256至319,通道5包括位320至383,通道6包括位384至447,并且通道7包括位448至511。
图21示出了矢量中的通道分配的第二示例。矢量2100分为16个32位通道(16x32位=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至387;通道12包括位388至415;通道13包括位416至447;通道14包括位448至479;并且通道15包括位480至511。
流引擎将最内层的流维度直接映射到矢量通道。它将该维度中较早的元素映射到较低的通道编号,然后将后期元素映射到较高的通道编号。不管这个特定的流在增加还是减少地址顺序方面是否提升,情况都是如此。无论流定义的顺序如何,流引擎都会按照增加的通道顺序在矢量中存储元素。对于非复数数据,它将第一个矢量中央处理单元内核110取回的第一个元素置于通道0中,第二个置于通道1中,等等。对于复数数据,流引擎将第一个元素放置在通道0和1中,第二个放置在通道2和3中,等等。元素中的子元素保持相同的相对顺序,而不管流方向如何。对于未交换的复数元素,这将每对中具有较低地址的子元素置于偶数号通道中,并将每对中具有较高地址的子元素置于奇数号通道中。交换的复数元素反转了这种映射。
流引擎填充每个矢量中央处理单元内核110,从最内部的流维度取回尽可能多的元素。如果最内层维度不是矢量长度的倍数,那么流引擎就用零将该维度拉长到矢量长度的整数倍。因此,对于高维流,来自外维的每次迭代的第一个元素到达矢量的通道0。流引擎始终将最内层维度映射到矢量中的连续通道。对于转置流,最里面的维度由沿着维度1而不是维度0的子元素的组构成,因为转置交换了这两个维度。
与一维流相比,二维流显示出很大的变化。基本的二维流从较大的矩形中取回较小的矩形。转置的二维流将逐列读取矩形,而不是逐行读取。其中第二维重叠的循环流首先执行重复循环的有限脉冲响应(FIR)滤波器抽头或提供输入样本的滑动窗口的FIR滤波器样本。
图22示出了基本的二维流。由ELEM_BYTES、ICNT0、DIM1和ICNT1表示的内部的两个维度给出足够的灵活性来描述从具有维度2211和2212的较大矩形2210中取回具有维度2221和2222的较小矩形2220。在该示例中,矩形2220是9乘13的64位值的矩形,并且矩形2210是更大的11乘19矩形。以下流参数定义了这个流:
ICNT0=9
ELEM_BYTES=8
ICNT1=13
DIM1=88(11乘以8)
因此,0维2221中的迭代计数是9。在1方向2222上的迭代计数是13。注意,ELEM_BYTES仅缩放(scale)最内维。第一维具有大小为ELEM_BYTES的ICNT0元素。流地址生成器不缩放外部维度。因此,DIM1=88,即11个元素,每个元素以8个字节进行缩放。
图23示出了这个示例流中元素的顺序。流引擎按照顺序2300所示的顺序取回流的元素。前9个元素来自矩形2220的第一行,从左到右从1跳到8跳。第10个元素到第24个元素来自第二行,等等。当流从第9个元素移动到第10个元素时(图23中的跳9),流引擎根据在内部循环开始时的指针位置计算新的位置,而不是结束于在第一个维度结束时的指针所处的位置。这使DIM1独立于ELEM_BYTES和ICNT0。DIM1总是表示每个连续行的第一字节之间的距离。
在维度0之前,转置的流沿着维度1访问。以下示例示出了若干的转置的流,改变了转置粒度。图24示出了从具有尺寸2411和2412的较大矩形2410(14x13)中提取具有尺寸2421和2422的较小矩形2420(12x8)。在图24中,ELEM_BYTES等于2。
图25示出了流引擎如何以4字节的转置粒度取回该示例的流;取回模式2500从每一行取回元素对(因为4的粒度是2的ELEM_BYTES的两倍),否则向下移动列。一旦到达一对列的底部,就会用下一对列重复这个模式。
图26示出了流引擎如何以8字节的转置粒度取回该示例的流。整体结构保持相同。在移动到列中的下一行之前,流引擎从每行取回4个元素(因为8的粒度是2的ELEM_BYTES的四倍),如取回模式2600所示的那样。
到目前为止,检查的流只是从内存中读取每个元素恰好一次。流可以多次从内存中读取给定的元素,实际上在一段内存上进行循环。FIR滤波器具有两种常见的循环模式。FIR为每个输出重新读取相同滤波器抽头。FIR也从滑动窗口读取输入样本。两个连续的输出将需要来自两个重叠窗口的输入。
图27示出了流引擎2700的细节。流引擎2700包括三个主要部分:流02710;流12720;和共享L2接口2730。流0 2710和流1 2720都包括并行操作的相同硬件。流0 2710和流1 2720均共享L2接口2730。每个流2710和2720在每个周期向中央处理单元内核110提供高达512位/周期。流引擎架构通过其专用流路径和共享双L2接口来实现这一点。
每个流引擎2700包括专用的四维流地址生成器2711/2721,其各自每个周期可以生成一个新的未对齐的请求。地址生成器2711/2721输出512位对齐的地址,其与由流参数定义的序列中的元素重叠。这将在下面进一步描述。
每个地址生成器2711/2711连接到专用的微观表格旁视(look-aside)缓冲器(μTLB)2712/2722。μTLB 2712/2722每个周期将单个48位虚拟地址转换为44位物理地址。每个μTLB 2712/2722有8个条目,包括4kB页面的最小32kB或2MB页面的最大16MB。每个地址生成器2711/2721每个周期产生2个地址。μTLB 2712/2722每个周期只转换1个地址。为了保持吞吐量,流引擎2700利用了这样的事实,即大多数流参考将在相同的4kB页面内。因此,地址转换不会修改地址的位0至11。如果在相同的4kB的页面中aout0和aout1线(aout0[47:12]与aout1[47:12]相同),则μTLB 2712/2722只转换aout0和重新使用两个地址的高位的转换。
转换的地址在命令队列2713/2723中排队。这些地址与来自对应的存储分配和跟踪块2714/2724的信息对齐。流引擎2700不显式地管理μTLB2712/2722。系统内存管理单元(MMU)在上下文切换(context switch)期间根据需要使μTLB失效。
存储分配和跟踪2714/2724管理流的内部存储,发现数据重用并跟踪每个数据段的生命周期。这将在下面进一步描述。
参考队列2715/2725存储由对应的地址生成器2711/2721生成的参考序列。该信息驱动数据格式化网络,使得它可以以正确的顺序向中央处理单元内核110呈现数据。参考队列2715/2725中的每个条目包括从数据存储中读取数据并将其与中央处理单元内核110对齐所需的信息。参考队列2715/2725在每个槽中维护表5中列出的以下信息:
表5
当地址生成器2711/2721生成新地址时,存储分配和跟踪2714/2724在参考队列2715/2725中插入参考。当数据变为可用并且在流保存寄存器中有空间时,存储分配和跟踪2714/2724从参考队列2715/2725中移除参考。当存储分配和跟踪2714/2724从参考队列2715/2725中移除槽参考并格式化数据时,它检查参考是否代表对对应槽的最后参考。存储分配和跟踪2714/2724将参考队列2715/2725移除指针与槽记录的最后参考进行比较。如果它们匹配,则存储分配和跟踪2714/2724将标记槽在数据完成后不活动。
流引擎2700具有用于任意数量的元素的数据存储2716/2737。深度缓冲允许流引擎在数据流中提前取回,隐藏内存系统延迟。正确的缓冲量可能因产品生产之间的不同而不同。在当前优选实施例中,流引擎2700将32个槽用于每个流。每个槽容纳64个字节的数据。
蝶形网络(butterfly network)2717/2727由7阶段的蝶形网络组成。蝶形网络2717/2727接收128字节的输入并产生64字节的输出。蝶形的第一阶段实际上是半个阶段。它从两个槽中收集匹配非对齐取回的字节,并将它们合并为一个旋转的64字节阵列。其余6个阶段形成一个标准的蝶形网络。蝶形网络2717/2727执行以下操作:将下一个元素向下旋转到字节通道0;如果需要,用一个2的幂数来提升数据类型;如果需要,交换复数的实部和虚部分量;如果中央处理单元内核110目前处于大端模式,则将大端转换为小端。用户指定作为流参数的一部分的元素大小、类型提升和实部/需部交换。
流引擎2700尝试在中央处理单元内核110对其的需求之前取回和格式化数据,使得其可以保持全部吞吐量。保持寄存器2718/2728提供少量的缓冲,以使进程保持完全流水线。除了流引擎2700提供全部吞吐量的事实之外,保持寄存器2718/2728不直接在架构上可见。
两个流2710/2720共享一对独立的L2接口2730:L2接口A(IFA)2733和L2接口B(IFB)2734。每个L2接口直接向L2控制器提供512位/周期吞吐量,用于1024位/周期的集合带宽。L2接口使用基于信用的多核总线架构(MBA)协议。L2控制器为每个接口分配自己的命令信用池。池应该有足够的信用,以便在读取L2RAM、L2高速缓存和多核共享内存控制器(MSMC)RAM时每个接口都可以发送足以实现完全的读取返回带宽的请求。
为了使性能最大化,两个流都可以使用两个L2接口,从而允许单个流发送2个请求/周期的峰值命令速率。每个接口都优选一个流而不是另一个流,但是这个优选会根据请求而动态变化。IFA 2733和IFB 2734总是优选相反的流,当IFA 2733优选流0时,IFB 2734优选流1,反之亦然。
每个接口2733/2734之前的仲裁器2731/2732在其具有可用信用的每个周期应用以下基本协议。仲裁器2731/2732检查优选流是否有准备发送的命令。如果是,仲裁器2731/2732选择该命令。仲裁器2731/2732接下来检查备用流是否有至少两个请求准备发送或者有一个命令且没有信用。如果是,仲裁器2731/2732从备用流中取回命令。如果任一接口发出命令,优选流和备用流的意图(notion)将针对下一个请求进行交换。使用这个简单的算法,这两个接口会尽可能快地分派请求,同时保持两个流之间的公平性。第一条规则确保每个流可以在具有可用信用的每个周期发送请求。第二条规则提供了一个机制:当第二个接口空闲时,一个流借用另一个接口。第三条规则通过两个接口扩展每个流的带宽需求,确保两个接口本身都不会成为瓶颈。
粗粒旋转器2735/2736使流引擎2700能够支持转置的矩阵寻址模式。在这种模式下,流引擎2700交换其多维循环的两个最内层维度。这逐列而不是逐行访问阵列。旋转器2735/2736在架构上不可见,除了当启用这种转置访问模式时。
流定义模板提供包括数据的流的完整结构。迭代计数和维度提供了大部分的结构,而各种标志提供了其余的细节。对于所有包括数据的流,流引擎定义了单个流模板。它支持的所有流类型都适合该模板。每个字段上方的数字表示256位矢量内的字节数。流引擎定义了用于寻址流中元素的四级循环嵌套。流模板中的大部分字段直接映射到该算法中的参数。图28示出了流模板寄存器2800。字段上方的数字是512位矢量内的字节数。表6显示了流模板的流字段定义。
表6
在当前的示例中,DIM0总是等于定义物理上连续的数据的ELEM_BYTES。流模板主要包括32位字段。流模板将ICNT3限制为8位,将FLAGS字段限制为24位。流引擎2700将所有迭代计数解释为无符号整数,并将所有维度解释为未经缩放的有符号整数。上面的模板完全指定了元素的类型、流的长度和维度。流指令单独指定开始地址。这通常通过标量寄存器堆211中的标量寄存器指定,该标量寄存器堆211存储该开始地址。这允许程序使用相同的模板打开多个流。
图29示出了标志字段2900的子字段定义。如图29所示,标志字段2900是3字节或24位。图29显示了字段的位数。表7显示了这些字段的定义。
表7
元素类型(ELTYPE)字段2901定义流中元素的数据类型。该字段的四位编码如表8所示进行定义。
表8
子元素大小确定用于类型提升和矢量通道宽度的类型。例如,当流请求类型提升时,16位子元素被提升为32位子元素。当中央处理单元内核110以大端模式操作时,矢量通道宽度是重要的,因为它总是以小端顺序布置矢量。
总元素大小确定流的最小粒度。在流寻址模型中,它确定流最内层循环的每次迭代流取回的字节数。流总是读取整个元素,无论是以增加还是降低的顺序。因此,流的最内部维度跨越ICNT0×总元素大小字节。
实数-复数类型确定流引擎是将每个元素视为实数还是复数的两个部分(实部/虚部或幅度/角度)。该字段还指定是否交换复数的两个部分。复杂类型的总元素大小是其子元素大小的两倍。否则,子元素大小等于总元素大小。
DIR位2902确定内部循环(Loop0)的取回方向。如果DIR位2902是0,那么Loop0取回在朝向增加地址的正向。内循环(Loop0)。如果DIR位2902是1,那么Loop0取回在朝向减少地址的反向。
TRANSPOSE字段2903确定流引擎是否以转置顺序访问流。转置顺序交换内部的两个寻址级别。TRANSPOSE字段还指示它转置流的粒度。该字段的四位编码如表9所示进行定义。
表9
流引擎2700实际上以与元素大小不同的粒度转置。这允许程序从每一行取回多列元素。转置粒度必须不小于元素大小。
PROMOTE字段2904控制流引擎是否提升流中的子元素和提升的类型。当启用时,流引擎2700通过单个2的幂次大小来提升类型。该字段的两位的编码如表10所示进行定义。
PROMOTE 描述
00 无提升
01 无符号整数提升,零扩展。
10 有符号整数提升,符号扩展。
11 浮点提升
表10
当流指定“不提升”时,每个子元素将占用宽度与ELTYPE指定的大小相等的矢量通道。否则,每个子元素占据两倍大的矢量通道。当PROMOTE为00时,流引擎从内存中取回一半的数据以满足相同数量的流取回。
提升模式01b和10b分别将传入的子元素视为无符号整数和有符号整数。对于无符号整数,流引擎通过用零填充新位来提升。对于有符号整数,流引擎通过用符号位的副本填充新位来提升。正的有符号整数具有等于0的最高有效位。在正的有符号整数提升时,新位被填零。负的有符号整数具有等于1的最高有效位。在负的有符号整数提升时,新位被填1。
提升模式11b将传入的子元素视为浮点数字。浮点提升将每个子元素视为浮点类型。流引擎支持两种浮点提升:短浮点(16位)到单精度浮点(32位);单精度浮点(32位)到双精度浮点(64位)。
THROTTLE字段2905控制流引擎在中央处理单元内核110之前取回的积极程度。该字段的两位的编码如表11所示进行定义。
THROTTLE 描述
00 最小化节流,最大化提前取回
01 更少节流,更多提前取回
10 更多节流,更少提前取回
11 最大化节流,最小化提前取回
表11
THROTTLE不会改变流的含义,并且只能作为提示。流引擎可能会忽略此字段。程序不应该依赖特定的节流行为来保证程序的正确性,因为架构没有指定精确的节流行为。THROTTLE允许程序员向硬件提供关于程序自身行为的提示。默认情况下,流引擎试图尽可能远地领先中央处理单元内核110,以隐藏尽可能多的延迟时间,同时向中央处理单元内核110提供全流式吞吐量。尽管几个关键应用程序需要这种级别的吞吐量,它可能会导致针对其他的不佳的系统级别行为。例如,流引擎丢弃通过上下文切换取回的所有数据。因此,在具有大量上下文切换的系统中,积极的提前取回可导致带宽浪费。只有在中央处理单元内核110非常快速地消耗数据时,在这些系统中的积极提前取回是有意义的。
中央处理单元内核110通过少量指令和专用寄存器将流引擎暴露给程序。STROPEN指令打开流。STROPEN命令指定表示打开流0或流1的流号。STROPEN指定存储如上所述流模板的流模板寄存器。表12列出了STROPEN指令的提要。
提要 描述
流开始地址寄存器 存储流开始地址的标量寄存器
流号 流0或流1
流模板寄存器 存储流模板数据的矢量寄存器
表12
流开始地址寄存器优选地是通用标量寄存器堆211中的标量寄存器。STROPEN指令通过其操作码来指定流0或流1。流模板寄存器优选地是通用矢量寄存器堆221中的矢量寄存器。如果指定的流是活动的,则STROPEN指令关闭先前的流并用指定的流代替该流。
STRCLOSE指令关闭流。STRCLOSE命令指定要关闭的流的流号。
STRSAVE指令捕获指定流的足够状态信息以在将来重新启动该流。STRRSTR指令恢复以前保存的流。STRSAVE指令不保存流的任何数据。STRSAVE指令只保存元数据。流响应STRRSTR指令重新取回数据。
流引擎处于以下三种状态之一:不活动的;活动的;或冻结。当不活动时,流引擎什么都不做。任何尝试从无效的流引擎取回数据都是错误。直到程序打开流之前,流引擎是不活动的的。在程序耗用流中的所有元素或程序关闭流之后,流引擎也变为不活动的。使用流的程序显式激活和停用流引擎。结合其自己的显式保存和恢复操作,操作环境通过流引擎的隐式冻结行为来管理跨上下文切换边界的流。
活动的流引擎具有与其关联的流。程序可以从活动的流引擎中取回新的流元素。流引擎保持活动的,直到出现下列之一。当流从流中取回最后一个元素时,它变为不活动的。当程序显式关闭流时,它变为不活动的。当中央处理单元内核110响应中断或异常时,流引擎冻结。在流引擎冻结时,冻结的流引擎捕获恢复流所需的所有状态。流引擎响应于中断和异常而冻结。这结合特殊的指令来保存和恢复冻结的流上下文,以便操作环境可以清楚地切换上下文。当中央处理单元内核110返回到中断的上下文时,冻结的流重新激活。
图30是示出了上述流输入操作数编码的部分示意图3000。图30示出了解码功能单元3020的对应src1输入的一个指令的src1字段1305。这些相同的电路被复制用于src2/cst字段1304和功能单元3020的src2输入。另外,这些电路针对在可以同时分派的执行包内的每个指令被复制。
指令解码器113接收包括指令的src1字段1305的位13至17。操作码字段操作码字段(所有指令的位4至12以及附加的无条件指令的位28至31)明确地指定了对应的功能单元3020。在该实施例中,功能单元3020可以是L2单元241、S2单元242、M2单元243、N2单元244或C单元245。图30中所示出的指令解码器113的相关部分解码src1位字段1305。子解码器3011确定src1位字段1305是否在从00000至01111的范围内。如果是这种情况,子解码器3011将对应的寄存器编号提供给全局矢量寄存器堆231。在该示例中,该寄存器字段是src1位字段1305的四个最低有效位。全局矢量寄存器堆231调用存储在与该寄存器编号对应的寄存器中的数据,并将该数据提供给功能单元3020的src1输入。该解码在本领域中通常是已知的。
子解码器3012确定src1位字段1305是否在从10000至10111的范围内。如果是这种情况,则子解码器3012将对应的寄存器编号提供给对应的本地矢量寄存器堆。如果指令指向L2单元241或S2单元242,则对应的本地矢量寄存器堆是本地矢量寄存器字段232。如果指令指向M2单元243、N2单元244或C单元245,则对应的本地矢量寄存器堆是本地矢量寄存器字段233。在该示例中,该寄存器字段是src1位字段1305的三个最低有效位。本地矢量寄存器堆231调用存储在与该寄存器编号对应的寄存器中的数据,并将该数据提供给功能单元3020的src1输入。对应的本地矢量寄存器堆232/233调用存储在与该寄存器编号对应的寄存器中的数据,并将该数据提供给功能单元3020的src1输入。该解码在本领域中通常是已知的。
子解码器3013确定src1位字段1305是否是11100。如果是这种情况,则子解码器3013将流0读取信号提供给流引擎2700。流引擎2700然后将存储在保持寄存器2718中的流0数据提供给功能单元3020的src1输入。
子解码器3014确定src1位字段1305是否是11101。如果是这种情况,则子解码器3014将流0读取信号提供给流引擎2700。流引擎2700然后将存储在保持寄存器2718中的流0数据提供给功能单元3020的src1输入。子解码器3014还向流0提供提前信号。如前所述,流引擎2700前进以将流0的接下来的顺序数据元素存储在保持寄存器2718中。
子解码器3015确定src1位字段1305是否是11110。如果是这种情况,则子解码器3015将流1读取信号提供给流引擎2700。流引擎2700然后将存储在保持寄存器2728中的流1数据提供给功能单元3020的src1输入。
子解码器3016确定src1位字段1305是否是11111。如果是这种情况,则子解码器3016将流1读取信号提供给流引擎2700。流引擎2700然后将存储在保持寄存器2728中的流1数据提供给功能单元3020的src1输入。子解码器3014还向流1提供提前信号。如前所述,流引擎2700前进以将流2的接下来的顺序数据元素存储在保持寄存器2728中。
响应于src2/cst字段1304的位编码,使用类似的电路来选择提供给功能单元3002的scr2输入的数据。可以以上述方式向功能单元3020的src2输入提供常数输入。
致力于操作数指定的指令位的确切数量以及数据寄存器和数据流的数量是设计选择。本领域技术人员将认识到,在本申请中描述的其他数量选择是可行的。特别是,单个全局矢量寄存器堆的指定和本地矢量寄存器堆的省略是可行的。本发明采用输入操作数选择字段的位编码来指定流读取和另一位编码来指定流读取和前进流。
图31是示出了支持用于流0的取回的流数据的高速缓存存储的组件的部分框图。流1的组件是相似的。数据存储器2716在概念上是数据先进先出(FIFO)缓冲器。在优选实施例中,这个FIFO以高速缓存方式实现,如下所述。
早期地址生成器3101生成内存取回的地址。后期地址生成器3102生成要加载到流首寄存器2718中的接下来的(一个或更多个)元素的地址。流数据存储器2716在从内存的其取回和给中央处理单元内核110的功能单元的提供之间缓存流数据。关于存储在参考队列2515中的数据来控制数据运动。
图32示出了流数据存储器2716中使用的多个高速缓存行的细节。高速缓存结构3200包括代表内部结构的高速缓存行3210、3220和3220。高速缓存行3210、3220和3230包括:地址标签3211;有效位3212;就绪位3213;动作位3214;最近最少使用(LRU)指标3215;奇偶校验位3216;和多个数据字3217。数据字3217的位长度由中央处理单元内核110的最小可寻址数据量设置。这通常是8位/1字节。
高速缓存结构3200存储来自更远的内存的数据,这些内存由多位地址访问。高速缓存结构3200被组织来促进这种存储并且有助于在高速缓存中找到这样的数据。每个高速缓存行3210、3220和3230通常存储2N个相应的数据字3217,其中N是整数。地址标签3211包括用于对应的高速缓存行3210、3220和3230的最高有效地址位。在对应的高速缓存行3210、3220和3230内沿着维度3201的数据字3217的位置用作对应的地址的最低有效位的代理。
为了确定内存访问是否是对高速缓存结构3200内高速缓存的数据(高速缓存命中),高速缓存结构3200将所有高速缓存行的地址标签3211与所访问的内存位置的最高有效位进行比较。在检测到匹配时,沿着维度3201的高速缓存行内的位置对应于允许识别所访问的数据字的地址的最低有效位。
表13记录了有效的、就绪的、活动的和最后的参考字段的特征。
有效的 表示标签地址是否有效的单一位。
就绪的 指示数据已经到达该地址的单一位。
活动的 指示是否有针对该数据的任何未完成的参考的单一位。
最后参考 指示参考队列中此槽的最新参考的值
表13
每个高速缓存行3210、3220和3230包括对应的生效位3212。生效位3212的第一状态指示该高速缓存行的对应数据字3217是生效的。该生效位的相反状态指示对应的数据字3217不生效。存在存储在高速缓存结构3200内的数据是不生效的几种情况。在数字信号处理器系统100的初始激活之后,高速缓存结构3200将不被加载。因此,高速缓存结构3200将不存储生效数据。因此,所有高速缓存行最初被标记为不生效。在高速缓存访问期间,所请求的地址与地址标签3211的比较将不检测匹配,除非对应的生效位3212指示数据是生效的。
每个高速缓存行3210、3220和3230包括对应的就绪位3213。就绪位3213的第一状态指示没有用于对应高速缓存行的数据已经到达。就绪位3213的第二状态指示该高速缓存行的取回数据已经到达。
每个高速缓存行3210、3220和3230包括对应的活动位3214。活动位3214的第一状态指示对于对应高速缓存行的数据的参考是未决的。活动位3214的第二状态指示对于该高速缓存行的数据的参考是未决的。
每个高速缓存行3210、3220和3230包括对应的最后参考字段3215。最后参考字段3215通常是多个位。最后参考字段3215指示参考队列中对该槽的最新参考。如下面进一步详细描述的,这个信息被用于分配高速缓存行。
每个高速缓存行3210、3220和3230包括对应的奇偶校验位3216。下面将描述奇偶校验位3216的生成和使用。
表14详细说明了有效位、就绪位和活动位的相互作用。
表14
使用这个元数据,存储分配和跟踪2714/2724可以识别流中的数据重用机会。存储分配和跟踪2714/2724为每个地址执行以下步骤。它将地址与标签数组中的相关标签进行比较。命中时,它取消与该地址相关的命令。未命中时,它会分配一个空闲槽,设置生效=1,就绪=0,并更新传出命令以将正在取回的数据导向该槽。在任何一种情况下,槽编号都与地址相关联。存储分配和跟踪2714/2724将参考插入参考队列中。存储分配和跟踪2714/2724设置Active(活动的)=1并将Last Reference更新为参考队列中参考的位置。这是插入时参考队列的插入指针的值。该过程将生成的地址转换为表示数据的槽编号。从这一点开始,流引擎不需要直接跟踪地址。
为了最大化重用和最小化停顿,流引擎2700按照以下顺序分配槽:如果以FIFO顺序可用,则为最近分配之后的一个的槽;如果有的话,最低编号可用槽;如果没有可用的槽,则停顿并重复这两个步骤直到分配成功。这将倾向于以FIFO顺序分配槽,但是如果特定的重用模式违背该顺序工作时避免停顿。
图33示出了早期地址生成器3101的部分示意图。早期地址生成器3102形成用于取回对应流引擎的定义流中的下一个元素的地址。开始地址寄存器3201存储数据流的开始地址。如前所述,开始地址寄存器3301优选地是全局标量寄存器堆211中的标量寄存器,其由STROPEN指令指定,该指令打开对应的流。如本领域中已知的,可以从指定的标量寄存器复制该开始地址,并将其本地地存储在对应的地址生成器2711或2721处。该流的第一循环采用Loop0计数寄存器3311、加法器3312、乘法器3313和比较器3314。Loop0计数寄存器3311存储第一循环(Loop0)的迭代计数的工作副本。对于Loop0的每次迭代,加法器3312由下一地址(Next Address)信号触发,将循环计数加1,该循环计数存储在Loop0计数寄存器3311中。乘法器3313将当前循环计数和数量ELEM_BYTES相乘。ELEM_BYTES是循环中每个数据元素的大小(以字节为单位)。Loop0遍历迭代内存中物理连续的数据元素,步长为ELEM_BYTES。
比较器3314将存储在Loop0计数寄存器3311中(在由加法器3313递增之后)的计数与来自对应的流模板寄存器2800的ICNT0 2810的值进行比较。当加法器3312的输出等于流模板寄存器2800的ICNT0 2810的值时,Loop0的迭代完成。比较器3314生成活动的Loop0结束信号。Loop0计数寄存器3311被重置为0,并且触发下一个更高循环的迭代,在这种情况下是Loop1。
较高循环(Loop1,Loop2,Loop3)的电路类似于图33所示出的电路。每个循环包括对应的工作循环计数寄存器、加法器、乘法器和比较器。每个循环的加法器由前一个循环的循环结束信号触发。每个乘法器的第二个输入是对应流模板的对应维度DIM1、DIM2和DIM3。每个循环的比较器将工作循环寄存器计数与对应的流模板寄存器2800的对应迭代值ICNT1、ICTN2和ICTN3进行比较。循环结束信号生成下一个较高循环的迭代。来自loop3的循环结束信号结束流。
图33示出了早期loop0计数的生成。早期loop0计数等于存储在对应工作计数寄存器3311中的更新数据。早期loop0计数在工作loop0计数寄存器3311的每次改变时被更新。类似地生成较高循环(loop1,loop2,loop3)的早期循环计数。
图33示出了早期的loop0地址的生成。早期loop0地址等于从乘法器3313输出的数据。早期loop0地址在工作loop0计数寄存器3311的每次变化时被更新。Loop1、Loop2和Loop3的类似电路生成对应的早期循环地址。
图34A和图34B是一起示出了采用早期地址生成器3101的流的数据取回方式的流程图3400。流程图3400开始于入口点A到测试块3401。测试块3401确定从内存的下一个取回是否是需要的。下面详细说明确定这个的优选方式。如果测试块3201确定不需要内存取回(测试块3201处为否),则该流程循环回到测试块3401以进行另一确定。流程保持在测试块3401处,直到需要内存取回(在测试块3401处为是)。
当需要内存取回时(在测试块3401处为是),块3402执行标签比较。将下一个取回地址的最高有效位与流数据存储器2716中每个高速缓存行的地址标签3211进行比较。如前所述,除非对应的生效位3212指示生效,否则匹配不确认。
测试块3403确定块3402的地址比较是否找到匹配(命中)。如果测试块3403确定匹配(命中)(在测试块3402处为是),则流程前进至块3404。块3404将当前取回地址与生成命中的高速缓存行/槽号相关联。一旦命中,当前取回地址的流数据已经存储在流数据存储器2717中。框3155更新参考队列。对应的参考队列2715或2725存储指示高速缓存内的数据的位置的数据。如前所述,存储在参考队列中的这个数据允许调用对应的首寄存器2718/2728中的矢量并与其对齐。
块3406生成流中的下一个地址。这通常是loop0中的下一个元素。但是,当前的流元素可能是嵌套循环之一的结束。以前面描述的方式根据指定的流数据模式生成下一个地址。流程经由入口点A返回到测试块3401。
在未命中的情况下(测试块3403处为否),与当前取回地址对应的数据不被存储在对应的流数据存储器2616或2726中。进程3400尝试将新的高速缓存行分配给当前取回地址。测试块3407确定高速缓存行是否可用于分配。如下所述,未使用的高速缓存行可能不可用于分配。一旦被分配,高速缓存行只能通过经由中央处理单元内核110消耗从对应的首寄存器2718/2728读取的存储在该高速缓存行中的流数据元素而解除分配。由于数据流的性质,所有先前分配的高速缓存行在对应于当前取回地址的数据之前存储要由中央处理单元内核110使用的数据。因此,高速缓存行不会被驱逐,因为它们存储当前数据之前所需的数据。因此,直到存储在高速缓存行中的所有流数据被中央处理单元内核110消耗之后才能分配该高速缓存行。如下所述,这样的数据消耗是高速缓存行被重新分配的必要但不充分的条件。如果没有高速缓存行可用于分配(在测试块3407处为否),则块3408使流程停顿一个内存周期。进程保持在该循环中,直到至少一个高速缓存行可用于分配(在测试块3407处为是)。
如果至少一个高速缓存行可用于分配(在测试块3407处为是),则测试块3409确定在最后使用的高速缓存行之后的高速缓存行是否可用于分配。如果该高速缓存行可用于分配(在测试块3409处为是),则块3410分配该高速缓存行。如果该高速缓存行不可用于分配(在测试块3409处为否),则块3411分配可用的最低高速缓存行。分配的优选模式是先进先出(FIFO)顺序。因此,要分配的优选高速缓存行是最后使用的高速缓存行之后的高速缓存行。因此,活动的数据将倾向于在中央处理单元内核110的消耗之后分配的高速缓存行内旋转。该分配模式倾向于以FIFO顺序分配槽。上面描述的分配模式(如果最后使用高速缓存行之后的高速缓存行不可用,则分配最低可用高速缓存行)避免了如果特定的数据复用模式针违背该FIFO顺序工作时的停顿。
在为当前取回地址分配高速缓存行时,流程前进到块3412。块3412将刚刚分配的高速缓存行的有效位设置为1、就绪位设置为0并且活动位设置为1。这表明刚刚分配的高速缓存行是有效的、未就绪的、数据正在飞向高速缓存行。下一个块3413为刚刚分配的高速缓存行请求高速缓存服务。在本发明的优选实施例中,流数据绕过L1D高速缓存123并直接从L2高速缓存130请求数据。该设计选择防止流数据干扰中央处理单元内核110使用的其他数据。
测试块3414等待数据返回到流数据存储器2716。数据返回的延迟是未知和可变的。这个新取回的数据可以存储在L2高速缓存130中并且可以快速获得。这个数据可不被存储在L2高速缓存130中,且因此必须从另一级内存中取回。这个其他级别的内存可以在几个请求者之间共享。在这种情况下,通常存在用于访问的请求者之间的仲裁。因此,内存延迟是未知的和可变的。
一旦返回所请求的数据(在测试块3414处为是),则块3415将该数据存储在所分配的高速缓存行中。块3416将对应的就绪位变为1,指示数据已准备好用于消耗。
进程流程前进到块3404。块3404将当前取回地址与生成命中的高速缓存行/槽号相关联。块3405更新参考队列。对应的参考队列2715或2725存储指示高速缓存内的数据的位置的数据。块3406生成流中的下一个地址。流程经由入口点A返回到测试块3401。
图35类似于图33,示出了生成后期Loop0计数和后期Loop0地址的示例性电路。该流的第一循环采用Loop0计数寄存器3511、加法器3512、乘法器3513和比较器3514。乘法器3513具有接收ELEM_BYTES的第二输入。在图35中,每个迭代由流前进信号触发。因此,后期计数电路的计数值和后期地址的地址值反映要提供给功能单元的下一个数据。这将是存储在对应的首寄存器2218/2228中的流元素。除了对应乘法器的第二输入是对应流模板的对应维度DIM1、DIM2和DIM3之外,循环Loop1、Loop2和Loop3的电路类似。循环结束信号生成下一个较高循环的迭代。
如上所述,每个流引擎保持循环计数和循环地址的两个副本:指示流引擎当前正在取回的位置的早期副本;和指示中央处理单元内核110已经提交的最后迭代后期副本。在大多数情况下,后期副本提供程序的当前状态的最清楚指示。早期副本仅指示流引擎已经在中央处理单元内核110之前多远取回。早期副本和后期副本之间的差异反映了存储在数据存储器2217/2237中的流数据的量。计数数据和地址数据是相关的。任何特定实施例可包括仅计数数据、包括仅地址数据或包括两者。
在本领域中已知的是,诸如图33和图35所示的任何计数都可以体现为向下计数或向上计数。图33和图35示出了向上计数实施例。本领域技术人员将理解如何修改初始化和比较以在向下计数电路中实现本发明。另外,本领域技术人员将理解如何修改比较以实现所描述的寻址模式。
图36是一个流程图3600,其示出了使用后期地址生成器3102提交流首寄存器的方式。流程图3600在测试块3601开始。测试块3601确定数据流的下一个数据元素是否要加载到对应的流首寄存器。如前所述,在优选实施例中,流数据保留在流首寄存器中,其中它可以由多个功能单元多次取回,直到流引擎遇到读取和提前操作数编码。在检测到读取和提前操作数编码之后,流引擎将首寄存器中的当前数据提供给请求功能单元,并将流首寄存器中的数据替换为数据流中的下一个顺序数据。如前所述,取决于指定流数据大小与矢量大小的关系,流引擎可以用多于一个流数据元素填充首寄存器。如果流首寄存器数据不被替换(在测试块3601处为否),则控制循环返回到测试块3601以进行另一个确定。流程保持在测试块3601处,直到需要替换存储在首寄存器中的数据为止(在测试块3601处为是)。
当需要替换首寄存器时(在测试块3601处为是),块3602获得用于下一个首寄存器填充的数据的地址。在优选实施例中,该确定是通过对应的参考队列2715/2725进行的。文本块3603确定该刚刚被访问的高速缓存行是否生效。如果高速缓存行是生效的(在文本块3603处为是),则块3604将该数据调用到临时缓冲区。如果高速缓存行不生效(在文本块3603处为否),则块3605零填充临时缓冲区。
在任一情况下,块3606旋转并格式化数据。上面已经描述了这个过程。数据旋转将流的数据元素对准首寄存器中合适的槽。如前所述,数据格式化包括复数子元素交换、数据提升、转置和复制。在旋转和格式化之后,块3607将数据存储在如前所述的矢量槽中的对应的首寄存器2718/2728中。
图37示出了表示为SEn_ICNT 3700的扩展控制寄存器(ECR)的示例性位分配。根据优选实施例,流引擎2700包括两个这样的ECR,用于流0的SE0_INCT和用于流1的SE1_INCT。每个SEn_ICNT为每个打开的流存储在对应的流模板中定义的循环的早期循环计数和后期循环计数。SEn_ICNT 3700允许程序员在调试程序时确定流引擎在给定流内的位置。在优选实施例中,SEn_ICNT 3700只能由调试器访问。任何其他尝试访问SEn_ICNT 3700都会生成权限错误。SEn_ICNT 3700包括早期loop0计数3701、早期loop1计数3702、早期loop2计数3703、早期loop3计数3704、后期loop0计数3705、后期loop1计数3706、后期loop2计数3707和后期loop3计数3708。每个计数值字段具有至少与对应的流模板寄存器的对应迭代计数的位宽度一样大的位宽度。相应的早期计数和后期计数是相似的,但在不同的时间更新,这将在下面进一步描述。
图38示出了表示为SEn_ADDR 3800的ECR的示例性位分配。根据优选实施例,流引擎2700包括两个这样的ECR,用于流0的SE0_ADDR和用于流1的SE1_ADDR。每个SEn_ADDR为每个打开的流存储在对应的流模板中定义的循环的早期地址和后期地址。SEn_ADDR 3800允许程序员在调试程序时确定流引擎在给定流内的位置。在优选实施例中,SEn_ADDR 3800只能由调试器访问。任何其他尝试访问SEn_ADDR 3800都会生成权限错误。SEn_ADDR 3800包括早期Loop0地址3801、早期Loop1地址3802、早期Loop2地址3803、早期Loop3地址3804、后期Loop0地址3805、后期Loop1地址3806、后期Loop2地址3807和后期Loop3地址3808。每个地址字段具有至少与处理器100的地址的位宽度一样大的位宽度。相应的早期地址和后期地址是相似的,但在不同的时间更新,这将在下面进一步描述。
流引擎2700报告一系列故障,包括:编程错误;内存转换故障;存储阵列中检测到的位错误;系统报告的总线错误;和功能失败。流引擎同步报告错误,与程序执行对齐。
流引擎2700通过用指示故障的标志标记来自流引擎的数据来同步地报告故障。当且仅当程序尝试消耗该数据时,该标记的数据触发内部中央处理单元内核110异常事件。试图消耗标记为错误的数据的任何指令都会生成中央处理单元内核110内部异常事件。由流引擎2700识别的错误与经历异常的指令之间的关系不取决于停顿时间。
当流引擎2700检测到要报告的故障时,其在内部存储器2716/2726中标记受影响的数据。并行地,流引擎2700将错误的细节记录在对应对的扩展控制寄存器:故障地址寄存器SEn_FAR和故障源寄存器SEn_FSR中。每个流都有自己的一组扩展控制寄存器SEn_FAR和SEn_FSR。扩展控制寄存器SEO_FAR和SEO_FSR存储用于流0的数据,扩展控制寄存器SE1_FAR和SE1_FSR存储用于流1的数据。根据错误,流引擎2700还可以禁用对流的进一步请求生成。在优选实施例中,故障地址寄存器SEn_FAR和故障源寄存器SEn_FSR只能由调试器访问。
流引擎2700将触发该错误的虚拟地址记录在对应的扩展控制寄存器SEn_FAR中。图39中示出了示例性SEn_FAR寄存器3900。在当前实施例中,每个SEn_FAR寄存器是64位。第一字段3901存储生成故障的流引擎取回的虚拟地址。在优选实施例中,该虚拟地址是49位(位0到40)。在当前示例中,SEn_FAR寄存器的剩余位(第二字段3902)被保留且未被使用。如果实施例的虚拟地址超过49位,则可以使用这些位。
流引擎270将故障状态记录在对应的寄存器SEn_FSR中。图40中示出了示例性SEn_FSR寄存器4000。在当前实施例中,每个SEn_FSR寄存器是64位。第一字段4001存储遇到故障的细节。在当前示例实施例中,第二字段4002(SEn_FSR寄存器4000的剩余位)被保留并且未被使用。表15显示了SEn_FSR寄存器4000中的细节字段4001的编码。
表15
如表15所示,位12,即位字段4001的最高有效位如果没有错误则为0,如果有错误则为1。位字段4001的一组编码被留出以指示内存管理单元错误。内存管理单元错误包括内存转换故障,例如:缺少权限;缺少提供的虚拟地址的有效转换条目;以及在转换过程中遇到的实际物理错误。位字段4001的第二组编码被留出以指示二级高速缓存错误。其他编码指示流引擎错误。
“1000000000001”的编码指示流引擎内部存储器数据错误。这指示对应的数据存储器2716/2726有错误。在优选实施例中,奇偶校验位与数据位一起存储。使用时,新的奇偶校验根据数据计算,并与存储的奇偶校验进行比较。新奇偶校验和存储的奇偶校验之间的差异指示内部存储器错误。
“1000000000010”的编码指示流引擎流模板错误。在打开流时,中央处理单元内核110指示存储用于数据流的参数的流模板寄存器。流模板寄存器(图28和图29)的一些可行的数据编码生成优选实施例不支持的选项的组合。这些包括:提升和元素重复之后的元素大小超过了矢量长度;提升后的转置颗粒大小,元素重复和抽取超过矢量长度;转置流的无效维度或地址对齐;在禁用提升时启用抽取;转置流超出范围迭代计数;在任何字段中使用的保留编码;以及任何保留字段中的非零值。后两个错误是不正确的指定模板的指示。
“1000000000011”的编码指示流引擎活动失配。这在中央处理单元内核110尝试与当前流状态(不活动的、活动的、冻结)不一致的操作时发生。
“1000000000100”的编码指示中央处理单元内核110在流无效时假读取。无效流不能被读取。尝试读取无效流会生成该错误。
“1000000000101”的编码指示地址位48翻转。虽然虚拟地址有49位,但是它通常存储在一个64位的标量寄存器中。中央处理单元内核110将49位虚拟地址符号扩展为64位以供存储。因此,虚拟地址的位49(符号位)的改变是不允许的。任何流数据取回操作都会触发虚拟地址的位49,从而生成该错误。
“1000000000110”的编码指示二级高速缓存碎片数据返回。导致来自组合二级高速缓存130的碎片数据返回的流数据取回生成该错误。
编码是“1000000000111”保留和不使用。
在检测到这些流引擎故障中的任何一个时,流引擎尝试将生成错误的数据取回的虚拟地址存储在SEn_FAR中,并将对应的错误代码存储在SEn_FSR中,如上所述。流引擎并不总是能够将地址与每个故障相关联。在优选实施例中,在这些情况下,流引擎不能报告错误地址:当激活冻结流时,为无效的流状态(不良的STRRSTR);在转置流期间,为数据存储器阵列中的位错误;在转置流期间,为由系统报告的总线错误。在那些情况下,流引擎将把SEn_FAR清除为0。因为流引擎可并行地生成多个地址以满足指定给中央处理单元内核110的单个数据阶段,所以流引擎选择这些地址中的一个来报告两个地址是否都遇到故障。流引擎不会在这些并行地址中定义架构顺序;相反,当两个故障并行发生时,流引擎选择报告故障的地址是实施方式定义的。
在发生这些错误时,流引擎不会立即向中央处理单元内核110触发错误。当数据被中央处理单元内核110消耗时,故障状态通过流引擎数据存储器2716/2726与受影响的数据一起流动。如果并且当程序实际上消耗了数据,则中央处理单元内核110触发内部异常事件。由于中央处理单元内核110的流水线性质,在流引擎检测到故障时以及中央处理单元内核110采取异常时之间可能会经历许多周期。如果程序从不消耗受影响的数据,则中央处理单元内核110将永远不会生成异常事件。例如,如果程序打开具有无效模板的流,然后关闭该流而不从其读取任何数据,则流引擎不会导致中央处理单元内核110采取异常。这种行为将流引擎取回看作是推测性的,直到在中央处理单元内核110上运行的程序实际上消耗数据为止。如果故障是可恢复的,例如页故障,则当中央处理单元内核110从异常事件处理程序返回时,流将在触发异常的数据项的点处恢复。
图41示出了本发明的错误检测和校正。图1和图27中所示出的部件被赋予相同的附图标记。图41示出了中央处理单元内核110、一级指令高速缓存(L1I)121、一级数据高速缓存(L1D)123和二级组合指令/数据高速缓存(L2)130之间的连接。
图41示出了包括L1I高速缓存121和纠错硬件的程序内存控制器(PMC)4110。L1I高速缓存121经由2x256位校正单元4141和16x32位奇偶校验生成器4142从L2SRAM/高速缓存130接收数据。在将指令提供给中央处理单元内核110时,将存储在L1I高速缓存121中的奇偶校验位与来自16x32位奇偶校验检测器4111的新计算的奇偶校验位比较。如果它们匹配,则通过多路复用器4112将指令提供给中央处理单元内核110。如果它们不匹配,则从L2SRAM/高速缓存130中调用指令,然后再次进行奇偶校验测试。在L1I高速缓存121中的高速缓存未命中时,L2SRAM/高速缓存经由2x256位校正单元4141和16x32位奇偶校验生成器4142将所请求的指令提供给L1I高速缓存121,并且经由多路复用器4122将指令直接并行地提供。
图41示出了包括L1D高速缓存123和纠错硬件的数据内存控制器(DMC)4120。L1D高速缓存123经由2x256位校正单元4121和16x32位奇偶校验生成器4122从L2SRAM/高速缓存接收数据。在向中央处理单元内核110提供数据时,将存储在L1D高速缓存123中的奇偶校验位与来自16x32位奇偶校验检测器4123的新计算的奇偶校验位进行比较。如果它们匹配,则通过多路复用器4124将数据提供给中央处理单元内核110。如果它们不匹配,则从L2SRAM/高速缓存130调用数据,然后再次进行奇偶校验测试。在L1D高速缓存123中的高速缓存未命中时,L2SRAM/高速缓存经由2x256位校正单元4121和16x32位奇偶校验生成器4122将所请求的数据提供给L1D高速缓存123,并且经由多路复用器4124将数据直接并行提供给中央处理单元内核110。
来自中央处理单元内核110的写入在16x32位校验子生成器4125中经受奇偶校验生成。从中央处理单元内核110接收的数据和所计算的奇偶校验位被存储在L1D高速缓存123中。
在从L1D高速缓存123写回时,在2x256位校验子生成器4143中比较新计算的奇偶校验位和所存储的奇偶校验。如果这些相匹配,则将数据存储在L2SRAM/高速缓存130中。如果它们不匹配,则2x256位校验子生成器4145尝试校正。如果实现校正,则校正的数据被存储在L2SRAM/高速缓存130中。校正失败则生成故障。
图41示出了包括分离的流0 2710和流1 2720的流缓冲器125。流0 2710经由2x256位校正单元4151和16x32位奇偶校验生成器4152从L2SRAM/高速缓存接收数据。在向中央处理单元内核110提供数据时,将在流2210中存储的奇偶校验位与在16x32位奇偶校验检测器4131中新计算的奇偶校验位进行比较。如果它们匹配,则将数据提供给中央处理单元内核110。如果它们不匹配,则存在故障。流1 2720与2x256位校正单元4153、16x32位奇偶校验生成器4154和16x32位奇偶校验检测器4132类似地操作。
图41示出了包括L2SRAM/高速缓存130和纠错硬件的统一内存控制器(UMC)4140。L2SRAM/高速缓存130经由2x256位校验子生成器4144从多核共享内存控制器(MSMC)4160接收数据。为了存储在L2SRAM/高速缓存130中而生成新奇偶校验,并且如果需要则尝试校正。在不匹配和校正失败的情况下,从MSMC 4160调用数据,然后再次进行奇偶校验测试。从L2SRAM/高速缓存130到MSMC 4160的写入没有奇偶校验或校正。
周期性地,2x256位校验子生成4145和2x256校正4146遍历在L2SRAM/高速缓存130中存储的数据。如果需要,调用数据和奇偶校验,生成新的奇偶校验并尝试校验和校正。如果数据是正确的,则在L2SRAM/高速缓存130中没有改变。如果数据被校正,则校正的数据被存储回L2SRAM/高速缓存130中。数据校正失败则生成故障。
诸如上述流引擎之类的高性能计算系统需要对随机存取内存池的低延迟、高带宽访问,以适当地利用可用硬件。内存性能缩放并没有跟上计算机架构和流程的增强,导致许多应用程序的内存瓶颈。这些最先进的内存,特别是片外内存,需要空间和时间局部性来有效地利用数据总线和对数据阵列的访问。在多核系统中,快速内存带宽资源往往很少,并且许多计算元件必须共享对其的访问。提供这种资源分配的仲裁器通常会尝试为类似的优先级业务提供资源的公平分配。这种公平性通过破坏有效利用内存所需的时间和空间局部性而实际上可以妨碍内存效率。
作为这样的系统的一个实例,主机A和B试图访问内存Z。作为贪婪的请求者,A和B将尽可能快地发送尽可能多的请求,直到它们保留所有可用的数据缓冲能力。然后它们将停顿,直到一些以前的请求返回。在大多数具有大的片外内存的系统中,内存返回带宽低于请求者发出容量。因此,数据请求返回比最初发送慢。对于贪婪的主机,一旦一个请求回来,新的请求就会出去。一旦数据缓冲已满,请求发出并以内存返回带宽的速度返回,在请求之间留下时间间隙。这导致了最初的一连串的背靠背(back-to-back)请求,直到数据缓冲满了,然后是一个稳定的状态,所述状态具有缓慢的、与内存返回带宽相匹配的一个一个的缓慢请求。
A和B请求者请求速率的下降减少了每个请求的时间和空间局部性。这进而降低了内存访问的效率。该降低的内存效率进一步降低了请求返回速率,导致请求之间的时间间隙增大,从而进一步降低了局部性。这种反馈关系显着降低了系统的性能,特别是当更多的请求者进入池用于访问内存Z时。
贪婪的主机将根据需要发送的请求的数量(N),根据主机的程序或功能以及主机能够发送的请求的数量(M),根据缓冲、可用性或其他约束来利用请求算法。这个算法通常看起来像这样:
1.如果N==0,则不发送请求(不需要)。
2.(N>0)并且(N≤M),发送N个请求。
3.(N>0)并且(N>M),发送M个请求。
如前所述,这些贪婪的主机减少了由内存处理的请求的时间和空间局部性。这通常会导致更多的内存页面更改和交换地址转换条目所需的增加的延迟。本发明在贪婪的主机请求速率中引入滞后。这个滞后增加了滞后命令号(R)到计算中,并且看起来像这样:
1.如果N==0,则不发送请求(不需要)。
2.如果(N>0)并且(N≤M),则发送N个请求。
3.如果(N>0)并且(N>M):
a.如果(M<R),则等到更多缓冲可用;
b.如果(M≥R),则发出R个请求。
在第二种情况下(N≤M),有比发送请求更多的可用缓冲。因此,所有未决的请求应该被发送。在第三种情况下(N>M),请求比可用的缓冲更多。在这种情况下,本发明使用滞后。这个滞后不会发送任何请求,直到一组R个请求可以一起发送。这确保了每当有多于R个请求发送时,请求者将R个请求集中在一起。强制集群可能会增加任何单个命令的延迟。然而,这种强制集群确保了内存中更好的时间和空间局部性,以使效率最大化。由于整个系统在内存带宽上是瓶颈的,所以最大限度地利用会导致整体性能较高的系统。
图42示出了本发明的取回滞后可应用的多处理器多内存系统4200。系统4200包括多个数据处理器。这些包括数据处理器4201和4202,每个数据处理器包括如前所述的处理器100。每个处理器4201和4202包括标量数据路径115、矢量数据路径116、一级指令高速缓存(L1I)121、一级数据高速缓存(L1D)123、流引擎125和二级组合指令/数据高速缓存(L2)130。这些元件如前所述连接并起作用。如图42所示,系统4200可以包括相同类型的附加数据处理器。系统4200包括多个精简指令集计算机(RISC)中央处理单元(CPU)4211至4213。这些数据处理器类型仅仅用作本发明的实例,并且其他更大或更小数目的数据处理器类型是可行的。
多处理器多内存系统4200包括多种类型的多个内存。这些包括共享内存类型A4231和4232以及共享内存类型B 4241和4342。系统4200还包括共享资源4251。共享资源4251可以包括在数据处理器4201,4202,4211和4213之间共享的输入装置、输出装置或其他类型的装置。这些内存类型仅仅是示例,并且其他内存和更多或更少数量的共享资源类型是可行的。
多核共享内存控制器4220调解数据处理器4201,4202,4211……4213和资源4231,4232,4241,4342……4251之间的数据移动。该调解包括优先级和排序、地址转换以及各种处理器和内存的数据流类型的匹配。
本发明的这个部分的滞后假定当访问在时间上和空间上本地而不是不相关时,对至少一些共享内存的访问延迟被增强。例如,支持页面模式访问的内存在对相同页面的访问在时间上邻近时显示减少的延迟。来自单一来源的内存访问比来自不同来源的时间相邻访问具有更大的展现该时间和空间局部性的可能性。因此,将来自单一来源的访问分组以供应到共享资源的技术可以减少延迟。
图43和图44示出了将这种滞后应用于本申请的流引擎。图43示出了实施本发明的硬件的部分示意图。图44示出了本发明的这个方面的过程。该描述假定突发分组发生在流引擎和对应的二级组合高速缓存之间。在这种情况下,二级组合高速缓存一般会在从较高级别的内存寻求服务时保持突发性。本领域的技术人员将认识到,本发明的滞后可以在多处理器系统内的其它位置处执行。例如,多核共享内存控制器4220可以为来自RISC CPU4211和4213的内存请求提供滞后。
图43示出未决请求的数量N、可用的缓冲的数量M和滞后值R的计算。未决请求的数量N被使用多个乘法器4301,4301,4303和4304计算。第一乘法器4301接收作为第一输入的数量ELEM_BYTES。这是定义的数据流的数据元素的大小。如上所述,ELEM_BYTES由流定义模板定义。在优选实施例中,流定义模板包括字段EFLAGS,其子集是ELTYPE字段。如表8所示,ELTYPE字段对数量ELEM_BYTES进行编码。这种编码仅仅是一个实例,本领域的技术人员会认识到设置数量ELEM_BYTES的其他可行的技术。到乘法器4301的第二输入是来自图33中所示的早期计数寄存器3311的量Loop0计数。乘法器4302以来自早期计数寄存器3321(图33中未示出,但类似于Loop0计数寄存器3311)的数量Loop1计数乘以乘法器4301的积。类似地,乘法器4303以来自早期计数寄存器3331的数量Loop2计数乘以乘法器4302的积,以及乘法器4304以来自早期计数寄存器3341的数量Loop3计数乘以乘法器4303的积。由于早期循环计数寄存器3311,3321,3331和3341存储其对应循环的剩余数量,该数量是指定数据流所需的数据元素取回的数量。乘以ELEM_BYTES从而生成待数据流取回的剩余的数据量。该数量被指定为N。
块4311生成未分配的对应数据存储器2716/2726内的高速缓存行的数量。乘法器4312将高速缓存行大小乘以该积。这个高速缓存行大小必须用与ELEM_BYTES相同的单位表示。乘法器4312的乘积输出是可用数据缓冲的数量M。在数据流的初始打开时,将不分配高速缓存行,并且可用数据缓冲的数量M将处于其最大值。可用数据缓冲的数量M在将高速缓存行分配给新数据时减小,并且在中央处理单元内核110消耗数据时的高速缓存行的取消分配时增加。
寄存器4321存储滞后常数R。这优选是可由中央处理单元内核110写入的内存映射寄存器。针对本发明的取回滞后读取寄存器4321中的数据。
取回控制器4331形成来自N、M和R输入的取回确定。如前所述并如图44所示进行该取回确定。在图34的测试块3401中使用该取回确定,以确定是否发出来自流引擎的取回请求。取回控制器4331对发出的取回数量进行计数,并对应地控制测试块3401取回发出。取回控制器4330可以作为有限状态机或作为正确编程的逻辑控制器在异步逻辑机器中实现。
图44是示出取回滞后的处理4400的流程图。测试块4401确定至少一个取回请求是否就绪。在流引擎实施例中,这确定否打开还没有取回并存储所有的数据元素的流。封闭流不需要取回。如果所有指定的数据元素都已被取回并存储,则不需要取回。如果没有请求就绪(测试块4401处为否),则测试块4401重复,直到至少一个请求就绪。
如果至少一个请求就绪(在测试块4401处为是),则块4402将就绪请求的数量N与当前可用的数据缓冲的数量M进行比较。在流引擎实施例中,就绪请求的数量R等于对应的数据流中尚未取回的数据元素的数量乘以数据元素的大小。在流引擎实施例中,当前可用的缓冲的量M等于未分配的高速缓存行数的数量乘以高速缓存行大小。如果就绪请求的数量R小于或等于当前可用的数据缓冲的量M(在测试块4402处为是),则块4403分派全部N个就绪请求。
如果就绪请求的数量N大于当前可用的数据缓冲的数量M(在测试块4402处为否),则测试块4404确定当前可用的数据缓冲的量M是否小于滞后R。如果当前可用的数据缓冲的量M小于滞后R(在测试块4404处为是),则块4405进入一个内存周期的等待状态。流程然后返回到测试块4404以确定当前可用的数据缓冲的量M是否小于滞后R。在流引擎实施例中,数据缓冲的量M取决于未分配的高速缓存行的数量。如上所述,当中央处理单元110处理读取和提前指令编码时,数据存储器2716/2725中的高速缓存行被解除分配。在其他实施例中,数据缓冲的量一般将随着所取回数据的消耗而减少。进程4400保持在该循环中,直到数据缓冲的量M大于或等于滞后R。
如果当前可用的数据缓冲的量M大于或等于滞后R(测试块4404处为否),则块4406分派R个请求。如上面在流引擎实施例中所指出的,这允许进程3400在取回数据流方面超越测试块3401。
本发明的这个方面的滞后要求在R请求集群可以一起发送之前不发送请求。只要有多于R个请求就绪,这就会将R请求集中在一起。强制集群可能会增加任何单个命令的延迟。然而,这种强制集群确保了内存中更好的时间和空间局部性,以使效率最大化。所访问的内存系统可以包括进一步的地址转换,或者可以包括具有用于背对背的相同页面访问的减少的延迟的内存。强制集群可以更好地利用这些内存资源。强制群集降低了需要在地址转换硬件中更改表格查找条目的可能性,因为群集请求更有可能具有空间局部性。这往往避免了地址转换条目交换的需要。由于这种地址转换条目交换的延迟是不确定的并且可能很长,所以平均延迟减少了。这种集群请求的更可能的空间局部性更可能允许背对背访问相同的内存页面。这也倾向于减少平均延迟。

Claims (34)

1.一种数字数据处理器,其包括:
存储指令的指令内存,每个指令指定数据处理操作和至少一个数据操作数字段;
连接到所述指令内存的指令解码器,所述指令解码器用于依序调用来自所述指令内存的指令并确定所述指定的数据处理操作和所述指定的至少一个操作数;
连接到所述数据寄存器堆和所述指令解码器的至少一个功能单元,所述至少一个功能单元用于对与由所述指令解码器解码的指令对应的至少一个操作数执行数据处理操作,并将结果存储在指令指定的数据寄存器中;
连接到所述指令解码器的流引擎,所述流引擎能响应于流开始指令而操作,以从内存中调用多个数据元素的指令指定序列的流,所述流引擎包括:
地址生成器,所述地址生成器用于生成对应于多个数据元素的指令指定序列的所述流的流内存地址,
流缓冲器,所述流缓冲器接收并暂时存储对应于所述流内存地址的数据,
流首寄存器,所述流首寄存器存储接下来要被所述至少一个操作单元使用的所述流的数据元素,
早期地址寄存器,所述早期地址寄存器存储接下来要从内存取回的数据元素的流内存地址,以及
后期地址寄存器,所述后期地址寄存器存储与存储在所述流首寄存器中的数据元素对应的流内存地址;并且
其中所述至少一个操作单元响应流操作数指令,以从所述流首寄存器接收至少一个操作数。
2.根据权利要求1所述的数字数据处理器,其中:
所述数字数据处理器能够仅通过调试器来读取所述早期地址寄存器和所述后期地址寄存器。
3.根据权利要求1所述的数字数据处理器,其中:
多个数据元素的指令指定序列的所述流引擎流包括多个嵌套循环;
所述早期地址寄存器存储所述多个嵌套循环中的每一个的地址;并且
所述后期地址寄存器存储所述多个嵌套循环中的每一个的地址。
4.根据权利要求3所述的数字数据处理器,其中:
流的所述指令指定的多个数据元素至少部分地由存储在由所述流开始指令标识的流定义模板寄存器中的流定义模板指定,所述流定义模板寄存器具有循环计数数据字段,所述循环计数数据字段指定所述多个嵌套循环中的每一个的若干迭代。
5.根据权利要求4所述的数字数据处理器,其中:
所述流引擎进一步包括:
早期计数寄存器,所述早期计数寄存器存储对应于接下来要从内存中取回的数据元素的所述多个嵌套循环中的每一个的计数,和
后期计数寄存器,所述后期计数寄存器存储对应于存储在所述流首寄存器中的数据元素的所述多个嵌套循环中的每一个的计数。
6.根据权利要求5所述的数字数据处理器,其中:
所述数字数据处理器能够仅通过调试器来读取所述早期地址寄存器和所述后期地址寄存器。
7.根据权利要求4所述的数字数据处理器,其中:
所述流定义模板寄存器具有循环维度数据字段,所述循环维度数据字段指定所述多个嵌套循环中的每一个的循环维度;
在为等于对应循环计数的若干循环生成所述多个嵌套循环中的一个的数据元素地址时,所述地址生成器以等于由下一个嵌套循环的所述循环维度数据字段指定的所述循环维度的量改变所述内存地址。
8.根据权利要求1所述的数字数据处理器,其中:
多个数据元素的所述指令指定序列包括具有指令指定数据大小的指令指定数量的数据元素。
9.根据权利要求3所述的数字数据处理器,其中:
所述流首寄存器被分成所述元素数据大小的通道;并且
所述流引擎将所述流的一个数据元素存储在所述流首寄存器的每个通道中。
10.根据权利要求9所述的数字数据处理器,其中:
如果剩余的数据元素少于通道,则所述流引擎将全0存储在多余的通道中。
11.根据权利要求1所述的数字数据处理器,其中:
多个所述数据元素的所述指令指定序列各自具有相同的数据大小。
12.根据权利要求1所述的数字数据处理器,其中:
多个数据元素的所述指令指定序列各自具有指令指定数据类型。
13.根据权利要求1所述的数字数据处理器,其进一步包括:
连接到所述流引擎和所述内存的数据一致性单元,所述数据一致性单元能操作以确保所述流在所述流开始指令之前与对内存的所有写入一致。
14.根据权利要求13所述的数字数据处理器,其进一步包括:
所述数据一致性单元不保证所述流在所述流开始指令之后与对内存的所有写入一致。
15.根据权利要求14所述的数字数据处理器,其进一步包括:
所述流引擎响应流结束指令来停止数据的调用;并且
所述指令内存包括控制所述至少一个操作单元的指令,以在对应的流开始指令和对应的流结束指令之间的间隔期间,在包括所述流的所述指令指定的多个数据元素的内存的块内,避免对内存地址的内存写入。
16.根据权利要求1所述的数字数据处理器,其进一步包括:
所述流引擎响应流结束指令来停止数据的调用。
17.根据权利要求1所述的数字数据处理器,其进一步包括:
所述流引擎响应于多个数据元素的所述指令指定序列中的所有数据元素的调用来停止数据的调用。
18.根据权利要求1所述的数字数据处理器,其中:
所述指令内存存储至少一个流保存指令和至少一个流恢复指令;
响应于流保存指令,所述流引擎保存当前打开流的状态元数据并停止所述当前打开流;并且
响应于流恢复指令,所述流引擎调用所述当前打开流的先前保存的状态元数据,重新打开所述当前打开流并恢复对应于所述存储的元数据的所述当前打开流。
19.根据权利要求1所述的数字数据处理器,其进一步包括:
一级数据高速缓存,所述一级数据高速缓存连接到所述至少一个操作单元,所述一级数据高速缓存临时存储供所述至少一个操作单元操作的数据,如果对应的数据存储在所述一级数据高速缓存中(高速缓存命中),则所述一级数据高速缓存服务于所述至少一个操作单元内存读取和写入,否则(高速缓存未命中)将所述至少一个操作单元内存读取和写入提交给更高级别的内存;和
二级高速缓存,所述二级高速缓存连接到所述一级数据高速缓存和所述流引擎,所述二级高速缓存临时存储供所述至少一个操作单元操作的数据,如果对应的数据存储在所述二级高速缓存中(高速缓存命中),则所述二级高速缓存服务于一级数据高速缓存对内存读取和写入以及流引擎内存读取的未命中,否则(高速缓存未命中)将所述至少一个操作单元内存读取和写入以及流引擎读取提交给更高级别的内存。
20.一种数字数据处理器,其包括:
存储指令的指令内存,每个指令指定数据处理操作和至少一个数据操作数字段;
连接到所述指令内存的指令解码器,所述指令解码器用于依序调用来自所述指令内存的指令并确定所述指定的数据处理操作和所述指定的至少一个操作数;
连接到所述数据寄存器堆和所述指令解码器的至少一个功能单元,所述至少一个功能单元用于对与由所述指令解码器解码的指令对应的至少一个操作数执行数据处理操作,并将结果存储在指令指定的数据寄存器中;
流定义模板寄存器,所述流定义模板寄存器具有循环计数数据字段,所述循环计数数据字段指定多个嵌套循环中的每一个的若干迭代;
连接到所述指令解码器的流引擎,所述流引擎能响应于流开始指令而操作,以在多个嵌套循环中从内存中调用多个数据元素的指令指定序列的流,所述多个嵌套循环至少部分地由所述流定义模板寄存器的所述循环计数指定,所述流引擎包括:
地址生成器,所述地址生成器用于在所述多个嵌套循环中生成对应于多个数据元素的指令指定序列的所述流的流内存地址,
流缓冲器,所述流缓冲器接收并暂时存储对应于所述流内存地址的数据,
流首寄存器,所述流首寄存器存储接下来要被所述至少一个操作单元使用的所述流的数据元素,
早期计数寄存器,所述早期计数寄存器存储接下来要从内存取回的数据元素的所述多个嵌套循环的每一个的循环计数,和
后期计数寄存器,所述后期计数寄存器存储对应于存储在所述流首寄存器中的数据元素的所述多个嵌套循环中的每一个的循环计数;并且
其中所述至少一个操作单元响应流操作数指令,以从所述流首寄存器接收至少一个操作数。
21.根据权利要求20所述的数字数据处理器,其中:
所述数字数据处理器能够仅通过调试器来读取所述早期计数寄存器和所述后期计数寄存器。
22.根据权利要求20所述的数字数据处理器,其中:
所述流定义模板寄存器具有循环维度数据字段,所述循环维度数据字段指定所述多个嵌套循环中的每一个的循环维度;
在为等于对应循环计数的若干循环生成所述多个嵌套循环中的一个的数据元素地址时,所述地址生成器以等于由下一个嵌套循环的所述循环维度数据字段指定的所述循环维度的量改变所述内存地址。
23.根据权利要求20所述的数字数据处理器,其中:
多个数据元素的所述指令指定序列包括具有指令指定数据大小的指令指定数量的数据元素。
24.根据权利要求23所述的数字数据处理器,其中:
所述流首寄存器被分成所述元素数据大小的通道;并且
所述流引擎将所述流的一个数据元素存储在所述流首寄存器的每个通道中。
25.根据权利要求24所述的数字数据处理器,其中:
如果剩余的数据元素少于通道,则所述流引擎将全0存储在多余的通道中。
26.根据权利要求20所述的数字数据处理器,其中:
多个所述数据元素的所述指令指定序列各自具有相同的数据大小。
27.根据权利要求20所述的数字数据处理器,其中:
多个数据元素的所述指令指定序列各自具有指令指定数据类型。
28.根据权利要求20所述的数字数据处理器,其进一步包括:
连接到所述流引擎和所述内存的数据一致性单元,所述数据一致性单元能操作以确保所述流在所述流开始指令之前与对内存的所有写入一致。
29.根据权利要求28所述的数字数据处理器,其进一步包括:
所述数据一致性单元不保证所述流在所述流开始指令之后与对内存的所有写入一致。
30.根据权利要求28所述的数字数据处理器,其进一步包括:
所述流引擎响应流结束指令来停止数据的调用;并且
所述指令内存包括控制所述至少一个操作单元的指令,以在对应的流开始指令和对应的流结束指令之间的间隔期间,在包括所述流的所述指令指定的多个数据元素的内存的块内,避免对内存地址的内存写入。
31.根据权利要求20所述的数字数据处理器,其进一步包括:
所述流引擎响应流结束指令来停止数据的调用。
32.根据权利要求20所述的数字数据处理器,其进一步包括:
所述流引擎响应于多个数据元素的所述指令指定序列中的所有数据元素的调用来停止数据的调用。
33.根据权利要求20所述的数字数据处理器,其中:
所述指令内存存储至少一个流保存指令和至少一个流恢复指令;
响应于流保存指令,所述流引擎保存当前打开流的状态元数据并停止所述当前打开流;并且
响应于流恢复指令,所述流引擎调用所述当前打开流的先前保存的状态元数据,重新打开所述当前打开流并恢复对应于所述存储的元数据的所述当前打开流。
34.根据权利要求20所述的数字数据处理器,其进一步包括:
一级数据高速缓存,所述一级数据高速缓存连接到所述至少一个操作单元,所述一级数据高速缓存临时存储供所述至少一个操作单元操作的数据,如果对应的数据存储在所述一级数据高速缓存中(高速缓存命中),则所述一级数据高速缓存服务于所述至少一个操作单元内存读取和写入,否则(高速缓存未命中)将所述至少一个操作单元内存读取和写入提交给更高级别的内存;和
二级高速缓存,所述二级高速缓存连接到所述一级数据高速缓存和所述流引擎,所述二级高速缓存临时存储供所述至少一个操作单元操作的数据,如果对应的数据存储在所述二级高速缓存中(高速缓存命中),则所述二级高速缓存服务于一级数据高速缓存对内存读取和写入以及流引擎内存读取的未命中,否则(高速缓存未命中)将所述至少一个操作单元内存读取和写入以及流引擎读取提交给更高级别的内存。
CN201711379376.8A 2016-12-20 2017-12-20 使用早期和后期地址以及循环计数寄存器来跟踪架构状态的流引擎 Active CN108205447B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211481556.8A CN115827065A (zh) 2016-12-20 2017-12-20 使用早期和后期地址以及循环计数寄存器来跟踪架构状态的流引擎

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US15/384,345 US10713174B2 (en) 2016-12-20 2016-12-20 Streaming engine with early and late address and loop count registers to track architectural state
US15/384,345 2016-12-20

Related Child Applications (1)

Application Number Title Priority Date Filing Date
CN202211481556.8A Division CN115827065A (zh) 2016-12-20 2017-12-20 使用早期和后期地址以及循环计数寄存器来跟踪架构状态的流引擎

Publications (2)

Publication Number Publication Date
CN108205447A true CN108205447A (zh) 2018-06-26
CN108205447B CN108205447B (zh) 2022-12-13

Family

ID=62562475

Family Applications (2)

Application Number Title Priority Date Filing Date
CN202211481556.8A Pending CN115827065A (zh) 2016-12-20 2017-12-20 使用早期和后期地址以及循环计数寄存器来跟踪架构状态的流引擎
CN201711379376.8A Active CN108205447B (zh) 2016-12-20 2017-12-20 使用早期和后期地址以及循环计数寄存器来跟踪架构状态的流引擎

Family Applications Before (1)

Application Number Title Priority Date Filing Date
CN202211481556.8A Pending CN115827065A (zh) 2016-12-20 2017-12-20 使用早期和后期地址以及循环计数寄存器来跟踪架构状态的流引擎

Country Status (2)

Country Link
US (3) US10713174B2 (zh)
CN (2) CN115827065A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110781075A (zh) * 2019-09-19 2020-02-11 深圳震有科技股份有限公司 一种内存泄漏的检测方法、装置、系统及存储介质
CN113360423A (zh) * 2020-03-03 2021-09-07 瑞昱半导体股份有限公司 数据储存系统及操作数据储存系统的方法

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9520180B1 (en) 2014-03-11 2016-12-13 Hypres, Inc. System and method for cryogenic hybrid technology computing and memory
US10713174B2 (en) * 2016-12-20 2020-07-14 Texas Instruments Incorporated Streaming engine with early and late address and loop count registers to track architectural state
US11042468B2 (en) 2018-11-06 2021-06-22 Texas Instruments Incorporated Tracking debug events from an autonomous module through a data pipeline

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4942553A (en) * 1988-05-12 1990-07-17 Zilog, Inc. System for providing notification of impending FIFO overruns and underruns
US5958038A (en) * 1997-11-07 1999-09-28 S3 Incorporated Computer processor with two addressable memories and two stream registers and method of data streaming of ALU operation
US20100145992A1 (en) * 2008-12-09 2010-06-10 Novafora, Inc. Address Generation Unit Using Nested Loops To Scan Multi-Dimensional Data Structures
CN105718386A (zh) * 2014-12-22 2016-06-29 德克萨斯仪器股份有限公司 程序存储器控制器中页面窗口的本地页面转换和许可存储

Family Cites Families (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6205560B1 (en) * 1996-02-27 2001-03-20 Via-Cyrix, Inc. Debug system allowing programmable selection of alternate debug mechanisms such as debug handler, SMI, or JTAG
US6968476B2 (en) * 2001-06-27 2005-11-22 International Business Machines Corporation Checkpointing a superscalar, out-of-order processor for error recovery
US7142477B1 (en) * 2004-06-18 2006-11-28 Cypress Semiconductor Corp. Memory interface system and method for reducing cycle time of sequential read and write accesses using separate address and data buses
US20080141013A1 (en) * 2006-10-25 2008-06-12 On Demand Microelectronics Digital processor with control means for the execution of nested loops
TWI446350B (zh) * 2009-12-08 2014-07-21 Silicon Motion Inc 用來減少無法更正的錯誤之方法以及記憶裝置及其控制器
US8930562B2 (en) * 2010-07-20 2015-01-06 Qualcomm Incorporated Arranging sub-track fragments for streaming video data
JP5405513B2 (ja) * 2011-03-22 2014-02-05 株式会社東芝 メモリシステム、不揮発性記憶装置、不揮発性記憶装置の制御方法、及びプログラム
US11487673B2 (en) * 2013-03-14 2022-11-01 Nvidia Corporation Fault buffer for tracking page faults in unified virtual memory system
US8977997B2 (en) * 2013-03-15 2015-03-10 Mentor Graphics Corp. Hardware simulation controller, system and method for functional verification
US9606803B2 (en) * 2013-07-15 2017-03-28 Texas Instruments Incorporated Highly integrated scalable, flexible DSP megamodule architecture
US10966112B2 (en) * 2013-12-05 2021-03-30 Ethernity Networks Ltd. Method and system for distribution of high data throughput over multiple wireless connections
US9866650B2 (en) * 2014-12-03 2018-01-09 Verizon Digital Media Services Inc. Stream monitoring across a distributed platform
US10069766B2 (en) * 2015-07-07 2018-09-04 TransferSoft, Inc. Accelerated data transfer using thread pool for parallel operations
US10713174B2 (en) * 2016-12-20 2020-07-14 Texas Instruments Incorporated Streaming engine with early and late address and loop count registers to track architectural state

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4942553A (en) * 1988-05-12 1990-07-17 Zilog, Inc. System for providing notification of impending FIFO overruns and underruns
US5958038A (en) * 1997-11-07 1999-09-28 S3 Incorporated Computer processor with two addressable memories and two stream registers and method of data streaming of ALU operation
US20100145992A1 (en) * 2008-12-09 2010-06-10 Novafora, Inc. Address Generation Unit Using Nested Loops To Scan Multi-Dimensional Data Structures
CN105718386A (zh) * 2014-12-22 2016-06-29 德克萨斯仪器股份有限公司 程序存储器控制器中页面窗口的本地页面转换和许可存储

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110781075A (zh) * 2019-09-19 2020-02-11 深圳震有科技股份有限公司 一种内存泄漏的检测方法、装置、系统及存储介质
CN110781075B (zh) * 2019-09-19 2022-08-30 深圳震有科技股份有限公司 一种内存泄漏的检测方法、装置、系统及存储介质
CN113360423A (zh) * 2020-03-03 2021-09-07 瑞昱半导体股份有限公司 数据储存系统及操作数据储存系统的方法

Also Published As

Publication number Publication date
CN115827065A (zh) 2023-03-21
US20200401526A1 (en) 2020-12-24
CN108205447B (zh) 2022-12-13
US20180173634A1 (en) 2018-06-21
US11709778B2 (en) 2023-07-25
US20230367717A1 (en) 2023-11-16
US10713174B2 (en) 2020-07-14

Similar Documents

Publication Publication Date Title
US20210397451A1 (en) Streaming engine with cache-like stream data storage and lifetime tracking
US20230185649A1 (en) Streaming engine with deferred exception reporting
US11099933B2 (en) Streaming engine with error detection, correction and restart
CN109643233A (zh) 具有带读取和读取/前进操作数编码的流引擎的数据处理设备
CN108205447A (zh) 使用早期和后期地址以及循环计数寄存器来跟踪架构状态的流引擎
CN108205448A (zh) 具有在每个维度上可选择的多维循环寻址的流引擎
CN104756090B (zh) 提供扩展的缓存替换状态信息
US20210349635A1 (en) Streaming engine with fetch ahead hysteresis
CN109313556A (zh) 可中断和可重启矩阵乘法指令、处理器、方法和系统
CN105453030B (zh) 向较宽的寄存器进行依赖于模式的部分宽度加载的处理器、方法和系统
CN109952559A (zh) 具有单独可选元素及成组复制的流式传输引擎
CN109213525A (zh) 具有快捷起始指令的流式传输引擎

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
GR01 Patent grant
GR01 Patent grant