CN108205448B - 具有在每个维度上可选择的多维循环寻址的流引擎 - Google Patents
具有在每个维度上可选择的多维循环寻址的流引擎 Download PDFInfo
- Publication number
- CN108205448B CN108205448B CN201711379621.5A CN201711379621A CN108205448B CN 108205448 B CN108205448 B CN 108205448B CN 201711379621 A CN201711379621 A CN 201711379621A CN 108205448 B CN108205448 B CN 108205448B
- Authority
- CN
- China
- Prior art keywords
- stream
- data
- instruction
- memory
- 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.)
- Active
Links
- 230000015654 memory Effects 0.000 claims description 102
- 238000012545 processing Methods 0.000 claims description 67
- 230000004044 response Effects 0.000 claims description 15
- 125000004122 cyclic group Chemical group 0.000 claims description 6
- 239000013598 vector Substances 0.000 description 173
- 101100385237 Mus musculus Creg1 gene Proteins 0.000 description 25
- 239000011159 matrix material Substances 0.000 description 14
- 101000773153 Homo sapiens Thioredoxin-like protein 4A Proteins 0.000 description 12
- 102100030272 Thioredoxin-like protein 4A Human genes 0.000 description 12
- 101150008950 CBK1 gene Proteins 0.000 description 9
- 101100326161 Chlamydomonas reinhardtii BKT gene Proteins 0.000 description 9
- 101000773151 Homo sapiens Thioredoxin-like protein 4B Proteins 0.000 description 9
- 102100030273 Thioredoxin-like protein 4B Human genes 0.000 description 9
- 238000000034 method Methods 0.000 description 8
- 101100534231 Xenopus laevis src-b gene Proteins 0.000 description 7
- 238000010586 diagram Methods 0.000 description 7
- 230000009977 dual effect Effects 0.000 description 6
- 230000006870 function Effects 0.000 description 6
- 230000036961 partial effect Effects 0.000 description 6
- 101100063424 Neurospora crassa (strain ATCC 24698 / 74-OR23-1A / CBS 708.71 / DSM 1257 / FGSC 987) dim-5 gene Proteins 0.000 description 5
- 230000006399 behavior Effects 0.000 description 5
- 230000014759 maintenance of location Effects 0.000 description 5
- 230000008569 process Effects 0.000 description 5
- 230000017105 transposition Effects 0.000 description 5
- 230000003139 buffering effect Effects 0.000 description 4
- 238000004364 calculation method Methods 0.000 description 4
- 230000003247 decreasing effect Effects 0.000 description 4
- 230000010076 replication Effects 0.000 description 4
- 230000002441 reversible effect Effects 0.000 description 4
- 230000008859 change Effects 0.000 description 3
- 238000000605 extraction Methods 0.000 description 3
- 238000001914 filtration Methods 0.000 description 3
- 239000008187 granular material Substances 0.000 description 3
- 238000013507 mapping Methods 0.000 description 3
- 239000002245 particle Substances 0.000 description 3
- 239000008186 active pharmaceutical agent Substances 0.000 description 2
- 238000003491 array Methods 0.000 description 2
- 230000008901 benefit Effects 0.000 description 2
- 230000001351 cycling effect Effects 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 238000012360 testing method Methods 0.000 description 2
- 230000007704 transition Effects 0.000 description 2
- 238000013519 translation Methods 0.000 description 2
- 230000014616 translation Effects 0.000 description 2
- 230000001960 triggered effect Effects 0.000 description 2
- 101100534223 Caenorhabditis elegans src-1 gene Proteins 0.000 description 1
- 235000008694 Humulus lupulus Nutrition 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 230000001419 dependent effect Effects 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
- KEBHLNDPKPIPLI-UHFFFAOYSA-N hydron;2-(3h-inden-4-yloxymethyl)morpholine;chloride Chemical compound Cl.C=1C=CC=2C=CCC=2C=1OCC1CNCCO1 KEBHLNDPKPIPLI-UHFFFAOYSA-N 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 230000009191 jumping Effects 0.000 description 1
- 230000000670 limiting effect Effects 0.000 description 1
- 239000003550 marker Substances 0.000 description 1
- 229940050561 matrix product Drugs 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 230000010387 memory retrieval Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012856 packing Methods 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 230000003252 repetitive effect Effects 0.000 description 1
- 230000011664 signaling Effects 0.000 description 1
- 230000007480 spreading Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
- 238000000844 transformation Methods 0.000 description 1
Images
Classifications
-
- 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/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0893—Caches characterised by their organisation or structure
- G06F12/0897—Caches characterised by their organisation or structure with two or more cache hierarchy levels
-
- 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/32—Address formation of the next instruction, e.g. by incrementing the instruction counter
- G06F9/322—Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address
- G06F9/325—Address 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
-
- 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/04—Addressing variable-length words or parts of words
-
- 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/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0806—Multiuser, multiprocessor or multiprocessing cache systems
- G06F12/0815—Cache consistency protocols
-
- 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/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0862—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches with prefetch
-
- 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/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0875—Addressing 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
-
- 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/3001—Arithmetic instructions
-
- 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
- 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
- G06F9/30038—Instructions to perform operations on packed data, e.g. vector, tile or matrix operations using a mask
-
- 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/3004—Arrangements for executing specific machine instructions to perform operations on memory
- G06F9/30047—Prefetch instructions; cache control instructions
-
- 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/30072—Arrangements for executing specific machine instructions to perform conditional operations, e.g. using predicates or guards
-
- 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/30101—Special purpose registers
-
- 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/3012—Organisation of register space, e.g. banked or distributed register file
-
- 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/3012—Organisation of register space, e.g. banked or distributed register file
- G06F9/3013—Organisation of register space, e.g. banked or distributed register file according to data content, e.g. floating-point registers, address registers
-
- 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/30145—Instruction analysis, e.g. decoding, instruction word fields
-
- 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/34—Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes
- G06F9/345—Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes of multiple operands or results
-
- 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/3818—Decoding for concurrent execution
- G06F9/3822—Parallel decoding, e.g. parallel decode units
-
- 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/3824—Operand accessing
- G06F9/383—Operand prefetching
-
- 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/3836—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
- G06F9/3853—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution of compound instructions
-
- 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/3877—Concurrent instruction execution, e.g. pipeline or look ahead using a slave processor, e.g. coprocessor
-
- 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/1056—Simplification
-
- 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/45—Caching of specific data in cache memory
- G06F2212/452—Instruction code
-
- 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/45—Caching of specific data in cache memory
- G06F2212/454—Vector or matrix data
-
- 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/6026—Prefetching based on access pattern detection, e.g. stride based prefetch
-
- 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/34—Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes
- G06F9/355—Indexed addressing
- G06F9/3552—Indexed addressing using wraparound, e.g. modulo or circular addressing
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Mathematical Physics (AREA)
- Computational Mathematics (AREA)
- Mathematical Analysis (AREA)
- Mathematical Optimization (AREA)
- Pure & Applied Mathematics (AREA)
- Advance Control (AREA)
- Complex Calculations (AREA)
Abstract
本发明涉及具有在每个维度上可选择的多维循环寻址的流引擎。一种在数字数据处理器中使用的流引擎(125,2700),其指定由多个嵌套循环定义的固定只读数据流。地址生成器(1901)生成嵌套循环的数据元素的地址。流首寄存器(2718,2728)存储接下来要提供给功能单元以作为操作数使用的数据元素。流模板寄存器(2800)独立地为嵌套循环中的每一个指定线性地址或循环地址模式。
Description
相关申请
本专利申请是对于2014年7月15日提交的名称为《高度集成的可扩展的柔性DSP百万模块架构(HIGHLY INTEGRATED SCALABLE,FLEXIBLE DSP MEGAMODULE ARCHITECTURE)》的美国专利申请序列号14/331,986的改进,其要求2013年7月15日提交的美国临时专利申请序列号61/846,148的优先权。
技术领域
本发明的技术领域是数字数据处理,并且更具体地说是用于操作数取回的流引擎(streaming engine)的控制。
背景技术
现代数字信号处理器(DSP)面临着多重挑战。工作量不断增加,需要增加带宽。片上系统(SOC)的尺寸和复杂性不断增加。内存(memory)系统延迟严重影响某些类别的算法。随着晶体管越来越小,内存和寄存器变得不太可靠。随着软件栈越来越大,潜在的交互和错误的数量变得越来越大。
内存带宽和调度对于在实时数据上操作的数字信号处理器是个问题。在实时数据上操作的数字信号处理器通常接收输入数据流,对数据流执行过滤功能(例如编码或解码)并输出经过转换的数据流。该系统被称为实时,因为如果转换的数据流在调度时不可用于输出,则应用程序失效。典型的视频编码需要可预测但非连续的输入数据模式。在可用的地址生成和内存访问资源中,对应的内存访问通常很难实现。一个典型的应用程序需要内存访问来加载数据寄存器堆(register file)中的数据寄存器,并且然后提供给执行数据处理的功能单元。
发明内容
本发明是在数字信号处理器中使用的流引擎。通过在控制寄存器中存储对应的参数来指定固定的数据流序列。数据流包括多个嵌套循环(nested loop)。一旦开始,数据流是只读的,不能被写入。使用流数据的功能单元具有仅读取数据的第一指令类型,和读取数据并使流引擎推进流的第二指令类型。这通常对应于实时过滤操作的需要。
流引擎包括产生数据元素的地址的地址生成器和存储接下来要提供给功能单元作为操作数使用的数据元素的流首寄存器(stream head register)/流磁头寄存器(stream head register)。多个嵌套循环中的每一个具有独立指定的线性寻址模式或具有指定的循环块大小的循环寻址模式。
对应的寻址模式和循环块大小由存储在流定义模板寄存器中的流定义模板中的对应字段指定。该流定义模板还指定了预定义数据流的其他方面,包括数据大小和数据类型。
优选实施例包括两个独立定义的数据流。两个数据流可以被一组超长指令字(VLIW)功能单元独立读取或读取/前进。
附图说明
在附图中示出了本发明的这些和其他方面,其中:
图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示出了由维度(dimension)格式字段指定的本发明的第一替代流模板寄存器;
图31示出了由维度格式字段指定的本发明的第二替代流模板寄存器;
图32示出了由维度格式字段指定的本发明的第三替代流模板寄存器;
图33示出了由维度格式字段指定的本发明的第四替代流模板寄存器;
图34示出了由维度格式字段指定的本发明的第五替代流模板寄存器;
图35示出了一个循环计数选择电路,其用于选择由维度格式字段控制的多个嵌套循环的循环计数的流定义模板位;
图36示出了一个循环维度选择电路,其用于选择由维度格式字段控制的多个嵌套循环的循环维度的流定义模板位;
图37示出了加法器控制字电路的一个示例,该电路为控制线性寻址模式和循环寻址模式的选择的循环地址发生器产生加法器控制字;
图38是示出了本发明的嵌套循环的地址生成的部分示意图。
图39示出了显示本发明的操作数的流引擎供应的部分示意图。
具体实施方式
图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的分派任务的一部分确定是在标量数据路径侧A 115还是矢量数据路径侧B 116中的功能单元上执行。每个指令中被称为s位的指令位确定哪个数据路径是指令控制的。这将在下面进一步详述。
指令解码单元113解码当前执行包中的每个指令。解码包括识别执行指令的功能单元、识别可能的寄存器堆中的提供用于对应的数据处理操作的数据的寄存器以及识别对应的数据处理操作的结果的寄存器目的地。如下面进一步解释的,指令可以包括代替一个寄存器编号操作数字段的常数字段。该解码的结果是用于控制目标功能单元以执行由指定数据上的对应指令指定的数据处理操作的信号。
中央处理单元内核110包括控制寄存器114。控制寄存器114以与本发明无关的方式存储用于控制标量数据路径侧A 115和矢量数据路径侧B 116中的功能单元的信息。该信息可以是模式信息等。
来自指令解码113的解码指令和存储在控制寄存器114中的信息被提供给标量数据路径侧A 115和矢量数据路径侧B 116。结果,标量数据路径侧A115和矢量数据路径侧B116内的功能单元对指令指定数据执行指令指定的数据处理操作并将结果存储在指令指定的一个或更多个数据寄存器中。标量数据路径侧A 115和矢量数据路径侧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在操作数宽算术逻辑单元(标量数据路径侧A115功能单元为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上的程序消耗该数据并产生输出。
流元素通常驻留在正常的内存中。内存本身不在流上施加特定的结构。程序通过指定以下流属性来定义流,从而施加结构:流的第一个元素的地址;流中元素的大小和类型;流中的数据的格式化;和与该流相关的地址序列。
流引擎根据遍历内存的指针来定义流的元素的地址序列。多级嵌套循环控制指针所采用的路径。循环级别的迭代计数表示级别重复的次数。维度给出了该循环级别的指针位置之间的距离。
在基本的前向流中,最内层的循环总是消耗来自内存的物理上连续的元素。这个最内层循环的隐含维度是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)存储器时每个接口都可以发送足以实现完全的读取返回带宽的请求。
为了使性能最大化,两个流都可以使用两个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在架构上不可见,除了当启用这种转置访问模式时。
流定义模板提供包括数据的流的完整结构。迭代计数和维度提供了大部分的结构,而各种标志提供了其余的细节。对于所有包括数据的流,流引擎定义了单个流模板。它支持的所有流类型都适合该模板。流引擎定义了用于寻址流中元素的六级循环嵌套。流模板中的大部分字段直接映射到该算法中的参数。图28示出了流模板寄存器2800。字段上方的数字是256位矢量内的位数。表6显示了流模板的流字段定义。
表6
循环0是最内层的循环,并且循环5是最外层的循环。在当前的示例中,DIM0总是等于定义物理上连续的数据的ELEM_BYTES。因此,流模板寄存器2800不定义DIM0。流引擎2700将所有迭代计数解释为无符号整数,并将所有维度解释为未经缩放的有符号整数。上面的模板完全指定了元素的类型、流的长度和维度。流指令分别指定一个开始地址。这通常通过标量寄存器堆211中的标量寄存器的指定,该标量寄存器堆211存储该开始地址。这允许程序使用相同的模板打开多个流。
图29示出了标志字段2811的子字段定义。如图29所示,标志字段2811是6字节或48位。图29显示了字段的位数。表7显示了这些字段的定义。
表7
元素类型(ELTYPE)字段2901定义流中元素的数据类型。ELTYPE字段2901的四位的编码如表8所示进行定义。
表8
实数/复数类型确定流引擎是将每个元素视为实数还是复数的两个部分(实部/虚部或幅度/角度)。该字段还指定是否交换复数的两个部分。复数类型的总元素大小是其子元素大小的两倍。否则,子元素大小等于总元素大小。
子元素大小确定用于类型提升和矢量通道宽度的类型。例如,当流请求类型提升时,16位子元素被提升为32位子元素。当中央处理单元内核110以大端模式操作时,矢量通道宽度是重要的,因为它总是以小端顺序布置矢量。
总元素大小确定流的最小粒度。在流寻址模型中,它确定流最内层循环的每次迭代流取回的字节数。流总是读取整个元素,无论是以增加还是降低的顺序。因此,流的最内部维度跨越ICNT0x总元素大小字节。
TRANSPOSE字段2902确定流引擎是否以转置顺序访问流。转置顺序交换内部的两个寻址级别。TRANSPOSE字段2902还指示它转置流的粒度。对于正常的二维操作,TRANSPOSE字段2902的三位的编码被定义为如表9所示。
转置 | 含义 |
000 | 禁用转置 |
001 | 在8位边界上转置 |
010 | 在16位边界上转置 |
011 | 在32位边界上转置 |
100 | 在64位边界上转置 |
101 | 在128位边界上转置 |
110 | 在256位边界上转置 |
111 | 保留 |
表9
流引擎2700可以以与元素大小不同的粒度转置数据元素。这允许程序从每一行取回多列元素。转置粒度必须不小于元素大小。TRANSPOSE字段2902以下面进一步描述的方式与DIMFMT字段2909交互。
PROMOTE字段2903控制流引擎是否提升流中的子元素和提升的类型。当启用时,流引擎2700通过2的幂次大小来提升类型。PROMOTE字段2903的三位的编码被定义为如表10所示。
表10
当PROMOTE是000时,对应于1x提升,每个子元素不变并且占据与ELTYPE指定的大小相等的宽度的矢量通道。当PROMOTE是001时,对应于2x提升和零扩展,每个子元素都被视为无符号整数,并零扩展到ELTYPE指定宽度的两倍的矢量通道。对于64位的初始子元素大小,2x提升无效。当PROMOTE是010时,对应于4x提升和零扩展,每个子元素被视为无符号整数,并零扩展到ELTYPE指定宽度的四倍的矢量通道。对于32位或64位的初始子元素大小,4x提升无效。当PROMOTE是011时,对应于8x提升和零扩展,每个子元素被视为无符号整数,并且零扩展到由ELTYPE指定宽度的八倍的矢量通道。对于16位、32位或64位的初始子元素大小,8x提升无效。当PROMOTE是101时,对应于2x提升和符号扩展,每个子元素被视为有符号整数,并符号扩展到ELTYPE指定宽度的两倍的矢量通道。对于64位的初始子元素大小,2x提升无效。当PROMOTE是110时,对应于4x提升和符号扩展,每个子元素被视为有符号整数,并符号扩展到ELTYPE指定宽度的四倍的矢量通道。对于32位或64位的初始子元素大小,4x提升无效。当PROMOTE是111时,对应于8x提升和零扩展,每个子元素被视为有符号整数,并且符号扩展到由ELTYPE指定宽度的八倍的矢量通道。对于16位、32位或64位的初始子元素大小,8x提升无效。
VECLEN字段2904以字节为单位定义流的流矢量长度。流引擎2700将流分解成VECLEN字节长的元素组。VECLEN字段2904的三位的编码被定义为如表11所示。
VECLEN | 流矢量长度 |
000 | 1字节 |
001 | 2字节 |
010 | 4字节 |
011 | 8字节 |
100 | 16字节 |
101 | 32字节 |
110 | 64字节 |
111 | 保留 |
表11
VECLEN必须大于或等于以字节为单位的元素大小和重复因子的乘积。流引擎2700将该流作为单个矢量对的序列或双矢量序列呈现给中央处理单元内核110。当VECLEN短于中央处理单元内核110的原始(native)矢量宽度时,流引擎2700填充向中央处理单元内核110提供的矢量中的额外通道。GRDUP字段2906确定填充的类型。VECLEN字段2904以下面详述的方式与ELDUP字段2905和GRDUP字段2906交互。
ELDUP字段2905指定重复每个元素的次数。乘以元素重复量的元素大小不得超过64个字节。ELDUP字段2905的三位的编码被定义为如表12所示。
ELDUP | 复制(duplication)因子 |
000 | 无复制 |
001 | 2次 |
010 | 4次 |
011 | 8次 |
100 | 16次 |
101 | 32次 |
110 | 64次 |
111 | 保留 |
表12
ELDUP字段2905以下面详述的方式与VECLEN字段2904和GRDUP字段2906交互。
GRDUP位2906确定组复制是否被启用。如果GRDUP位2906是0,则组复制被禁用。如果GRDUP位2906是1,则组复制被启用。当由GRDUP位2906启用时,流引擎2700复制一组元素以填充矢量宽度。VECLEN字段2904定义要复制的组的长度。当VECLEN字段2904小于中央处理单元内核110的矢量长度并且GRDUP位2906启用组复制时,流引擎2700用流矢量的附加副本填充额外通道(参见图20和图21)。因为流矢量长度和中央处理单元内核110的矢量长度总是2的幂,所以组复制总是产生复制副本的数量的2的幂。GRDUP字段2906指定流引擎2700如何将流矢量向外填充到中央处理单元内核110的矢量长度。当GRDUP位2906是0时,流引擎2700用零填充额外通道,并将这些额外的矢量通道标记为无效。当GRDUP位2906是1时,流引擎2700用每个流矢量中的元素组的副本填充额外的通道。当VECLEN被设置为中央处理单元内核110的原始矢量宽度时,将GRDUP位2906设置为1不起作用。
DECIM字段2907控制对应流的数据元素抽取。存储在首寄存器2718/2728中时,流引擎2700从流中删除数据元素,以呈现给请求功能单元。抽取总是去除整个数据元素,而不是子元素。DECIM字段2907的定义如表13所列。
DECIM | 抽取(decimation)因子 |
00 | 无抽取 |
01 | 2次 |
10 | 4次 |
11 | 保留 |
表13
如果DECIM字段2907等于00,则不发生抽取。在不变的情况下,数据元素被传送到对应的首寄存器2718/2728。如果DECIM字段2907等于01,则发生2:1抽取。存储在首寄存器2718/2728中时,流引擎2700从数据流中去除奇数元素。格式化网络中的限制要求采用2:1抽取,将数据提升至少2x(PROMOTE不能是000),ICNT0必须是2的倍数,并且总矢量长度(VECLEN)必须足够大以容纳单个提升的、复制的元素。对于转置流(TRANSPOSE≠0),转置粒子在提升之前必须至少是以字节为单位的元素大小的两倍。如果DECIM字段2907等于10,则发生4:1抽取。存储在首寄存器2718/2728中时,流引擎2700保留每个第四数据元素从数据流中去除三个元素。格式化网络中的限制要求采用4:1抽取,将数据提升至少4x(PROMOTE不能是000、001或101),ICNT0必须是4的倍数,并且总矢量长度(VECLEN)必须足够大以容纳单个提升的、复制的元素。对于转置流(TRANSPOSE≠0),抽取总是去除列,而从不去除行。因此,转置粒度必须是:在针对2:1抽取提升(GRANULE≥2x ELEM_BYTES)之前至少是以字节为单位的元素大小的两倍;并且在针对4:1抽取提升(GRANULE≥4x ELEM_BYTES)之前,至少是以字节为单位的元素大小的四倍。
THROTTLE字段2908控制流引擎在中央处理单元内核110之前取回的积极程度。该字段的两位的编码如表14所示进行定义。
THROTTLE | 描述 |
00 | 最小化节流,最大化提前取回 |
01 | 更少节流,更多提前取回 |
10 | 更多节流,更少提前取回 |
11 | 最大化节流,最小化提前取回 |
表14
THROTTLE不会改变流的含义,并且只能作为提示。流引擎可能会忽略此字段。程序不应该依赖特定的节流行为来保证程序的正确性,因为架构没有指定精确的节流行为。THROTTLE允许程序员向硬件提供关于程序自身行为的提示。默认情况下,流引擎试图尽可能远地领先中央处理单元内核110,以隐藏尽可能多的延迟时间,同时向中央处理单元内核110提供全流式吞吐量。尽管几个关键应用程序需要这种级别的吞吐量,它可能会导致针对其他的不佳的系统级别行为。例如,流引擎丢弃通过上下文切换取回的所有数据。因此,在具有大量上下文切换的系统中,积极的提前取回可导致带宽浪费。只有在中央处理单元内核110非常快速地消耗数据时,在这些系统中的积极提前取回是有意义的。
DIMFMT字段2909使得能够重新定义循环计数字段ICNT0 2801、ICNT1 2802、ICNT22803、ICNT3 2804、ICNT4 2805和ICNT5 2806,循环维度字段DIM1 2855、DIM2 2823、DIM32824、DIM4 2825和DIM5 2826以及流模板寄存器2800的寻址模式字段AM0 2913、AM1 2914、AM2 2915、AM3 2916、AM4 2917和AM5 2918(FLAGS字段2811的一部分)。这允许一些循环维度字段和循环计数来包括更多的位数,代价是循环更少。表15列出了DIMFMT字段2909的各种值的循环维度字段的大小。
表15
注意,DIM0总是等于ELEM_BYTES数据元素的大小。表16列出了DIMFMT字段2909的各种值的循环计数字段的大小。
表16
DIMFMT字段2909有效地定义流模板寄存器2800的循环维度和循环计数位。图28示出了DIMFMT为111时的默认情况。
图30至图34示出了用于DIMFMT的其它值的流模板寄存器的位的定义。注意,FLAGS字段(2811,3011,3111,3211,3311和3411)的位置和含义对于DIMFMT的所有值是相同的。
图30示出了对于000的DIMFMT值,流模板寄存器3000的位的定义。对于000的DIMFMT值,有三个循环:loop0、loop2和loop4。对于loop0,ICNT0字段3001包括位0至31,并且DIM0字段等于ELEM_BYTES。对于Loop2,ICNT2字段3002包括位32至63,并且DIM2字段3021包括位160至191。对于loop4,INTC4字段3003包括位64至95,并且DIM4字段3022包括位192至223。
图31示出了对于001的DIMFMT值,流模板寄存器3100的位的定义。对于001的DIMFMT值,有四个循环:loop0、loop1、loop2和loop4。对于loop0,ICNT0字段3101包括位0至16,并且DIM0字段等于ELEM_BYTES。对于Loop1,ICNT1字段3002包括位16至31,并且DIM1字段3123包括位224至255。对于Loop2,INTC2字段3103包括位32至63,并且DIM2字段3121包括位160至191。对于loop4,INTC4字段3104包括位64至95,并且DIM4字段3122包括位192至223。
图32示出了对于010的DIMFMT值,流模板寄存器3200的位的定义。对于010的DIMFMT值,有四个循环:loop0、loop2、loop3和loop4。对于loop0,ICNT0字段3201包括位0至32,并且DIM0字段等于ELEM_BYTES。对于Loop2,ICNT2字段3202包括位32至47,并且DIM2字段3221包括位160至191。对于loop3,INTC3字段3203包括位48至63,并且DIM3字段3223包括位224至255。对于loop4,INTC4字段3204包括位64至95,并且DIM4字段3222包括位192至223。
图33示出了对于011的DIMFMT值,流模板寄存器3300的位的定义。对于011的DIMFMT值,有五个循环:loop0、loop1、loop2、loop3和loop4。对于loop0,ICNT0字段3401包括位0至15,并且DIM0字段等于ELEM_BYTES。对于Loop1,ICNT1字段3402包括位16至31,并且DIM1字段3421包括位144至159。对于Loop2,ICNT2字段3403包括位32至47,并且DIM2字段3221包括位160至191。对于loop3,INTC3字段3204包括位48至63,并且DIM3字段3424包括位224至255。对于loop4,INTC4字段3405包括位64到95,并且DIM4字段3423包括位192至223。
图34示出了对于101的DIMFMT值,流模板寄存器3400的位的定义。对于110的DIMFMT值,有六个循环:loop0、loop1、loop2、loop3、loop4和loop5。对于loop0,ICNT0字段3501包括位0至15,并且DIM0字段等于ELEM_BYTES。对于Loop1,ICNT1字段3502包括位16至31,并且DIM1字段3521包括位144至159。对于Loop2,ICNT2字段3503包括位32至47,并且DIM2字段3522包括位160至191。对于loop3,INTC3字段3504包括位48至63,并且DIM3字段3525包括位224至255。对于loop4,INTC4字段3405包括位64至79,并且DIM4字段3523包括位192至207。对于loop5,INTC5字段3506包括位80至95,并且DIM5字段3524包括位208至223。
DIR位2910确定内部循环(Loop0)的取回的方向。如果DIR位2910是0,则Loop0取回在朝向增加地址的正向。如果DIR位2910是1,则Loop0取回在朝向减少地址的反向。其他循环的取回方向由是有符号整数的对应的循环维度DIM1、DIM2、DIM3、DIM4和DIM5的符号确定。
CBK0字段2911和CBK1字段2912在选择循环寻址时控制循环块大小。下面将更全面地描述确定循环块大小的方式。
AM0字段2913、AM1字段2914、AM2字段2915、AM3字段2916、AM4字段2917和AM5字段2918控制对应循环的寻址模式。这允许为每个循环独立指定寻址模式。AM0字段2913、AM1字段2914、AM2字段2915、AM3字段2916、AM4字段2917和AM5字段2918中的每一个都是三位,并且如表17中所列解码。
AMx字段 | 含义 |
00 | 线性寻址 |
01 | 由CBK0设置的循环寻址块的大小 |
10 | 由CBK0+CBK1+1设置的循环寻址块大小 |
11 | 保留 |
表17
在线性寻址中,地址按照地址算术是前进还是后退而前进。在循环寻址中,地址保持在定义的地址块内。在达到循环地址块的末端时,地址回绕到(wrap around)块的其他限制。循环寻址块通常限于2N个地址,其中N是整数。循环地址算术可以通过切割位之间的进位链并且不允许所选数量的最高有效位改变来操作。因此,超出循环块末端的算术只改变最低有效位。
块大小设置如表18中所列。
表18
在优选实施例中,通过由CBK0(第一循环地址模式01)编码的数字或由CBK0+CBK1+1(第二循环地址模式10)编码的数字来设置循环块大小。例如第一循环地址模式,循环地址块大小可以从512字节到16M字节。对于第二循环地址模式,循环地址块大小可以从1K字节到64G字节。因此,编码块大小为2(B+9)个字节,其中B是对于第一块大小(01的AMx)为CBK0且对于第二块大小(10的AMx)为CBK0+CBK1+1的编码块数。
图35示出了循环计数选择电路3500,循环计数选择电路3500是从流模板寄存器为各种循环维度选择数据的示例性实施例。如图28和图30至图34所示,定义循环计数的流模板寄存器位根据DIMFMT字段而变化。图35示出了流模板寄存器的位0至95。这些位被分成6部分,包括:部分3501,位0至15;部分3502,位16至31;部分3503,位32至47;部分3504,位48至63;部分3505,位64至79;和部分3506,位80至95。
连接器3511从部分3501和3502形成单个32位数据字。多路复用器3512为INCT0输出选择部分3501或连接器3511的输出。多路复用器3513为INCT1输出选择空输入或部分3502。
连接器3521从部分3503和3504形成单个32位数据字。多路复用器3522为INCT2输出选择部分3503或连接器3521的输出。多路复用器3523为INCT3输出选择空输入或部分3504。
连接器3531从部分3505和3506形成单个32位数据字。多路复用器3532为INCT4输出选择部分3505或连接器3531的输出。多路复用器3533为INCT5输出选择空输入或部分3506。
DIMFMT ICNT解码器3508从流模板寄存器接收DIMFT位并生成控制多路复用器3512、3513、3522、3523、3532和3533的选择的输出。表19列出了这些多路复用器对于DIMFMT字段的各种编码的控制。
表19
图36示出了循环维度选择电路3600,循环维度选择电路3600是从流模板寄存器为各种循环维度选择数据的示例性实施例。注意,DIM0(loop0的循环维度)总是ELEN_BYTES。如图28和图30至图34所示,定义循环维度的流模板寄存器位根据DIMFMT字段而变化。图36示出了流模板寄存器的位144至255。这些位被分成6部分,包括:部分3601,位144至159;部分3602,位160至175;部分3603,位176至191;部分3604,位192至207;部分3605,位208至223;和部分3606,位224至255。
连接器3611从部分3602和3603形成单个32位数据字。多路复用器3612为DIM1输出选择部分3601、空输入或部分3606。多路复用器3613为DIM2输出选择部分3602或连接器3611的输出。多路复用器3614为DIM3输出选择部分3604、空输入或部分3606。
连接器3621从部分3604和3605形成单个32位数据字。多路复用器3622为DIM4输出选择部分3604或连接器3621的输出。多路复用器3623为DIM5输出选择空输入、部分3605或部分3606。
DIMFMT DIM解码器3607从流模板寄存器接收DIMFT位并生成控制多路复用器3612、3613、33614、3622和353的选择的输出。表20列出了这些多路复用器对于DIMFMT字段的各种编码的控制。
表20
图37示出了加法器控制字电路3700的一个示例,其为下面将要描述的循环地址生成器生成加法器控制字。所述寻址模式字段AM0 2913、AM1 2914、AM2 2915、AM3 2916、AM42917和AM5 2918各自控制流引擎地址的对应循环的寻址模式。所述地址控制字电路3700被提供给流引擎地址的每个支持的循环。加法器3701形成CBK0、CBK1和1的和。字段CBK0和CBK1各自是4位字段,并且是对应的流模板寄存器的EFLAGS字段的一部分。字段CBK0和CBK1被提供给加法器3701的操作数输入。数量+1被提供给加法器3701的最低有效位的进位输入。这种结构实现三项加法而无需特殊的加法器硬件。加法器3710的和输出提供多路复用器3702的一个输入。多路复用器3702的第二输入是空。多路复用器3701的第三输入是CBK0。多路复用器3702由对应的循环的AMx字段控制。如果AMx是000,则多路复用器3702选择空输入。如果AMx是001,则多路复用器3702选择CBK0输入。如果AMx是010,则多路复用器3702选择由加法器3701输出的和CBK0+CBK1+1。多路复用器3702的输出被用作加法器控制字查找表3703中的索引。从加法器控制字查找表3703访问的加法器控制字用于以类似于上面结合图18和表3描述的SIMD控制的方式来控制对应的循环加法器(参见图38)。对应的循环加法器包括如图18所示的进位中断电路,之后是在表18中列出的支持的块大小对应的位。加法器控制字查找表3703包括诸如表3中列出的各种块大小的控制字。选定的数字CBK0或CBK0+CBK1+1索引适当的加法器控制字。如果多路复用器3702选择对应于线性寻址的空输入,则对应的加法器控制字是全1,允许加法器在所有地址位之间进位。
图38示出了流引擎2700地址生成器3800的部分示意图。地址生成器3800形成用于取回对应流引擎的定义流中的下一个元素的地址。开始地址寄存器3801存储数据流的开始地址。如前所述,开始地址寄存器3801优选地是全局标量寄存器堆211中的标量寄存器,其由STROPEN指令指定,该指令打开对应的流。如本领域中已知的,可以从指定的标量寄存器复制该开始地址,并将其本地地存储在对应的地址生成器2711或2721处。该流的第一循环采用Loop0计数寄存器3811、加法器3812、乘法器3813和比较器3814。Loop0计数寄存器3811存储第一循环(Loop0)的迭代计数的工作副本。对于Loop0加法器3812的每次迭代,由下一地址(Next Address)信号触发,将循环计数加1,该循环计数存储回到Loop0计数寄存器3811中。乘法器3813将当前循环计数和数量ELEM_BYTES相乘。ELEM_BYTES是循环中每个数据元素的大小(以字节为单位)。Loop0遍历迭代内存中物理连续的数据元素,步长为ELEM_BYTES。
比较器3814将存储在Loop0计数寄存器3811中(在由加法器3812递增之后)的计数与来自对应的流模板寄存器2800的ICNT0 2801的值进行比较。如上所述,取决于DIMFMT字段2909的状态,Loop0计数可以在部分3001、部分3101、部分3201、部分3301或部分3401。当加法器3812的输出等于流模板寄存器2800的ICNT0 2801的值时,Loop0的迭代完成。比较器3814生成有效的Loop0结束信号。Loop0计数寄存器3811被重置为0,并且触发下一个更高循环的迭代,在这种情况下是Loop1。
较高循环(Loop1,Loop2,Loop3,Loop4,Loop5)的电路类似于图38所示出的电路。每个循环包括对应的工作循环计数寄存器、加法器、乘法器和比较器。每个循环的加法器由前一个循环的循环结束信号触发。每个乘法器的第二输入是对应流模板的对应维度DIM1,DIM2,DIM3,DIM4和DIM5。每个循环的比较器将工作循环寄存器计数与对应的流模板寄存器的对应迭代值ICNT1,ICTN2,ICTN3,ICTN4和ICTN5进行比较。循环结束信号生成下一个较高循环的迭代。来自loop5的循环结束信号结束流。
图38示出了接收加法器控制字的加法器3812。如上所述,该加法器控制字对于线性寻址为全1,并且对于循环寻址在适当位置处具有0。加法器控制字中的0的位置对应于循环寻址模式的循环块大小。
中央处理单元内核110通过少量指令和专用寄存器将流引擎暴露给程序。STROPEN指令打开流。STROPEN命令指定表示打开流0或流1的流号。STROPEN指定存储如上所述流模板的流模板寄存器。表21列出了STROPEN指令的提要。
提要 | 描述 |
流开始地址寄存器 | 存储流开始地址的标量寄存器 |
流号 | 流0或流1 |
流模板寄存器 | 存储流模板数据的矢量寄存器 |
表21
流开始地址寄存器优选地是通用标量寄存器堆211中的标量寄存器。STROPEN指令通过其操作码来指定流0或流1。流模板寄存器优选地是通用矢量寄存器堆221中的矢量寄存器。如果指定的流是活动的,则STROPEN指令关闭先前的流并用指定的流代替该流。
STRCLOSE指令关闭流。STRCLOSE命令指定要关闭的流的流号。
STRSAVE指令捕获指定流的足够状态信息以在将来重新启动该流。STRRSTR指令恢复以前保存的流。STRSAVE指令不保存流的任何数据。STRSAVE指令只保存元数据。流响应STRRSTR指令重新取回数据。
流引擎处于以下三种状态之一:不活动的;活动的;或冻结。当不活动时,流引擎什么都不做。任何尝试从无效的流引擎取回数据都是错误。直到程序打开流之前,流引擎是不活动的的。在程序耗用流中的所有元素或程序关闭流之后,流引擎也变为不活动的。使用流的程序显式激活和停用流引擎。结合其自己的显式保存和恢复操作,操作环境通过流引擎的隐式冻结行为来管理跨上下文切换边界的流。
活动的流引擎具有与其关联的流。程序可以从活动的流引擎中取回新的流元素。流引擎保持活动的,直到出现下列之一。当流从流中取回最后一个元素时,它变为不活动的。当程序显式关闭流时,它变为不活动的。当中央处理单元内核110响应中断或异常时,流引擎冻结。在流引擎冻结时,冻结的流引擎捕获恢复流所需的所有状态。流引擎响应于中断和异常而冻结。这结合特殊的指令来保存和恢复冻结的流上下文,以便操作环境可以清楚地切换上下文。当中央处理单元内核110返回到中断的上下文时,冻结的流重新激活。
图39是示出了上述流输入操作数编码的部分示意图3900。图39示出了解码功能单元3920的对应src1输入的一个指令的src1字段1305。这些相同的电路被复制用于src2/cst字段1304和功能单元3920的src2输入。另外,这些电路针对在可以同时分派的执行包内的每个指令被复制。
指令解码器113接收包括指令的src1字段1305的位13至17。操作码字段操作码字段(所有指令的位4至12以及附加的无条件指令的位28至31)明确地指定了对应的功能单元3920。在该实施例中,功能单元3920可以是L2单元241、S2单元242、M2单元243、N2单元244或C单元245。图39中所示出的指令解码器113的相关部分解码src1位字段1305。子解码器3911确定src1位字段1305是否在从00000至01111的范围内。如果是这种情况,子解码器3911将对应的寄存器编号提供给全局矢量寄存器堆231。在该示例中,该寄存器字段是src1位字段1305的四个最低有效位。全局矢量寄存器堆231调用存储在与该寄存器编号对应的寄存器中的数据,并将该数据提供给功能单元3920的src1输入。该解码在本领域中通常是已知的。
子解码器3912确定src1位字段1305是否在从10000至10111的范围内。如果是这种情况,则子解码器3912将对应的寄存器编号提供给对应的本地矢量寄存器堆。如果指令指向L2单元241或S2单元242,则对应的本地矢量寄存器堆是本地矢量寄存器字段232。如果指令指向M2单元243、N2单元244或C单元245,则对应的本地矢量寄存器堆是本地矢量寄存器字段233。在该示例中,该寄存器字段是src1位字段1305的三个最低有效位。对应的本地矢量寄存器堆232/233调用存储在与该寄存器编号对应的寄存器中的数据,并将该数据提供给功能单元3920的src1输入。该解码在本领域中通常是已知的。
子解码器3913确定src1位字段1305是否是11100。如果是这种情况,则子解码器3913将流0读取信号提供给流引擎2700。流引擎2700然后将存储在保持寄存器2718中的流0数据提供给功能单元3920的src1输入。
子解码器3914确定src1位字段1305是否是11101。如果是这种情况,则子解码器3914将流0读取信号提供给流引擎2700。流引擎2700然后将存储在保持寄存器2718中的流0数据提供给功能单元3920的src1输入。子解码器3914还向流0提供提前信号。如前所述,流引擎2700前进以将流0的下一个顺序数据元素存储在保持寄存器2718中。
子解码器3915确定src1位字段1305是否是11110。如果是这种情况,则子解码器3915将流1读取信号提供给流引擎2700。流引擎2700然后将存储在保持寄存器2728中的流1数据提供给功能单元3920的src1输入。
子解码器3916确定src1位字段1305是否是11111。如果是这种情况,则子解码器3916将流1读取信号提供给流引擎2700。流引擎2700然后将存储在保持寄存器2728中的流1数据提供给功能单元3920的src1输入。子解码器3914还向流1提供提前信号。如前所述,流引擎2700前进以将流1的下一个顺序数据元素存储在保持寄存器2728中。
响应于src2/cst字段1304的位编码,使用类似的电路来选择提供给功能单元3902的scr2输入的数据。可以以上述方式向功能单元3920的src2输入提供常数输入。
致力于操作数指定的指令位的确切数量以及数据寄存器和数据流的数量是设计选择。本领域技术人员将认识到,在本申请中描述的其他数量选择是可行的。特别是,单个全局矢量寄存器堆的指定和本地矢量寄存器堆的省略是可行的。本发明采用输入操作数选择字段的位编码来指定流读取和另一位编码来指定流读取和前进流。
Claims (20)
1.一种数字数据处理器,其包括:
存储多个指令的指令内存,每个所述指令指定数据处理操作和至少一个数据操作数;
连接到所述指令内存的指令解码器,所述指令解码器用于依序调用来自所述指令内存的所述指令并确定针对每个调用的指令的指定的所述数据处理操作和所述至少一个数据操作数;
连接到数据寄存器堆和所述指令解码器的至少一个功能单元,所述至少一个功能单元用于对与由所述指令解码器解码的指令对应的至少一个数据操作数执行数据处理操作,并致使所述数据处理操作的结果被存储在所述数据寄存器堆中;和
连接到所述指令解码器的流引擎,所述流引擎响应于流开始指令而从内存中调用数据流,其中,所述数据流包括数据元素的序列,并且所述序列包括多个嵌套循环,其中,所述流引擎包括:
地址生成器,所述地址生成器用于生成对应于所述数据流的所述数据元素的序列的流内存地址,其中,所述多个嵌套循环中的每一个具有线性寻址模式和循环寻址模式中的单独指定的一个;和
流首寄存器,所述流首寄存器存储接下来要被所述至少一个功能单元使用的所述数据流的数据元素,其中,所述至少一个功能单元响应流操作数指令,以从所述流首寄存器接收至少一个数据操作数;
其中,所述数据元素的序列的所述数据流至少部分地由存储在流定义模板寄存器中的流定义模板来指定,其中,所述流定义模板包括多个寻址模式字段,每个寻址模式字段对应于所述嵌套循环中的相应一个,并且每个寻址模式字段指定所述线性寻址模式或所述循环寻址模式用于其相应的嵌套循环。
2.根据权利要求1所述的数字数据处理器,其中,所述流定义模板还包括循环维度字段,每个循环维度字段指定循环维度数据,并且其中,所述地址生成器被配置为使用所述循环维度数据来生成对应于每个嵌套循环的所述数据流的所述数据元素的序列的所述流内存地址,其中指定所述循环寻址模式用于所述每个嵌套循环。
3.根据权利要求1所述的数字数据处理器,其中:
所述流操作数指令属于流操作数只读指令和流操作数读取和增加指令中的一个;并且
当所述流操作数指令是所述流操作数读取和增加指令时,所述流引擎还被配置为响应于所述流操作数读取和增加指令而将下一个取回的数据元素存储在所述流首寄存器中,并且在提供存储在流缓冲器高速缓存行中的所有数据元素后释放对应的流缓冲器高速缓存行。
4.根据权利要求3所述的数字数据处理器,其中:
所述数据寄存器堆包括多个数据寄存器,其中,每个数据寄存器由寄存器编号指定;并且
所述指令解码器被配置为:
将具有包括位编码的第一子集的数据操作数字段的指令解码,以将存储在对应的数据寄存器中的数据提供给对应的功能单元;
将具有包括预定读取位编码的数据操作数字段的指令解码为所述流操作数只读指令;并且
将具有包括预定读取/前进位编码的数据操作数字段的指令解码为所述流操作数读取和增加指令。
5.根据权利要求1所述的数字数据处理器,其中,所述数据元素的序列包括指令指定数量的数据元素,每个数据元素具有指令指定数据元素大小。
6.根据权利要求5所述的数字数据处理器,其中,所述流首寄存器被分成所述数据元素大小的通道,并且其中,所述流引擎被配置为将所述数据流的相应数据元素存储在所述流首寄存器的每个通道中。
7.根据权利要求6所述的数字数据处理器,其中,当剩余的数据元素少于所述流首寄存器的通道时,则所述流引擎被配置为将全0值存储在所述流首寄存器的多余的通道中。
8.根据权利要求5所述的数字数据处理器,其中,所述数据流的所述数据元素各自具有相同的数据元素大小。
9.根据权利要求1所述的数字数据处理器,其中,所述数据流的所述数据元素各自具有指令指定的数据类型。
10.根据权利要求1所述的数字数据处理器,其包括连接到所述流引擎和所述内存的数据一致性单元,其中,所述数据一致性单元被配置为确保所述数据流在所述流引擎响应于所述流开始指令从所述内存调用所述数据流之前与对所述内存的所有写入一致。
11.根据权利要求10所述的数字数据处理器,其中,所述数据一致性单元不被配置为确保所述数据流在所述流引擎已经开始响应于所述流开始指令从所述内存调用所述数据流之后与对所述内存的所有写入一致。
12.根据权利要求11所述的数字数据处理器,其中:
所述流引擎还被配置为响应于流结束指令来停止所述数据流的调用;并且
所述指令内存中存储的所述指令包括控制所述至少一个功能单元的指令,以在流开始指令和对应的流结束指令之间的间隔期间,在包括所述数据流的所述数据元素的内存块内,避免对内存地址的内存写入。
13.根据权利要求1所述的数字数据处理器,还包括:
一级数据高速缓存,所述一级数据高速缓存连接到所述至少一个功能单元,所述一级数据高速缓存存储供所述至少一个功能单元操作的数据,其中,如果对应的数据存储在所述一级数据高速缓存中,则所述一级数据高速缓存被配置为服务于所述至少一个功能单元的内存读取和写入,否则将所述至少一个功能单元的内存读取和写入提交给相比所述一级数据高速缓存更高级别的内存;和
二级高速缓存,所述二级高速缓存连接到所述一级数据高速缓存和所述流引擎,所述二级高速缓存存储供所述至少一个功能单元操作的数据,其中,如果对应的数据存储在所述二级高速缓存中,则所述二级高速缓存被配置为服务于一级数据高速缓存对内存读取和写入以及所述流引擎内存读取的未命中,否则将所述数据流的所述至少一个功能单元的内存读取和写入以及所述流引擎读取提交给相比所述二级高速缓存更高级别的内存。
14.一种数字数据处理器,其包括:
存储多个指令的指令内存,每个所述指令指定数据处理操作和至少一个数据操作数;
连接到所述指令内存的指令解码器,所述指令解码器用于依序调用来自所述指令内存的所述指令并确定针对每个调用的指令的指定的所述数据处理操作和所述至少一个数据操作数;
连接到数据寄存器堆和所述指令解码器的至少一个功能单元,所述至少一个功能单元用于对与由所述指令解码器解码的指令对应的至少一个数据操作数执行数据处理操作,并致使所述数据处理操作的结果被存储在所述数据寄存器堆中;和
连接到所述指令解码器的流引擎,所述流引擎响应于流开始指令而从内存中调用第一数据流和第二数据流,其中,所述第一数据流包括第一数据元素的序列和第一多个嵌套循环,其中,所述第二数据流包括第二数据元素的第二序列和第二多个嵌套循环,并且其中,所述流引擎包括:
第一地址生成器,其生成与所述第一数据流的所述第一数据元素的序列相对应的第一流内存地址,其中,所述第一数据流的所述多个嵌套循环中的每一个具有线性寻址模式和循环寻址模式中的独立指定的一个;
第一流首寄存器,其存储所述第一数据流的数据元素,所述数据元素接下来将被所述至少一个功能单元使用;
第一流缓冲器,其接收和存储与所述第一流内存地址相对应的数据,所述第一流缓冲器包括多个第一高速缓存行,其中,所述第一高速缓存行中的每一个包括数据位;与所述数据位相对应的地址标记位;以及至少一个有效位,其指示所述数据位是否有效;
第二地址生成器,其生成与所述第二数据流的所述第二数据元素的序列相对应的第二流内存地址,其中,所述第二数据流的所述多个嵌套循环中的每一个具有线性寻址模式和循环寻址模式中的独立指定的一个;
第二流首寄存器,其存储所述第二数据流的数据元素,所述数据元素接下来将被所述至少一个功能单元使用;和
第二流缓冲器,其接收和存储与所述第二流内存地址相对应的数据,所述第二流缓冲器包括多个第二高速缓存行,其中,所述第二高速缓存行中的每一个包括数据位;与所述数据位相对应的地址标记位;以及至少一个有效位,其指示所述数据位是否有效;
其中,所述至少一个功能单元响应于第一流操作数指令以从所述第一流首寄存器接收至少一个操作数,并且响应于第二流操作数指令以从所述第二流首寄存器接收至少一个操作数。
15.根据权利要求14所述的数字数据处理器,其中:
所述第一数据元素的序列的所述第一数据流至少部分地由存储在第一流定义模板寄存器中的第一流定义模板来指定,其中,所述第一流定义模板包括多个寻址模式字段,每个寻址模式字段对应于所述第一多个嵌套循环中的相应一个,并且每个寻址模式字段指定所述线性寻址模式或所述循环寻址模式用于其相应的嵌套循环;并且
所述第二数据元素的序列的所述第二数据流至少部分地由存储在第二流定义模板寄存器中的第二流定义模板来指定,其中,所述第二流定义模板包括多个寻址模式字段,每个寻址模式字段对应于所述第二多个嵌套循环中的相应一个,并且每个寻址模式字段指定所述线性寻址模式或所述循环寻址模式用于其相应的嵌套循环。
16.根据权利要求15所述的数字数据处理器,其中:
所述第一流定义模板还包括循环维度字段,每个循环维度字段指定循环维度数据,并且其中,所述第一地址生成器被配置为使用所述第一流定义模板的所述循环维度数据来生成对应于所述第一多个嵌套循环的每个嵌套循环的所述第一数据流的所述第一数据元素的序列的所述第一流内存地址,其中指定所述循环寻址模式用于所述每个嵌套循环;并且
所述第二流定义模板还包括循环维度字段,每个循环维度字段指定循环维度数据,并且其中,所述第二地址生成器被配置为使用所述第二流定义模板的所述循环维度数据来生成对应于所述第二多个嵌套循环的每个嵌套循环的所述第二数据流的所述第二数据元素的序列的所述第二流内存地址,其中指定所述循环寻址模式用于所述每个嵌套循环。
17.根据权利要求14所述的数字数据处理器,其中:
所述第一流操作数指令属于流操作数只读指令和流操作数读取和增加指令中的一个;
当所述第一流操作数指令是所述流操作数读取和增加指令时,所述流引擎还被配置为响应于所述流操作数读取和增加指令而将所述第一数据流的下一个取回的数据元素存储在所述第一流首寄存器中,并且在提供存储在所述第一流缓冲器高速缓存行中的所有数据元素后释放所述第一流缓冲器高速缓存行的对应的第一高速缓存行;
所述第二流操作数指令属于所述流操作数只读指令和所述流操作数读取和增加指令中的一个;
当所述第二流操作数指令是所述流操作数读取和增加指令时,所述流引擎还被配置为响应于所述流操作数读取和增加指令而将所述第二数据流的下一个取回的数据元素存储在所述第二流首寄存器中,并且在提供存储在所述第二流缓冲器高速缓存行中的所有数据元素后释放所述第二流缓冲器高速缓存行的对应的第二高速缓存行。
18.根据权利要求14所述的数字数据处理器,还包括:连接到所述流引擎和所述内存的数据一致性单元,其中,所述数据一致性单元被配置为确保所述第一数据流和所述第二数据流在所述流引擎分别响应于所述第一流开始指令和所述第二流开始指令从所述内存调用所述第一数据流和所述第二数据流之前与对所述内存的所有写入一致。
19.根据权利要求18所述的数字数据处理器,其中,所述数据一致性单元不被配置为确保所述第一数据流和所述第二数据流在所述流引擎已经开始分别响应于所述第一流开始指令和所述第二流开始指令从所述内存调用所述第一数据流和所述第二数据流之后与对所述内存的所有写入一致。
20.根据权利要求14所述的数字数据处理器,还包括:
一级数据高速缓存,所述一级数据高速缓存连接到所述至少一个功能单元,所述一级数据高速缓存存储供所述至少一个功能单元操作的数据,其中,如果对应的数据存储在所述一级数据高速缓存中,则所述一级数据高速缓存被配置为服务于所述至少一个功能单元的内存读取和写入,否则将所述至少一个功能单元的内存读取和写入提交给相比所述一级数据高速缓存更高级别的内存;和
二级高速缓存,所述二级高速缓存连接到所述一级数据高速缓存和所述流引擎,所述二级高速缓存存储供所述至少一个功能单元操作的数据,其中,如果对应的数据存储在所述二级高速缓存中,则所述二级高速缓存被配置为服务于一级数据高速缓存对内存读取和写入以及所述流引擎内存读取的未命中,否则将所述第一数据流和所述第二数据流的所述至少一个功能单元的内存读取和写入以及所述流引擎读取提交给相比所述二级高速缓存更高级别的内存。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211511073.8A CN115904501A (zh) | 2016-12-20 | 2017-12-20 | 具有在每个维度上可选择的多维循环寻址的流引擎 |
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US15/384,451 | 2016-12-20 | ||
US15/384,451 US10318433B2 (en) | 2016-12-20 | 2016-12-20 | Streaming engine with multi dimensional circular addressing selectable at each dimension |
Related Child Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211511073.8A Division CN115904501A (zh) | 2016-12-20 | 2017-12-20 | 具有在每个维度上可选择的多维循环寻址的流引擎 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108205448A CN108205448A (zh) | 2018-06-26 |
CN108205448B true CN108205448B (zh) | 2022-12-20 |
Family
ID=62562532
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211511073.8A Pending CN115904501A (zh) | 2016-12-20 | 2017-12-20 | 具有在每个维度上可选择的多维循环寻址的流引擎 |
CN201711379621.5A Active CN108205448B (zh) | 2016-12-20 | 2017-12-20 | 具有在每个维度上可选择的多维循环寻址的流引擎 |
Family Applications Before (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211511073.8A Pending CN115904501A (zh) | 2016-12-20 | 2017-12-20 | 具有在每个维度上可选择的多维循环寻址的流引擎 |
Country Status (2)
Country | Link |
---|---|
US (4) | US10318433B2 (zh) |
CN (2) | CN115904501A (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10073696B2 (en) * | 2013-07-15 | 2018-09-11 | Texas Instruments Incorporated | Streaming engine with cache-like stream data storage and lifetime tracking |
US10339057B2 (en) * | 2016-12-20 | 2019-07-02 | Texas Instruments Incorporated | Streaming engine with flexible streaming engine template supporting differing number of nested loops with corresponding loop counts and loop offsets |
US10318433B2 (en) * | 2016-12-20 | 2019-06-11 | Texas Instruments Incorporated | Streaming engine with multi dimensional circular addressing selectable at each dimension |
US12086597B2 (en) * | 2021-06-28 | 2024-09-10 | Silicon Laboratories Inc. | Array processor using programmable per-dimension size values and programmable per-dimension stride values for memory configuration |
US12079630B2 (en) * | 2021-06-28 | 2024-09-03 | Silicon Laboratories Inc. | Array processor having an instruction sequencer including a program state controller and loop controllers |
US20220413850A1 (en) * | 2021-06-28 | 2022-12-29 | Silicon Laboratories Inc. | Apparatus for Processor with Macro-Instruction and Associated Methods |
US11616596B1 (en) * | 2021-09-24 | 2023-03-28 | Apple Inc. | Instruction-based multi-thread multi-mode PDSCH decoder for cellular data device |
US11775307B2 (en) * | 2021-09-24 | 2023-10-03 | Apple Inc. | Systems and methods for synchronizing data processing in a cellular modem |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1669289A (zh) * | 2002-09-06 | 2005-09-14 | 因芬奈昂技术股份有限公司 | 分析数据分组的分析器 |
CN102124443A (zh) * | 2008-08-15 | 2011-07-13 | 飞思卡尔半导体公司 | 在单指令多数据(simd)数据处理器中提供扩展寻址模式 |
CN104583981A (zh) * | 2012-08-17 | 2015-04-29 | 先进微装置公司 | 数据高速缓冲存储器预取提示 |
CN104951281A (zh) * | 2014-03-28 | 2015-09-30 | 英特尔公司 | 用于实现动态无序处理器流水线的方法和装置 |
Family Cites Families (32)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6986142B1 (en) * | 1989-05-04 | 2006-01-10 | Texas Instruments Incorporated | Microphone/speaker system with context switching in processor |
US5499360A (en) * | 1994-02-28 | 1996-03-12 | Panasonic Technolgies, Inc. | Method for proximity searching with range testing and range adjustment |
US6289434B1 (en) * | 1997-02-28 | 2001-09-11 | Cognigine Corporation | Apparatus and method of implementing systems on silicon using dynamic-adaptive run-time reconfigurable circuits for processing multiple, independent data and control streams of varying rates |
US6079008A (en) * | 1998-04-03 | 2000-06-20 | Patton Electronics Co. | Multiple thread multiple data predictive coded parallel processing system and method |
US7065633B1 (en) * | 1999-01-28 | 2006-06-20 | Ati International Srl | System for delivering exception raised in first architecture to operating system coded in second architecture in dual architecture CPU |
US6360348B1 (en) * | 1999-08-27 | 2002-03-19 | Motorola, Inc. | Method and apparatus for coding and decoding data |
US6829696B1 (en) * | 1999-12-30 | 2004-12-07 | Texas Instruments Incorporated | Data processing system with register store/load utilizing data packing/unpacking |
US6754809B1 (en) * | 1999-12-30 | 2004-06-22 | Texas Instruments Incorporated | Data processing apparatus with indirect register file access |
EP1122688A1 (en) * | 2000-02-04 | 2001-08-08 | Texas Instruments Incorporated | Data processing apparatus and method |
ATE529802T1 (de) * | 2000-02-09 | 2011-11-15 | Texas Instruments Inc | Datenverarbeitungsvorrichtung |
US6738967B1 (en) * | 2000-03-14 | 2004-05-18 | Microsoft Corporation | Compiling for multiple virtual machines targeting different processor architectures |
US6938249B2 (en) * | 2001-11-19 | 2005-08-30 | International Business Machines Corporation | Compiler apparatus and method for optimizing loops in a computer program |
US6832296B2 (en) * | 2002-04-09 | 2004-12-14 | Ip-First, Llc | Microprocessor with repeat prefetch instruction |
US7225301B2 (en) * | 2002-11-22 | 2007-05-29 | Quicksilver Technologies | External memory controller node |
US7017028B2 (en) * | 2003-03-14 | 2006-03-21 | International Business Machines Corporation | Apparatus and method for updating pointers for indirect and parallel register access |
JP2006004042A (ja) * | 2004-06-16 | 2006-01-05 | Renesas Technology Corp | データ処理装置 |
WO2006055862A2 (en) * | 2004-11-18 | 2006-05-26 | Mentor Graphics Corporation | Programmable memory built-in-self-test (mbist) method and apparatus |
US7549082B2 (en) * | 2005-04-28 | 2009-06-16 | Hewlett-Packard Development Company, L.P. | Method and system of bringing processors to the same computational point |
US7730350B2 (en) * | 2005-04-28 | 2010-06-01 | Hewlett-Packard Development Company, L.P. | Method and system of determining the execution point of programs executed in lock step |
US20070101100A1 (en) * | 2005-10-28 | 2007-05-03 | Freescale Semiconductor, Inc. | System and method for decoupled precomputation prefetching |
US7969769B2 (en) * | 2007-03-15 | 2011-06-28 | Ovonyx, Inc. | Multi-terminal chalcogenide logic circuits |
EP2169540A4 (en) * | 2007-06-20 | 2010-09-15 | Fujitsu Ltd | PROCESSING DEVICE |
US7890702B2 (en) * | 2007-11-26 | 2011-02-15 | Advanced Micro Devices, Inc. | Prefetch instruction extensions |
US8880493B2 (en) * | 2011-09-28 | 2014-11-04 | Hewlett-Packard Development Company, L.P. | Multi-streams analytics |
US9557999B2 (en) * | 2012-06-15 | 2017-01-31 | Apple Inc. | Loop buffer learning |
US10203958B2 (en) * | 2013-07-15 | 2019-02-12 | Texas Instruments Incorporated | Streaming engine with stream metadata saving for context switching |
US9606803B2 (en) * | 2013-07-15 | 2017-03-28 | Texas Instruments Incorporated | Highly integrated scalable, flexible DSP megamodule architecture |
US10073696B2 (en) * | 2013-07-15 | 2018-09-11 | Texas Instruments Incorporated | Streaming engine with cache-like stream data storage and lifetime tracking |
US10789405B2 (en) * | 2016-03-04 | 2020-09-29 | Montana Systems Inc. | Event-driven design simulation |
US10339057B2 (en) * | 2016-12-20 | 2019-07-02 | Texas Instruments Incorporated | Streaming engine with flexible streaming engine template supporting differing number of nested loops with corresponding loop counts and loop offsets |
US10318433B2 (en) * | 2016-12-20 | 2019-06-11 | Texas Instruments Incorporated | Streaming engine with multi dimensional circular addressing selectable at each dimension |
US10755014B2 (en) * | 2018-03-14 | 2020-08-25 | Montana Systems Inc. | Event-driven design simulation |
-
2016
- 2016-12-20 US US15/384,451 patent/US10318433B2/en active Active
-
2017
- 2017-12-20 CN CN202211511073.8A patent/CN115904501A/zh active Pending
- 2017-12-20 CN CN201711379621.5A patent/CN108205448B/zh active Active
-
2019
- 2019-06-11 US US16/437,900 patent/US10810131B2/en active Active
-
2020
- 2020-10-12 US US17/067,986 patent/US11709779B2/en active Active
-
2023
- 2023-07-24 US US18/357,732 patent/US20230359565A1/en active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1669289A (zh) * | 2002-09-06 | 2005-09-14 | 因芬奈昂技术股份有限公司 | 分析数据分组的分析器 |
CN102124443A (zh) * | 2008-08-15 | 2011-07-13 | 飞思卡尔半导体公司 | 在单指令多数据(simd)数据处理器中提供扩展寻址模式 |
CN104583981A (zh) * | 2012-08-17 | 2015-04-29 | 先进微装置公司 | 数据高速缓冲存储器预取提示 |
CN104951281A (zh) * | 2014-03-28 | 2015-09-30 | 英特尔公司 | 用于实现动态无序处理器流水线的方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN115904501A (zh) | 2023-04-04 |
US20180173532A1 (en) | 2018-06-21 |
US20230359565A1 (en) | 2023-11-09 |
US10810131B2 (en) | 2020-10-20 |
US20210026776A1 (en) | 2021-01-28 |
CN108205448A (zh) | 2018-06-26 |
US11709779B2 (en) | 2023-07-25 |
US20190361813A1 (en) | 2019-11-28 |
US10318433B2 (en) | 2019-06-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10901913B2 (en) | Two address translations from a single table look-aside buffer read | |
CN109643233B (zh) | 具有带读取和读取/前进操作数编码的流引擎的数据处理设备 | |
US20240231827A1 (en) | Exposing valid byte lanes as vector predicates to cpu | |
CN108205448B (zh) | 具有在每个维度上可选择的多维循环寻址的流引擎 | |
US12061908B2 (en) | Dual data streams sharing dual level two cache access ports to maximize bandwidth utilization | |
US11934833B2 (en) | Stream data unit with multiple head registers | |
US20230385063A1 (en) | Streaming engine with early exit from loop levels supporting early exit loops and irregular loops | |
US11921636B2 (en) | Streaming engine with flexible streaming engine template supporting differing number of nested loops with corresponding loop counts and loop offsets | |
CN108205447B (zh) | 使用早期和后期地址以及循环计数寄存器来跟踪架构状态的流引擎 | |
US10983912B2 (en) | Streaming engine with compressed encoding for loop circular buffer sizes |
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 |