一种用于处理集群的共享功能存储器电路转让专利

申请号 : CN201180055782.3

文献号 : CN103221936B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : J·L·奈D·H·巴特莱J·W·戈楼茨巴茨W·约翰森A·甲雅拉R·J·尼茨卡S·古普塔S·布施T·纳加塔H·谢赫M·琴纳坤达G·孙达拉拉彦

申请人 : 德克萨斯仪器股份有限公司

摘要 :

提供一种执行并行处理的装置。该装置具有消息总线(1420)、数据总线(1422)和共享功能存储器(1410)。共享功能存储器(1410)具有数据接口(7620,7606,7624-1到7624-R)、耦合至消息总线(1420)的消息接口(7626)、功能存储器(7602)、矢量存储器(7603)、单输入多数据(SIMD)数据通路(7605-1到7605-Q和7607-1到7607-P)、指令存储器(7616)、数据存储器(7618)和处理器(7614)。数据接口(7620,7606,7624-1到7624-R)耦合至数据总线(1422)。消息接口(7626)耦合至消息总线(1420)。功能存储器(7602)耦合至数据接口(7620,7606,7624-1到7624-R)并实现查找表(LUT)和直方图。矢量存储器(7603)耦合至数据接口(7620,7606,7624-1到7624-R)并支持使用矢量指令的操作。SIMD数据通路(7605-1到7605-Q和7607-1到7607-P)耦合至矢量存储器(7603)。此外,处理器(7614)耦合至数据存储器(7616)、指令存储器(7616)、功能存储器(7603)和矢量存储器(7603)。

权利要求 :

1.一种用于执行并行处理的装置,所述装置特征在于:消息入和消息出消息总线(1420);

数据总线(1422);

节点端口(7624-1);和

共享功能存储器(1410),其具有:

耦合至所述消息入和消息出消息总线(1420)的消息入和消息出接口;

耦合至所述数据总线(1422)的数据总线接口;

耦合至所述节点端口(7624-1)的节点接口(7606);

耦合至所述节点接口(7606)的功能存储器(7602),所述功能储存器(7602)实现查找表即LUT和直方图;

耦合至所述数据总线(1422)的全局数据输入输出缓冲器(7620);

耦合至所述全局数据输入输出缓冲器(7620)并且耦合至所述节点接口(7606)的矢量存储器(7603);

耦合至所述矢量存储器(7603)以及所述功能存储器(7602)的单指令多数据即SIMD数据通路,所述单指令多数据数据通路包括端口(7605-1至7605-Q)以及功能单元(7607-1至

7607-P);

指令存储器(7616);

耦合至所述消息入和消息出接口并且耦合至所述指令存储器(7616)的包装器(7626);

数据存储器(7618);

上下文保存和恢复电路(7610);和

耦合至所述数据存储器(7618)、所述指令存储器(7616)、所述上下文保存和恢复电路(7610)、所述功能存储器(7602)和所述矢量存储器(7603)的处理器(7614)。

2.根据权利要求1所述的装置,其中所述矢量存储器(7603)被布置成多组存储体(7802-1到7802-L)。

3.根据权利要求1或2所述的装置,其中所述多个功能单元(7607-1到7607-P)被布置成多组多个功能单元(7607-1到7607-P),以及其中所述SIMD数据通路(7605-1到7605-Q和

7607-1到7607-P)特征进一步在于多个寄存器(7804-1到7804-L),其中每个寄存器(7804-1到7804-L)与多组功能单元(7607-1到7607-P)中的至少一组功能单元相关联。

4.根据权利要求1、2或3所述的装置,其中所述处理器(7614)被配置成执行运动估计,再采样,和离散余弦变换,以及图像处理的失真校正。

5.一种用于执行并行处理的系统,其特征在于:系统存储器(1416);

耦合至所述系统存储器的主机处理器;和

耦合至所述系统存储器(1416)的处理集群(1400),所述处理集群包括:消息入和消息出消息总线(1420);

数据总线(1422);

布置在分区(1402-1到1402-R)中的处理节点(808-1到808-N),其中每个分区具有耦合至所述数据总线(1422)的总线接口单元(4710-1到4710-R),并且每个处理节点(808-1到

808-N)耦合至所述消息入和消息出消息总线(1420);

耦合至所述消息入和消息出消息总线(1420)的控制节点(1406);和共享功能存储器(1410),其具有:

耦合至所述消息入和消息出消息总线(1420)的消息入和消息出接口;

耦合至所述数据总线(1422)的数据总线接口;

耦合至所述节点端口(7624-1)以及总线接口单元(4710-1至4710-R)的节点接口(7606);

耦合至所述节点接口(7606)的功能存储器(7602),所述功能储存器(7602)实现查找表即LUT和直方图;

耦合至所述数据总线(1422)的全局数据输入输出缓冲器(7620);

耦合至所述全局数据输入输出缓冲器(7620)并且耦合至所述节点接口(7606)的矢量存储器(7603);

耦合至所述矢量存储器(7603)以及所述功能存储器(7602)的单指令多数据即SIMD数据通路,所述单指令多数据数据通路包括端口(7605-1至7605-Q)以及功能单元(7607-1至

7607-P);

指令存储器(7616);

耦合至所述消息入和消息出接口并且耦合至所述指令存储器(7616)的包装器(7626);

数据存储器(7618);

上下文保存和恢复电路(7610);和

耦合至所述数据存储器(7618)、所述指令存储器(7616)、所述上下文保存和恢复电路(7610)、所述功能存储器(7602)和所述矢量存储器(7603)的处理器(7614)。

6.根据权利要求5所述的系统,其中所述矢量存储器(7603)被布置成多组存储体(7802-1到7802-L)。

7.根据权利要求5或6所述的系统,其中所述多个功能单元(7607-1到7607-P)被布置成多组多个功能单元(7607-1到7607-P)中,以及其中所述SIMD数据通路(7605-1到7605-Q和

7607-1到7607-P)特征进一步在于多个寄存器(7804-1到7804-L),其中每个寄存器(7804-1到7804-L)与多组功能单元(7607-1到7607-P)中的至少一组功能单元相关联。

8.根据权利要求5、6或7所述的系统,其中所述处理器(7614)被配置为执行运动估计,再采样,和离散余弦变换,以及图像处理的失真校正。

说明书 :

一种用于处理集群的共享功能存储器电路

技术领域

[0001] 本公开涉及处理器,更具体地涉及处理集群(processing cluster)。

背景技术

[0002] 图1示出描述多核系统(在2个到16个核的范围)的执行速率的加速比与并行开销的图,其中加速比是单处理器执行时间除以并行处理器执行时间。如图所示,并行开销必须接近零才能从大量核中获得显著的益处。但是,由于如果并行程序之间有任何交互则开销倾向于非常高,所以除了完全解耦程序之外,通常很难有效使用多于一个或两个处理器。因此,需要一种改进的处理集群。

发明内容

[0003] 因此,本发明的实施例提供用于执行并行处理的装置。该装置具有消息总线(1420);数据总线(1422);和共享功能存储器(1410),其中共享功能存储器具有:耦合至数据总线(1422)的数据接口(7620,7606,7624-1到7624-R);耦合至消息总线(1420)的消息接口(7626);耦合至数据接口(7620,7606,7624-1到7624-R)的功能存储器(7602),其中功能存储器(7602)实施查找表(LUT)和直方图;耦合至数据接口(7620,7606,7624-1到7624-R)的矢量存储器(7603),其中矢量存储器(7603)支持使用矢量指令的操作;耦合至矢量存储器(7603)的单指令多数据(SIMD)数据通路(7605-1到7605-Q和7607-1到7607-P);指令存储器(7616);数据存储器(7618);和耦合至数据存储器(7618)、指令存储器(7616)、上下文保存和恢复电路(7610)、功能存储器(7602)、矢量存储器(7603)的处理器(7614)。

附图说明

[0004] 图1是多核加速比参数的图;
[0005] 图2是根据本公开实施例的系统的图;
[0006] 图3是根据本公开实施例的SOC的图;
[0007] 图4是根据本公开实施例的并行处理集群的图;
[0008] 图5是共享功能存储器的方框图;
[0009] 图6是共享功能存储器的SIMD数据通路的图;
[0010] 图7是一个SIMD数据通路的一部分的图;
[0011] 图8是地址信息的示例;
[0012] 图9和图10是对于明确位于源程序中的矢量和数组执行的寻址的示例;
[0013] 图11是程序参数的示例;
[0014] 图12是水平分组如何存储在功能存储器上下文(context)中的示例;和
[0015] 图13是SFM数据存储器的结构的示例。

具体实施方式

[0016] 在图2中可以看到执行并行处理的SOC(片上系统)的应用示例。在这个示例中,示出了成像设备1250,该成像设备1250(其可以是例如手机或照相机)一般包含图像传感器1252、SOC 1300、动态随机存取存储器(DRAM)1254、闪存1256、显示器1526和电源管理集成电路(PMIC)1260。在操作中,图像传感器1252能够捕获图像信息(可以是静态图像或视频),图像信息可以由SOC 1300和DRAM 1254处理,并且存储在非易失性存储器中(即闪存1256)。
此外,存储在闪存1256中的图像信息可以通过利用SOC 1300和DRAM 1254经过显示器1258显示给用户。而且,成像设备1250有时是便携式的,其包括作为电源的蓄电池;PMIC 1260(可以受SOC 1300控制)可以有助于调节功率使用,从而延长电池寿命。
[0017] 在图3中,描述了根据本发明实施例的片上系统或SOC 1300的示例。该SOC 1300(通常是集成电路或IC,诸如OMAPTM)一般包含处理集群1400(其一般执行上述的并行处理)和提供宿主环境(以上述描和参考的)的主机处理器1316。主机处理器1316可以是宽(即32位、64位等等)RISC处理器(诸如ARM Cortex-A9),并且主机处理器1316可以经过主机处理器总线或HP总线1328与总线仲裁器1310、缓冲器1306、总线桥1320(其允许主机处理器1316通过接口总线或Ibus 1330访问外围接口1324)、硬件应用编程接口(API)1308和中断控制器1322通信。处理集群1400一般通过处理集群总线或PC总线1326与功能电路1302(其可以是例如电荷耦合设备或CCD接口,并且可以与芯片外设备通信)、缓冲器1306、总线仲裁器1310和外围接口1324通信。利用该配置,主机处理器1316能够通过API 1308提供信息(即将处理集群1400配置为符合期望的并行实现方式),同时处理集群1400和主机处理器1316可以直接访问/存取闪存1256(通过闪存接口1312)和DRAM 1254(通过存储控制器1304)。另外,通过联合测试行动小组(JTAG)接口1318可以执行测试和边界扫描。
[0018] 转向图4,描述了根据本发明实施例的并行处理集群1400的示例。通常,处理集群1400对应于硬件722。处理集群1400一般包含分区1402-1到1402-R,其中分区1402-1到
1402-R包括节点808-1到节点808-N、节点包装器(wrapper)810-1到810-N、指令存储器(IMEM)1404-1到1404-R和总线接口单元(BIU)4710-1到4710-R。节点808-1到808-N(通过其各自的BIU 4710-1到4710-R和数据总线1422)都耦合至数据互连814,并且从控制节点1406通过消息总线1420提供分区1402-1到1402-R的控制或消息。全局加载/存储(GLS)单元1408和共享功能存储器1410还提供额外的数据移动功能(在以下描述)。此外,三级或L3高速缓冲存储器1412、外围设备1414(一般不包括在IC内)、存储器1416(通常是闪存1256和/或DRAM 1254,以及不包括在SOC 1300内的其他存储器)和硬件加速器(HWA)单元1418与处理集群1400一起使用。还提供接口1405,以便于将数据和地址传递到控制节点1406。
[0019] 处理集群1400一般使用数据传输的“推”模型(push model)。传输一般表现为缓冲写入,而不是请求响应类型的访问/存取。与请求响应访问/存取相比,这有利于将对全局互连(即数据互连814)的占用减少到一半,因为数据传输是单向的。一般不期望通过互连814路由请求,其后将响应路由到请求者,这导致在互连814上的两个转变。推模型生成单传输。这对于可扩展性是非常重要的,因为网络延迟随着网络大小增加而增加,并且其恒定降低请求响应事务的性能。
[0020] 该推模型和数据流协议(即812-1到812-N)一般将全局数据流量最小化为用于正确性的数据流量,同时还整体最小化全局数据流对局部节点使用的影响。即使在大量的全局流量的情况下,一般对节点(即808-i)性能影响很小或没有影响。源向全局输出缓冲器写入数据(以下讨论的)并且继续进行而不需要传输成功的确认。数据流协议(即812-1到812-N)一般确保在第一次尝试将数据移动到目的地时传输成功,并且通过互连814进行单个传输。全局输出缓冲器(其在下面讨论)可以支持多达16个输出(例如),使得节点(即808-i)不太可能因为没有足够的瞬时全局带宽用于输出而停止工作。而且,瞬时带宽不受请求响应事务或不成功传输的重放的影响。
[0021] 最后,推模型更接近匹配编程模型,即程序不“获取(fetch)”其自己的数据。相反,在调用程序之前写入程序的输入变量和/或参数。在编程环境中,输入变量的初始化表现为通过源程序写入内存。在处理集群1400中,这些写入被转换成在节点上下文中填入变量值的缓冲写入。
[0022] 全局输入缓冲器(其在下面讨论)用于接收来自源节点的数据。由于每个节点808-1到808-N的数据存储器(DMEM)是单端口的,所以输入数据的写入可能与局部单指令多数据(SIMD)的读取相冲突。通过将输入数据接收到全局输入缓冲器来避免争用,其中其可以等待开放数据存储器周期(也就是,与SIMD访问没有存储体冲突)。数据存储器可以具有32个存储体(例如),所以迅速释放该缓冲器是非常可能的。然而,节点(即808-i)应具有自由缓冲器输入,因为没有用于确认该传输的握手。如果需要的话,全局输入缓冲器可以使局部节点(即808-i)停止工作,并强制向数据存储器写入,从而释放缓冲器存储单元,但是该事件应该极其罕见。通常,全局输入缓冲器实施为两个单独的随机存取存储器(RAM),以便一个随机存取存储器可以处于写入全局数据的状态,而另一个随机存取存储器处于被读取到数据存储器中的状态。消息接发互连与全局数据互连分开,但是也使用推模型。
[0023] 在系统级,节点808-1到808-N在处理集群1400中是复制的,类似于SMP或对称多处理,其中节点数目被缩放到期望的吞吐量。处理集群1400可以调节到大量的节点。节点808-1到808-N被分组成分区1402-1到1402-R,其中每个分区具有一个或多个节点。通过增加节点之间的局部通信,和通过允许更大的程序计算更大量的输出数据,分区1402-1到1402-R有助于可扩展性,使得更可能满足期望的吞吐量需求。在分区内(即1402-i),节点利用局部互连进行通信,并且不需要全局资源。分区(即1404-i)内的节点还可以以任何粒度共享指令存储器(IMEM)(即1404-i):从每个节点使用独占指令存储器到所有节点使用公共指令存储器。例如,三个节点可以共享指令存储器的三个存储体,并且第四个节点具有指令存储器的独占存储体。当节点共享指令存储器(即1404-i)时,节点一般同时执行相同的程序。
[0024] 处理集群1400还可以支持大量的节点(即808-i)和分区(即1402-i)。然而,每个分区的节点数通常限制为4个,因为每个分区具有多于4个节点一般类似于非一致存储器访问(NUMA)架构。在这种情况下,分区通过一个(或多个)具有大体恒定横截面带宽的纵横制连接器(其在下面关于互连814描述)连接在一起。处理集群1400目前被构造成每个周期传输一个节点的数据宽度(例如,64个16位像素),其被分割成在4个周期上每个周期16像素的4次传输。处理集群1400一般能够容忍延迟,节点缓冲一般防止节点停止工作,即使当互连814几乎饱和时(注意到,除了通过合成程序之外很难达到该条件)。
[0025] 通常,处理集群1400包括在分区之间共享的全局资源:
[0026] (1)控制节点1406,其实现全系统消息互连(通过消息总线1420),事件处理和调度,以及主机处理器与调试器的接口(所有都将在下面详细描述)。
[0027] (2)GLS单元1408,其含有可编程RISC处理器,能够使得系统数据移动可以通过C++程序描述,其可以被直接编译成GLS数据移动线程。这能够使系统代码在交叉宿主的环境中执行,而不会修改源代码,并且比直接存储器访问更普遍,因为系统代码可以从系统或SIMD数据存储器(其在下面描述)中的任何地址集(变量)移动到任何其他地址集(变量)。这是多线程的,在(例如)0周期上下文切换情况下,支持多达例如16个线程。
[0028] (3)共享功能存储器1401,是提供通用查找表(LUT)和统计信息收集工具(直方图)的大型共享储存器。其还可以支持节点SIMD(因为成本原因)不太支持的利用大型共享存储器的像素处理,例如再采样和失真校正。该处理使用(例如)6发射(issue)RISC处理器(即SFM处理器7614,其下面详细描述),实现标量、矢量和二维数组作为本机类型。
[0029] (4)硬件加速器1418,其被包含用于不需要可编程性的功能,或优化功率和/或面积。加速器表现为子系统,作为系统中的其他节点,参与控制和数据流,可以产生事件并被调用,并且对于调试器可见。(在适用时,硬件加速器可以具有专用LUT和统计信息聚集)[0030] (5)数据互连814以及系统开放核心协议(OCP)L3连接1412。它们管理在节点分区、硬件加速器、系统存储器和外围设备之间在数据总线1422上的数据移动。(硬件加速器还可以具有到L3的私有连接)
[0031] (6)调试接口。它们未在图表上示出,但在该文件中进行描述。
[0032] 转向图5,可以看到共享功能存储器1410。共享功能存储器1401一般是支持节点(即因为成本原因)不太支持的操作的大型集中存储器。共享功能存储器1410的主要部件是两大存储器:功能存储器(FMEM)7602和矢量存储器(VMEM)7603(每个存储器具有在例如48k字节到1024k字节的可配置大小和结构)。该功能存储器7602实现高带宽的、基于矢量的查找表(LUT)和直方图的同步指令驱动实现。矢量存储器7603可以支持采用矢量指令的(例如)6发射处理器(即SFM处理器7614)的操作,其可以例如用于基于块的像素处理。通常,该SFM处理器7614可以利用消息接口1420和数据总线1422访问。SFM处理器7614可以例如对宽像素(64个像素)上下文操作,其中宽像素上下文可以具有比节点中的SIMD数据存储器更通用的结构和总存储器大小,并且有更通用的处理应用于数据。其支持标准C++整数数据类型的标量、矢量和数组操作,以及与各种数据类型兼容的封装像素的操作。例如,如图所示,与矢量存储器7603和功能存储器7602相关联的SIMD数据通路一般包括端口7605-1到7605-Q和功能单元7607-1到7607-P。
[0033] 在所有处理节点(即808-i)可以访问功能存储器7602和矢量存储器7603的意义上,功能存储器7602和矢量存储器7603一般是“共享”的。提供到功能存储器7602的数据可以经由SFM包装器(通常以只写方式)访问。该共享一般还与处理节点(即808-i)的上下文管理相一致。处理节点和共享功能存储器1410之间的数据I/O还使用数据流协议,并且处理节点一般不能直接访问矢量存储器7603。共享功能存储器1410还可以向功能存储器7602写入,但是不是在其正被处理节点访问时。处理节点(即808-i)可以读取和写入功能存储器7602中的公共位置,但是(通常)或者作为只读LUT操作或这作为只写直方图操作。对于处理节点来说对功能存储器7602区域进行读写访问也是可能的,但是对于特定程序的访问来说这应当是独占的。
[0034] 在图5中,在共享功能存储器1410的示例中,有用于节点访问的端口7624-1到7624-R(实际数量是可配置的,但是通常每个分区有一个端口)。端口7624-1到7624-R一般被组织为支持并行访问,所以来自任何给定节点的节点SIMD中的所有数据通路可以执行同步LUT或直方图访问。
[0035] 在这个示例中,功能存储器7602结构具有16个存储体,其中每个存储体含有16个16位像素。可以假设,存在在存储体7608-1处开始排列的256个条目的查找表或LUT。节点呈现像素值的输入矢量(整个节点4个周期,每个周期16个像素),并且在一个周期中利用矢量元素访问LUT,从而访问查找表。由于该查找表体现在每个存储体(即7608-1到7608-J)的单个线上,所以所有节点可以执行同步访问,因为任何矢量元素都不会产生存储体冲突。通过将查找表值复制到结果矢量的元素中产生结果矢量。对于结果矢量中的每个元素,结果值由通过输入矢量的相对应元素值选择的LUT条目确定。如果,在任何给定的存储体(即7608-
1到7608-J)中,来自两个节点的输入矢量对同一存储体创建不同的LUT索引,那么存储体访问以支持最近期的输入的方式区分优先次序,或者如果所有输入同时发生,那么存储体访问以支持最左边的端口输入的方式区分优先次序。不希望经常发生存储体冲突,或不希望存储体冲突对吞吐量有太多影响(如果有的话)。这是出于以下几点原因:
[0036] -与可以同时在相同查找表中访问的条目总数(即256)相比较,许多查找表较小。
[0037] -输入矢量通常来自像素的相对小的局部水平区域(例如),并且一般不希望值具有更多变化(不应当引起LUT索引中的更多变化)。例如,如果图像帧是5400像素宽,那么每周期16像素的输入矢量表示小于总扫描线的0.3%。
[0038] -最后,访问LUT的处理器指令与使用LUT操作结果的指令分离。处理器编译器试图尽可能地根据初始访问调度使用。如果LUT访问和使用之间有充足的分离,那么即使当LUT存储体冲突占用一些额外的周期时也不会出现停止。
[0039] 在分区内,一个节点(即节点808-i)通常在任何给定时间访问功能存储器7602,但是这不应该对性能产生显著影响。执行相同程序的节点(即节点808-i)在程序的不同位置,并且及时分配对给定LUT的访问。即使对于执行不同程序的节点,LUT访问频率也很低,并且同时同步访问不同LUT的可能性非常低。如果发生同时访问不同LUT,那么一般将影响最小化,因为编译器尽可能地根据结果的使用调度LUT访问。
[0040] 假设没有存储体冲突(不过这应该很少出现),在不同分区中的节点可以同时访问功能存储器7602。如果,在任何给定的存储体处,来自两个分区的输入矢量对同一存储体创建不同的LUT索引,那么存储体访问以支持最近期的输入的方式区分优先次序,或者如果所有输入同时发生,那么存储体访问以支持最左边的端口输入的方式区分优先次序(例如,端口0比端口1优先)。
[0041] 除了直方图访问中结果不会返回到节点之外,直方图访问与LUT访问相似。作为替代,来自节点的输入矢量用于访问直方图条目,通过算术运算更新这些条目,并且结果返回到直方图条目中。如果输入矢量的多个元素选择相同的直方图条目,那么相应地更新该条目:例如,如果三个输入元素选择给定的直方图条目,并且算术运算是简单的递增,那么直方图条目可以以3递增。直方图更新一般可以采用三种形式中的一种:
[0042] -条目可以以直方图指令中的常量递增。
[0043] -条目可以以处理器内的寄存器的变量值递增。
[0044] -条目可以以与输入矢量一起发送的单独加权向量递增。例如,这可以依据输入矢量中像素的相对位置来加权直方图更新。
[0045] 每个描述符可以指定(存储体排列的)相关联的查找表的基址、用于形成索引的输入数据的大小和用于相对于基址形成对查找表的索引的两个16位(例如)掩码。掩码一般确定(例如)哪个(哪些)像素的位(任何连续位)可以被选择用于形成索引并且因此间接地表示查找表大小。当节点执行LUT或直方图指令时,通常使用4位字段选择描述符。指令确定对查找表的操作,所以LUT和直方图可以是任何组合。例如,节点(即808-i)可以通过在直方图中执行查找表操作访问直方图条目。表描述符可以初始化为SFM数据存储器7618初始状态的一部分。然而,这些值还可以被复制到硬件描述符中,以便(如果需要的话)LUT和直方图操作可以并行访问该描述符,而不需要访问SFM数据存储器7618。
[0046] 返回图5,SFM处理器7616一般对功能存储器7602的大片区域内的(例如)相对宽的像素上下文提供通用编程访问。这可以包括:(1)对通用矢量和数组的操作;(2)对(例如)水平像素组的操作,其与线数据类型兼容;和(3)对块数据类型中的(例如)像素的操作,其可以支持二维数据访问,例如视频宏模块或帧的矩形区域。因此,处理集群1400可以同时支持基于扫描线的像素处理和基于块的像素处理。功能存储器7602的大小也是可配置的(即,从48k字节到1024k字节)。通常,该存储器7602的较小部分用于LUT和直方图使用,所以剩余存储器可以用于对存储体7608-1到7608-J的通用矢量操作,包括例如相关像素的矢量。
[0047] 如图所示,SFM处理器7614使用用于32位(例如)标量处理的RISC处理器(即,在这种情况下,2发射),并且扩展指令集架构以支持(例如)16位、32位数据通路的矢量和数组处理,其可以对封装的16位数据以高达两倍工作吞吐量操作并且对封装的8位数据以高达四倍工作吞吐量操作。SFM处理器7614允许任何C++程序的编译,同时有能力执行(例如)对与像素数据类型(Line,Pair和uPair)兼容的宽像素上下文的操作。SFM处理器7614还可以提供在(例如)像素位置之间更普遍的数据移动,而不是有限的侧上下文(side-context)访问和由处理器提供的封装(pack),包括水平方向和垂直方向。与节点处理器相比较,该普遍性是可能的,因为SFM处理器7614使用功能存储器7302的二维存取能力,并且因为其可以支持每个周期的一个加载和一个存储而不是四个加载和两个存储。
[0048] SFM处理器7614可以执行诸如运动估计、再采样和离散余弦变换的操作以及诸如失真校正的更通用的操作。指令包可以是120位宽,在单个周期内提供高达两个标量和四个矢量操作的并行发射(parallelissue)。在具有较少指令并行性的代码区域,标量指令和矢量指令可以通过小于六位宽的任意组合执行,包括每周期一个指令的串行发射。利用指令位检测并行性,从而利用前述指令指示并行发射,并且指令按次序发射。SIMD数据通路存在两种形式的加载和存储指令,其取决于所生成的功能存储器地址是线性的还是二维的。功能存储器7602的第一类型的访问在标量数据通路中执行,其第二类型的访问在矢量数据通路中执行。在后一种情况中,地址可以是完全独立的,基于(例如)每个数据通路的一半的16位寄存器值(例如,从独立地址存取高达32个像素)。
[0049] SFM处理器7614的节点包装器7626和控制结构与节点处理器的节点包装器和控制结构相似,并且共享许多公共部件,除了一些例外。SFM处理器7614可以支持(例如)水平方向的非常普遍的像素访问,并且节点(即808-i)使用的侧上下文管理技术一般不太可能。例如,所使用的偏移量可以基于程序变量(在节点处理器中,像素偏移量通常是立即指令),所以编译器706一般不能检测和插入任务边界,以满足侧上下文相关性。对于节点处理器,编译器706应该已知这些边界的位置,并且可以确保不希望寄存器值在这些边界的对面。对于SFM处理器7614,在标量单元和SIMD矢量单元两者中,硬件确定应该何时执行任务切换,并且提供硬件支持以保存和恢复所有寄存器。通常,用于进行保存和恢复的硬件是上下文保存恢复电路7610和上下文状态电路7612(其可以是例如16×256位的)。该电路7610(例如)包含标量上下文保存电路(例如,其可以是16×16×32位)和32矢量上下文保存电路(例如,其可以是16×512位),其可以用于保存和恢复SIMD寄存器。一般地,矢量存储器7603不支持侧上下文RAM,因为像素偏移量(例如)可以是变量,所以矢量存储器一般不允许节点处理器中使用的相同相关性机制。相反,帧区域内的像素(例如)都在同一个上下文内,而不是分布在复数个上下文之间。这提供与节点上下文相似的功能,除了不应该在多个并行节点之间水平共享上下文之外。共享功能存储器1410一般还包含SFM数据存储器7618、SMF指令存储器7616和全局IO缓冲器7620。此外,共享功能存储器1410还包括接口7606,该接口可以执行优先化、存储体选择、索引选择和结果汇编并且通过分区BIU(即4710-i)耦合至节点端口(即7624-1到7624-4)。
[0050] 转向图6,示出共享功能存储器1410的SIMD数据通路7800的示例。例如,可以使用八个SIMD数据通路(其可以划分成16位的两个半部分,因为其可以对16位封装数据进行操作)。如图所示,这些SIMD数据通路一般包含存储体组7802-1到7802-L、关联的寄存器7804-1到7804-L和关联的功能单元组7806-1到7806-L。
[0051] 在图7中,可以看到一个SIMD数据通路的一部分的示例(也就是,例如,寄存器7804-1到7804-L中一个寄存器的一部分和功能单元7806-1到7806-L中一个功能单元的一部分)。如图所示,例如,该SIMD数据通路可以包括16条目、32位寄存器文件7902、两个16位的乘法器7904和7906以及还可以在一个周期内执行两个16位封装操作的单个32位算术/逻辑单元7908。而且,举例来说,每个SIMD数据通路可以执行两个独立的16位操作,或组合的
32位操作。例如,这可以通过利用与32位加法操作结合起来的16位乘法器来形成32位乘法。
此外,算术/逻辑单元7908能够执行加法、减法、逻辑操作(即,AND(与))、比较和条件移动。
[0052] 返回图6,SIMD数据通路寄存器7804-1到7804-L可以使用矢量存储器7603的加载/存储接口。这些加载和存储可以使用矢量存储器7603的特征,其被提供用于节点(即808-i)的并行LUT和直方图访问:对于节点,每个SIMD数据通路的一半可以提供对功能存储器7602的索引;相似地,SFM处理器7614中的每个SIMD数据通路的一半可以提供独立的矢量存储器7603地址。寻址一般被组织为使得邻近的数据通路可以对多个数据类型实例执行相同操作,数据类型诸如8位、16位或32位(例如)数据的标量、矢量和数组:这些被称为隐含矢量(vector-implied)寻址模式(矢量由SIMD通过线性矢量存储器7603寻址隐含)。可替换地,每个数据通路可以对来自存储体7608-1到7608-J内的帧区域的封装像素进行操作:这些被称为封装矢量寻址方式(封装像素的矢量由SIMD通过两个二维矢量存储器7603寻址隐含)。
在两种情况中,与节点处理器器一样,编程模型可以隐藏SIMD的宽度,并且程序被写入就好像他们对单个像素或其他数据类型的元素进行操作。
[0053] 隐含矢量的数据类型一般是8位字符、16位半字或32位整数的SIMD实现的矢量,其通过每个SIMD数据路径(即图7)单独地操作。这些矢量在程序中一般不是显式的,而是由硬件操作隐含。这些数据类型还可以构成显式程序矢量或数组内的元素:SIMD有效地将隐藏的第二或第三维数加入这些程序矢量或数组。实际上,编程视图(programming view)可以是具有专用32位数据存储器的单SIMD数据通路,并且该存储器可以利用常规的寻址模式访问。在硬件中,以每个32SIMD数据通路具有私有数据存储器的表现的方式映射该视图,但是该实现方式利用矢量存储器7603的宽的堆积结构在共享功能存储器1410中实现该功能。
[0054] SFM处理器7614的SIMD一般在与节点处理器上下文相似的矢量存储器7603内工作,其中描述符具有与存储体组7802-1对准的基址,并且充分大以至于能寻址整个矢量存储器7603(即对于1024k字节的大小,为13位)。SIMD数据通路的每二分之一用6位标识符(POSN)进行编号,最左边的数据通路以0开始。对于隐含矢量寻址,该值的LSB(最低有效位)一般被省略,并且其余的五位用于使数据通路产生的矢量存储器7603地址与矢量存储器7603中的相应字对准。
[0055] 在图8中,可以看到地址形成的示例。通常,由SIMD结果执行的加载或存储指令导致每个数据通路基于数据通路中的寄存器和/或立即指令值生成地址:这是在编程视图中访问单个私有数据存储器的地址。由于这可以是例如32位访问,所以该地址的两个LSB对于矢量存储器7603访问可以被省略,并且可以用于寻址字节或字内的半字。地址被增加到上下文基址,导致隐含矢量的上下文索引。每个数据通路连接该索引和POSN值的位(即,位5:1)(因为这是用于字访问),结果值是数据通路上下文内的矢量存储器7603的索引。地址被增加到上下文基址,导致矢量存储器7603寻址隐含矢量。
[0056] 这些地址访问与来自每组7802-1到7802-L的存储体(即,十六个存储体中的四个存储体)对准的值,并且该访问可以发生在单个周期中。不会发生存储体冲突,因为所有地址基于相同的标量寄存器值和/或立即值,它们在LSB中的POSN值不同。
[0057] 图9和图10示出如何对在源程序中显式的矢量和数组执行寻址的示例。程序利用常规的基址加偏移量加法计算32位数据通路(数据通路的两个16位的一半的POSN值为0和1)的期望元素的地址。其他数据通路执行相同的计算,并计算地址的相同值,但是每个数据通路的最终地址被偏移数据通路的相对位置。这导致访问四个矢量存储器存储体(即,
7608-1,7608-5,7608-9和7608-12),其中(例如)四个矢量存储器存储体访问32个邻近的32位值,从而示出寻址模式一般如何有效地使用矢量存储器7603结构。因为每个数据通路寻址一组私有的功能存储器7602条目,所以在局部数据通路内检查存储-加载相关性,当存在相关性时应用转发。一般不期望检查数据通路之间的相关性,因为这将是非常复杂的。这些相关性应通过编译器706在可以执行相关加载之前存储之后调度延迟时隙而避免(周期数可能是3-4个周期)。
[0058] 封装矢量寻址模式一般允许SFM处理器7616的SIMD数据通路对与节点(808-i)中的(例如)封装像素兼容的数据类型进行操作。与在节点数据存储器中的结构相比,这些数据类型的结构在功能存储器7602中明显不同。代替存储多个上下文之间的水平分组,这些分组可以存储在单个上下文中。SFM处理器7614可以利用矢量存储器7603结构基于变量偏移量将来自任何水平位置或垂直位置的像素封装(例如)到数据通路寄存器中,以便于进行诸如失真校正的操作。相比之下,节点(即,808-i)利用较小的恒定偏移量以水平方向存取像素,这些像素都在相同的扫描线中。共享功能存储器1410的寻址模式可以支持每周期一个加载和一个存储,并且性能依据由随机存取产生的矢量存储器存储体(即7608-1)冲突是可变的。
[0059] 封装矢量寻址模式一般采用类似于二位数组寻址的寻址,其中第一维对应于帧内的垂直方向,第二维对应于帧内的水平方向。为了访问(例如)在给定的垂直索引和水平索引处的像素,垂直索引与水平分组的宽度相乘(在线(Line)的情况下),或与块的宽度相乘。这导致对定位在垂直偏移量的第一像素的索引:增加到水平索引,从而获得给定数据结构内的存取像素的矢量存储器7603地址。
[0060] 垂直索引计算基于编程参数,在图11中示出该示例。参数同时控制线数据类型和块数据类型的垂直地址。该示例的字段一般被定义如下(环形缓冲器一般含有线数据):
[0061] -顶部标志(TF):这表明环形缓冲器接近帧的顶部边缘。
[0062] -底部标志(BF):这表明环形缓冲器接近帧的底部边缘。
[0063] -模式(Md):该双比特字段编码与访问相关的信息。值00’b表示访问是针对块。值01-11’b编码用于环形缓冲器的边界处理类型:01’b是跨边界反射,10’b是重复跨边界的边界像素,11’b是返回饱和值7FFF’h(像素是16位的值)。
[0064] -存储禁用(SD):其利用指针抑制写入,以考虑一系列相关缓冲器中出现启动延迟。
[0065] -顶部/底部偏移量(TPOffset):该字段表明,对于环形缓冲器的相对位置0,就扫描线数量而言,位置在帧的顶部以下多远或在帧的底部以上多远。这相对于从位置0的负(顶部)或正(底部)偏移量定位帧的边界。
[0066] -指针(Pointer):这是在垂直方向上的相对偏移量0处的扫描线的指针。其可以在缓冲器的地址范围内的任何绝对位置。
[0067] -缓冲器大小(Buffer_Size):这是许多扫描线中环形缓冲器的总垂直大小。其控制缓冲器内的模数寻址。
[0068] -水平分组大小/块宽度(HG_Size/Block_Width):这是水平分组(HG_Size)或块(Block_Width)在32个像素的单元中的宽度。其是用于形成封装矢量地址的第一维度的大小。
[0069] 对该参数进行编码,以便对于块,除了Block_Width之外的所有字段都是零,并且代码生成可以基于Block声明的维度将值视为字符型。其他字段一般用于环形缓冲器,并且由编程人员和代码生成两者设置。
[0070] 转向图12,可以看到水平分组如何存储在功能存储器上下文中的示例。该水平分组的结构模拟跨节点(即808-i)分配的水平分组,除了这些水平分组(如图所示和例如)存储在单个功能存储器上下文中而不是多节点上下文中之外。示例示出是等于六个节点上下文宽的水平分组。第一64像素的分组,编号为0,存储在存储体0到3的连续位置中。第二64像素的分组,编号为1,存储在存储体4到7中。该模式重复到第六组64个像素,其被编号为5并且被存储在存储体4到7中,其相对于存储体在第二组64个像素下方的一条线中。在这个示例中,下一个垂直线的第一64个像素被编号为0,且存储在存储体8-B’h中,在第一线中的第三组64个像素下方。这些像素对应于存储在SIMD数据存储器的环形缓冲器中的下一个扫描线中的节点像素。利用由数据通路生成的封装地址,访问扫描线中的像素。数据通路的每一半生成地址,用于将像素封装到该一半数据通路中或从该一半数据通路将像素写入功能存储器7602。为了模拟节点上下文结构,SIMD可以概念上集中在水平分组中的给定组64个像素。在这种情况下,数据通路的每一半集中在利用该一半数据通路的POSN值寻址的集内的单个像素上。封装矢量寻址模式定义立即指令或是与该数据通路的一半关联的寄存器的一半中的封装的带符号值从该像素位置的带符号偏移量。这可与节点处理器指令集中的像素偏移量相匹敌,但其更通用,因为其具有更大的值范围,并且可以基于程序变量。
[0071] 由于SFM处理器7614执行类似于节点(即,808-i)的处理操作,所以其更像节点通过类似上下文结构和程序调度来调度和排序。然而,与节点不同,数据不一定在水平跨越扫描线的上下文之间共享。相反,SFM处理器7614可以对更大的独立上下文进行操作。此外,因为侧上下文可以不是动态共享的,所以上下文之间不需要支持细粒度的多任务,尽管调度程序仍可以使用程序抢占以在数据流停止(stall)周围进行调度。
[0072] 转向图13,可以看到SFM数据存储器7618的结构的示例。该存储器7618一般是SFM处理器7614的标量数据通路,例如其可以具有2048个条目,每个条目32位宽。例如该SFM数据存储器7618的最初八个位置一般含有SFM数据存储器7618上下文的上下文描述符8502。例如,SFM数据存储器7618的接下来的32个位置一般含有用于(例如)在功能存储器7602中多达16个LUT和直方图表格的表格描述符8504,其中每个表格描述符8504占据两个32位字。
尽管这些表格描述符8504一般位于SFM数据存储器8504中,但是在将SFM数据存储器7618初始化为用于控制来自节点(即808-i)的LUT和直方图操作的硬件寄存器期间,可以复制这些表格描述符8504。SFM数据存储器7618的其余部分一般含有程序数据存储器上下文8506,其具有可变分配。此外,矢量存储器7603可以起到SFM处理器7614的SIMD的数据存储器的作用。
[0073] SFM处理器7614还可以利用完整的上下文保存和恢复(包括保存/恢复SIMD寄存器)支持完全通用任务切换。上下文保存/恢复RAM支持0周期上下文切换。这与SFM处理器7614上下文保存/恢复RAM相似,除了在该情况中存在16个额外的存储器用于保存和恢复SIMD寄存器。这允许发生程序抢占而没有惩罚(penalty),其对于支持数据流进入和离开多个SFM处理器7614程序非常重要。该架构使用抢占允许在部分有效的块上执行,其可以最优化资源利用,因为块可能需要大量时间进行完整地传输。上下文状态RAM(Context State RAM)类似于节点(即808-i)上下文状态RAM,并且提供相似的功能。上下文描述符和数据流状态之间存在某些不同,反映SFM功能中的不同,以下将描述这些不同。目的地描述符和未决权限表通常与节点(808-i)相同。SFM上下文可以以多种方式组织,支持检查不同类型的输入数据与执行线和块输入的重叠的相关性。
[0074] SFM节点包装器7626是共享功能存储器1410的部件,其实现在SFM处理器7614周围的控制和数据流。SFM节点包装器7626一般实现SFM到处理集群1400中其他节点的接口。即,SFM包装器7626可以实现下面的功能:节点配置(IMEM,LUT)的初始化;上下文管理;程序调度、切换和终止;输入数据流和能够进行输入相关性检查;输出数据流和能够进行输出相关性检查;处理上下文之间的相关性;以及有关节点的信号事件和支持节点调试操作。
[0075] SFM包装器7626一般具有到处理集群1400中其他块的三个主要接口:消息接口、数据接口和分区接口。消息接口在OCP互连上,其中输入消息和输出消息分别映射到消息互连的从端口和主端口。来自接口的输入消息写入(例如)4级深度消息缓冲器,使得消息处理与OCP接口分离。除非消息缓冲器是满的,否则接收OCP脉冲串并离线处理。如果消息缓冲器变满,那么OCP互连停止工作,直到可以接收更多消息。数据接口一般用于交换矢量数据(输入和输出),以及指令存储器7616和功能存储器LUT的初始化。分区接口一般包括每个分区的共享功能存储器1410中的至少一个专用端口。
[0076] 利用节点指令存储器初始化消息进行指令存储器7616的初始化。消息设置该初始化过程,并且在数据互连上发送指令行。初始化数据由GLS单元1408以多个脉冲串发送。MReqInfo[15:14]="00"(例如)可以将数据互连814上的数据确定为指令存储器初始化数据。在每个脉冲串中,在MreqInfo[20:19](MSB)和MreqInfo[8:0](LSB)上发送起始指令存储器位置。在脉冲串内,地址随着每个节拍(beat)内部递增。Mdata[l19:0](例如)携带指令数据。通过提供起始地址重初始化所选程序,可以重初始化一部分指令存储器7616。
[0077] 功能存储器7602查找表或LUT的初始化一般利用SFM功能存储器初始化消息执行。消息设置初始化过程,并且数据字行在数据互连814上发送。初始化数据由多个脉冲串中的GLS单元1408发送。MReqInfo[15:14]="10"可以将数据互连814上的数据确定为功能存储器7602初始化数据。在每个脉冲串中,在MreqInfo[25:19](MSB)和MreqInfo[8:0](LSB)上发送起始功能存储器地址位置。在脉冲串内,地址随着每个节拍内部递增。通过提供起始地址可以重初始化一部分功能存储器1410。功能存储器1410对存储器初始化访问具有的优先级低于对功能存储器1410的分区访问的优先级。
[0078] 利用SFM控制初始化消息初始化SFM的各种控制设置。其初始化上下文描述符、功能存储器表格描述符和目的地描述符。由于预期到初始化SFM控制所需的字数大于消息OCP互连最大脉冲串长度,所以该消息可以拆分成多个OCP脉冲串。控制初始化的消息脉冲串可以是连续的,在其之间没有其他消息类型。控制初始化的字的总长度应当是(1+#Contexts/2+#Tables+4*#Contexts)。SFM控制初始化应当在任何输入或程序调度到共享功能存储器
7616之前完成。
[0079] 现在,转向输入数据流和相关性检查,输入数据流序列一般以来自源的源通知(Source Notification)消息开始。SFM目的地上下文处理源通知消息并由源许可(SP)消息响应,从而使能来自源的数据。然后,源在相应互连上发送数据,接着是Set_Valid(在互连上编码在MreqInfo位上)。利用更新数据存储器消息,发送标量数据以写入数据存储器7618。在数据互连814上发送矢量数据,以写入矢量存储器7603(或写入功能存储器7602用于以Fm=l同步上下文)。SFM包装器7626还保存数据流状态变量,数据流状态变量用于控制数据流,还用于使能SFM处理器7614中的相关性检查。
[0080] 来自OCP互连1412的输入矢量数据首先被写入(例如)两个8条目全局输入缓冲器7620,连续数据被写入交替布置的可选缓冲器/从交替布置的可选缓冲器读取。除非输入数据缓冲器是满的,否则OCP脉冲串被接收并离线处理。在SFM处理器7614(或分区)不访问存储器的空闲周期中,数据写入矢量存储器7603(或功能存储器7602)。如果全局输入缓冲器
7620变满,那么OCP互连1412停止工作,直到更多的数据可以被接受。在输入缓冲器满条件中,SFM处理器7614也停止工作从而向数据存储器中写入并避免使互连1412停止工作。OCP消息互连上的标量数据也被写入(例如)4条目消息缓冲器,使得消息处理与OCP接口分离。
除非消息缓冲器是满的,否则接收OCP脉冲串并且离线处理数据。在当SFM处理器7614未访问数据存储器7618的空闲周期,数据写入数据存储器7618。如果消息缓冲器变满,那么OCP互连1412停止工作,直到更多消息可以被接受,SFM处理器7614停止工作,从而向存储器
7618写入。
[0081] 输入相关性检查被采用,以大体确保由SFM处理器7614从矢量存储器7603存取的矢量数据是有效数据(已经从输入接收)。对矢量封装加载指令执行输入相关性检查。包装器7626保存存储器7618中的最大有效索引的指针(valid_inp_ptr)。如果H_Index大于valid_input_ptr(RLD)或Blk_Index大于valid_index_ptr(ALD),那么相关性检查在SFM处理器7614矢量单元中失效。包装器7626还提供标志用以表明已经接收完整的输入并且不需要相关性检查。输入相关性检查在SFM处理器7614中失效还引起包装器停止工作或上下文切换-信号相关性检查失效,包装器不会任务切换到另一个就绪程序(或如果没有就绪程序就使处理器7614停止工作)。在相关性检查失效之后,当在已经接收至少另一个输入之后可以再次执行相同的上下文程序(所以相关性检查可以忽略)。当能够再次执行上下文程序时,需要再执行相同的指令包。这使用处理器7614中的专门处理,因为在流水线的执行阶段中检测到输入相关性检查失效。所以这意味着在处理器7614由于相关性检查失效而停止工作之前已经执行指令包中的其他指令。为了处理这种特殊情况,当在先前的相关性检查失效之后再次执行上下文程序时,包装器7626提供信号给处理器7614(wp_mask_non_vpld_instr)。矢量封装加载访问一般在指令包的特定时隙中进行,所以下次重执行一个时隙指令,并且其他时隙的指令被时标(mask)以便于执行。
[0082] 现在转向Release_Input,一旦接收了用于交互的完整的输入,就不可以从源接受更多的输入。源许可不发送到源,以便使能更多输入。在迭代结束之前程序可以释放输入,所以可以接收用于下一次迭代的输入。这是通过Release_Input指令执行的,并且通过标志risc_is_release发信号给处理器7614。
[0083] HG_POSN是当前执行或线(Line)数据的位置。对于线数据上下文,HG_POSN用于像素的相对寻址。HG_POSN被初始化为0,并且在执行处理器7614中的分支指令(TBD)的过程中递增。指令的执行通过标志risc_inc_hg_posn指示给包装器。在HG_POSN到达最右边像素(HG_Size)并且从指令执行接收增量标志之后,HG_POSN覆盖为0。
[0084] 包装器7626还提供程序调度和切换。调度节点程序消息一般用于程序调度,并且程序调度器确实遵循以下功能:保存来自“调度节点程序”消息的一列调度程序(活动上下文)和数据结构;保存一列就绪上下文。当上下文准备好执行以下操作时将程序标记为“就绪”:在接收充足输入时的活动上下文做好准备;(基于轮转优先)调度用于执行的就绪程序;对于被调度以便首次执行的程序,给处理器7614提供程序计数器(Start_PC);和给处理器7614提供数据流变量用于相关性检查以及某些状态变量用于执行。调度器还可以连续地保持寻找下一个就绪上下文(在当前执行上下文之后下一个优先级就绪)。
[0085] SFM包装器7626还可以保存描述符的局部拷贝和即时访问的当前执行上下文的状态位——这些位一般驻留在数据存储器7618或上下文描述符存储器中。当更新上下文描述符存储器中的状态变量时,SFM包装器7626保持局部拷贝相一致。对于执行上下文,以下的这些位通常由处理器7614使用用于执行:数据存储器上下文基址;矢量存储器上下文基址;输入相关性检查状态变量;输出相关性检查状态变量;HG_POSN;和hg_posn!=hg_size的标志。SFM_Wrapper还保存描述符的局部拷贝和下一个就绪上下文的状态位。当一个不同的上下文成为“下一个就绪上下文”时,SFM_Wrapper再次从数据存储器7618和上下文描述符存储器加载需要的状态变量和配置位。执行上述操作以便上下文切换是有效的,并且不需要等待从存储器存取检索设置。
[0086] 任务切换挂起当前执行程序并将处理器7614执行移动到“下一个就绪上下文”。在数据流停止工作的情况下,共享功能存储器1410动态地执行任务切换(参考图309和图310可以看到示例)。数据流停止工作是输入相关性检查失效或输出相关性检查失效。在数据流停止工作的情况中,处理器7614将相关性检查失效标志发信号给SFM包装器7626。基于相关性检查失效标记,SFM包装器7626开始将任务切换到不同的就绪程序。当包装器进行任务切换时,处理器7614进入IDLE(空闲),并且为已经在获取和解码阶段中的指令清除流水线——当程序下一次重新开始时将重新获取那些指令。如果没有其他就绪上下文,那么执行保持挂起,直到数据流停止工作条件可以得到解决——分别在接收输入或接收输出许可时。还应当注意,SFM包装器7626通常推测数据流停止工作是否已经得到解决,因为其不知道输入相关性检查失败的实际的索引,或输出相关性检查失败的实际的目的地。在接收任何新输入(valid_inp_ptr的增量)或输出许可(从任何目的地接收SP)时,程序再次标记为就绪(如果不执行其他程序,重新开始)。因此,在重新开始和经历任务切换之后,程序可能再次未能进行相关性检查。在相同上下文中的任务挂起和恢复序列与不同上下文中的任务切换序列相同。在执行程序中的END指令时还可以尝试任务切换(其示例可以参考图311和图312)。这是为所有就绪程序提供运行的机会。如果不存在其他就绪程序,那么相同程序继续执行。此外,在下面的步骤之后是SFM包装器7626进行任务切换:
[0087] (1)为处理器7614断言(assert)force_ctxz=0
[0088] i.将该程序的处理器7614状态保存到上下文状态存储器中
[0089] ii.从上下文状态存储器中恢复新程序的T20和T80状态
[0090] (2)为处理器7614断言force_pcz=0并提供new_pc。
[0091] i.对于暂停或重新开始执行的程序,从上下文状态存储器保存/恢复PC。
[0092] ii.对于首次开始执行的程序,PC从“Schedule Node Program”消息的Start_PC开始。
[0093] (3)将“下一个就绪上下文”的状态变量和配置位拷贝加载到“当前执行上下文”[0094] 现在转向不同数据类型的输出数据协议,一般来说,在程序执行的开始,SFM包装器7626将源通知消息发送到所有目的地。以目的地描述符编程目的地,目的地以源许可回应,从而使能输出。对于矢量输出,源许可消息中的P_Incr字段表明允许发送到各目的地的传输数量(矢量set_valid)。OutSt状态机控制输出数据流的行为。SFM 1410可以生成两种类型的输出:标量输出和矢量输出。标量输出在消息总线1420上利用更新数据存储器消息发送,矢量输出在数据互连814上(通过数据总线1422)发送。标量输出是在处理器7614中执行OUTPUT指令产生的结果,处理器7614提供输出地址(计算的)、控制字(U6立即指令)和输出数据字(来自GPR的32位)。(例如)6位控制字的格式是Set_Valid([5])、输出数据类型([4:3],其是输入完成(00)、节点线(01)、块(10)或SFM线(11))和目的地数([2:0],其可以是0到7)。通过在处理器7614中执行VOUTPUT指令产生矢量输出,处理器7614提供(计算的)输出地址和控制字(U6立即指令)。输出数据由处理器7614内的矢量单元(即,512位,每个矢量单元GPR 32位*16个矢量单元)提供。VOUTPTU的(例如)6位控制字的格式与OUTPUT的格式相同。来自处理器7614的输出数据、地址和控制可以首先写入(例如)8条目全局输出缓冲器7620中。SFM包装器7626从全局输出缓冲器7620读取输出,并在总线1422上驱动。执行该方案,以便当在互连上发送输出数据时,处理器7614可以继续执行。如果互连814忙碌并且全局输出缓冲器7620变满,那么处理器7614可以停止工作。
[0095] 对于输出相关性检查,如果各个目的地已经为SFM源上下文提供许可用于发送数据,那么处理器7614允许执行输出。如果当输出不能到达目的地时处理器7614遇到OUTPUT或VOUTPTU指令,那么导致输出相关性检查失败,从而引起任务切换。SFM包装器7626提供两个标志给处理器7614,分别作为每个目的地的标量输出和矢量输出使能。处理器7614标记SFM包装器7626的输出相关性检查失效,从而开始任务切换序列。在处理器7614的解码流水线阶段检测输出相关性检查失效,并且处理器7614输入IDLE,如果遇到输出相关性检查失效,则清除获取并解码流水线。一般地,在具有Set_Valid的OUTPUT或VOUTPUT指令之间使用2个延迟时隙,以便于基于Set_Valid更新OutSt状态机,并在下一个Set_Valid之前更新处理器7614的output_enable(输出_使能)。
[0096] SFM包装器7626还处理SFM上下文的程序终止。在处理集群1400中一般存在两种程序终止机制。如果调度节点程序消息使得Te=l,那么程序在END指令终止。其他机制基于数据流终止。利用数据流终止,当已经完成所有输入数据的执行时程序终止。这允许相同程序在终止之前运行多次迭代(多个END和输入数据的多次迭代)。当没有更多数据发送——没有更多的程序迭代时,源将输出终止(OT)发信号给其目的地。目的地上下文存储OT信号,并在最后一次迭代结束时(END)终止——当已经完成输入数据的最后一次迭代执行时。或者,可以在完成最后一次迭代执行之后接收OT信号,在这种情况中,可以立即终止。
[0097] 源通过相同互连路径发出OT信号作为最后输出数据(标量或矢量)。如果来自源的最后输出数据是标量,那么输出终止由消息总线1420上的标量输出终止消息发信号(与标量输出相同)。如果来自源的最后输出数据是矢量,那么输出终止在数据互连814或总线1422上由矢量终止包发信号(与数据相同)。这一般是为了确保在最后数据之前目的地不会接收OT信号。终止时,执行上下文发送OT消息给其所有目的地。在相同的互连上发送OT作为该程序的最后输出。在完成发送OT之后,上下文将节点程序终止消息发送到控制节点1406。
[0098] InTm状态机也可以用于终止。特别地,InTm状态机可以用于存储输出终止消息并且对终止进行排序。SFM 1410使用相同的InTm状态机作为节点,但是采用“first set_valid”用于状态转变,而不是像在节点中那样采用任意set_valid。在输入(set_valid)和目的地上下文的OT与END之间下面的排序次序是可能的:Input Set_Valid–OT–END:在END终止;Input Set_Valid–END–OT:在OT终止;Input Set_Valid(itern-1)–Release_Input–Input Set_Valid(iter n)OT–END–END:在第二个END终止:最后一次迭代;Input Set_Valid(iter n-1)–Release_Input–Input Set_Valid(iter n)END–OT–END:在第二个END终止:最后一次迭代;和Input Set_Valid(iter n-1)–Release_Input–Input Set_Valid(iter n)–END–END–OT:在OT终止。
[0099] 节点状态写消息可以更新指令存储器7616(即,256位宽)、数据存储器7618(即,1024位宽)和SIMD寄存器(即,1024位宽)。这些脉冲串的长度的示例可以如下:指令存储器——9个节拍(beat);数据存储器——33个节拍;和SIMD寄存器——33个节拍。在分区BIU(即,4710-i)中,存在称为debug_cntr的计数器,其对于接收的每个数据节拍递增——一旦计数器达到(例如)意味着8个数据节拍的7(不对具有data_count的首个头节拍进行计数),就使debug_stall(调试_停止)有效(assert),其将禁能cmd_accept和data_accept直到向目的地进行写入。debug_stall是在partition_biu中设置的状态位,并且当节点包装器(即,810-1)进行写时由node_wrapper重置——安装/建立(install)在分区BIU 4710-x中的输入的(对于分区1402-x)nodex_unstall_msg_in上进行。32个数据节拍的示例从分区BIU 4710-x在总线上发送到结点包装器:
[0100] -nodex_wp_msg_en[2:0],其设置为M_DEBUG
[0101] -nodex_wp_msg_wdata[`M_DEBUG_OP]==`M_NODE_STATE_WR,其中M_DEBUG_OP是当消息地址[8:6]具有110编码时将消息流量识别为节点状态写入的位31:29
[0102] -然后,激发node_wrapper中的node_state_write信号——此时保持两个计数器,称为debug_cntr和simd_wr_cntr(类似于partition_biu中的计数器)。在node_wrapper.v中寻找NODE_STATE_WRITE注释,从而寻找该代码。
[0103] -然后,32位包在node_state_wr_data flop中累积——256位。
[0104] -当满足256位时——写入指令存储器。
[0105] -与SIMD数据存储器相似——当具有256位时,对SIMD数据存储器写操作——partition_biu使消息互连停止发送更多数据节拍,直到node_wrapper成功地更新SIMD数据存储器,因为其他流量可以更新SIMD数据存储器——就像例如来自全局输入输出(IO)缓冲器中的全局数据互连的数据。一旦完成数据存储器的更新——通过debug_node_state_wr_done使能不停止,其具有debug_imem_wr|debug_simd_wr|debug_dmem_wr组合。然后,这将不停止partition_biu接收8个更多的数据包并且进行接下来的256位写操作,直到整个1024位都写完。Simd_wr_cntr计数256位数据包。
[0106] 当节点状态读消息出现在合适的从指令存储器时,读取SIMD数据存储器和SIMD寄存器,然后放入(例如)16×1024位全局输出缓冲器7620中。数据从全局输出缓冲器7620发送到分区BIU(即4710-1),然后其将数据输出到消息总线1420。这些总线通常承载矢量输出的流量——但是被过加载,从而也承载节点状态读数据,当读取全局输出缓冲器7620时,下面的信号被使能(例如)作为节点包装器的输出,因此不是nodeX_io_buffer_ctrl的所有位都有关:
[0107] --nodeX_io_buf_has_data通知partition_biu:node_wrapper正在发送数据[0108] --nodeX_io_buffer_data[255:0]具有指令存储器读数据或数据存储器(每次256位)或SIMD寄存器数据(每次256位)
[0109] --nodeX_read_io_buffer[3:0]具有表明总线可用性的信号——利用该信号读取输出缓冲器并将数据发送到partition_biu
[0110] --nodeX_io_buffer_ctrl表明各种信息
[0111]
[0112]
[0113] 在分区BIU 4720-x中,寻找注释SCALAR_OUTPUT(标量_输出):和遵循信号node0_msg_misc_en和node0_imem_rd_out_en。然后,他们建立ocp_msg_master示例。再次使用不同的计数器。debug_cntr_out将(例如)256位数据包分解成期望发送到消息总线1420的32位数据包。发送的消息是节点状态读响应(Node State Read Response)。
[0114] 数据存储器的读取与节点状态读相似,然后,读取合适的从存储器,并放入全局输出缓冲器中,并且从全局输出缓冲器进入分区BIU 4710-x。例如,nodeX_io_buffer_ctrl的位32:31设置为01,要发送的消息可以(例如)是32位宽并且作为数据存储器读响应发送。位16:14还应当表示IOBUF_CNTL_OP_DEB。从存储器可以(例如)是:
[0115] 1.数据存储器,CX=0(aka LS-DMEM)应用数据——利用上下文号得到描述符基址,然后增加沿着消息地址位出现的偏移量
[0116] 2.数据存储器描述符区域,CX=1,消息数据节拍[8:7]=00确定该区域——使用上下文号计算出正在更新哪个描述符
[0117] 3.SIMD描述符——8:7=01确定该区域——上下文号提供地址
[0118] 4.上下文从存储器——8:7=10确定该区域——上下文号提供地址
[0119] 5.处理器7614内部的寄存器——如断点、跟踪点和事件寄存器——8:7=11确定该区域
[0120] a.然后以下信号在处理器7614的接口上建立:
[0121]
[0122] b.以下参数定义在tpic_library路径的tx_sim_defs中:
[0123]
[0124] c.Dbg_addr[4:0]如下设置为断点/跟踪点——来自Set Breakpoint/Tracepoint消息的位26:25
[0125] vii.地址0是断点/跟踪点寄存器0
[0126] viii.地址1是断点/跟踪点寄存器1
[0127] ix.地址2是断点/跟踪点寄存器2
[0128] x.地址3是断点/跟踪点寄存器3
[0129] d.当寻址事件寄存器时Dbg_addr[4:0]设置为读数据存储器偏移量的较低5位——这些在消息中必须设置为4以上。
[0130] 保存处理器7614的状态的上下文保存存储器7610也可以具有(例如)如下的地址偏移量:
[0131] 1.16个通用寄存器具有地址偏移量0、4、8、C、10、14、18、1C、20、24、28、2C、30、34、38和3C
[0132] 2.更新寄存器的剩余部分,如下:
[0133] a.40-CSR-12位宽
[0134] b.42-IER-4位宽
[0135] c.44-IRP-16位
[0136] d.46-LBR-16位
[0137] e.48-SBR-16位
[0138] f.4A-SP-16位
[0139] g.4C-PC-17位
[0140] 当接收Halt(暂停)消息时,halt_acc信号被使能,其设置状态halt_seen。然后其在总线1420上被发送,如下:
[0141] Halt_t20[0]:Halt_seen
[0142] Halt_t20[1]:save context(保存上下文)
[0143] Halt_t20[2]:restore context(恢复上下文)
[0144] Halt_t20[3]:step(步骤)
[0145] 然后,Halt_seen状态发送到ls_pc.v,其然后用于禁能imem_rdy,因此不再获取和不再执行更多的指令。然而,我们期望确保处理器7614和SIMD管道两者在继续之前是空的。一旦耗尽管道,即不存在停止(stall),那么pipe_stall[0]被使能作为节点包装器(即,
810-1)的输入,利用该信号,发送停止确认消息并且处理器7614的整个上下文被保存到上下文存储器中。然后,调试器可以利用CX=1的更新数据存储器消息和指示上下文保存存储器7610的地址位8:7达到和修改上下文存储器中的状态。
[0146] 当将接收恢复消息时,使能halt_risc[2],其将恢复上下文——然后使force_pcz有效,以从上下文状态从PC继续执行。处理7614使用force_pcz使能cmem_wdata_valid,如果由于force_pcz重新启用,那么cmem_wdata_valid被节点包装器禁能。Resume_seen信号还重设各种状态——像例如halt_seen和发送停止确认消息的事实。
[0147] 当接收布骤N指令消息时,步骤的指令数出现(例如)消息数据净荷的位20:16。利用这点,调节imem_rdy。调节工作的方式如下:
[0148] 1.当调试器具有变化状态时从上下文状态重新加载一切
[0149] 2.使mem_rdy禁用一个时钟——获取和执行一条指令。
[0150] 3.然后检查pipe_stall[0]——看指令是否已经执行完成
[0151] 4.一旦断言pipe_stall[0]为高——意味着耗尽管道——那么保存上下文,重复执行该过程直到步骤计数器变为0,一旦其变为0,就发送停止确认消息。
[0152] (例如)可以如下指示断点匹配/跟踪点匹配:
[0153] risc_brk_trc_match——出现断点或跟踪点匹配
[0154] risc_trc_pt_match——意味着其是跟踪点匹配
[0155] risc_brk_trc_match_id[l:0]指示匹配4个寄存器中的哪一个
[0156] 当暂停时可以发生断点;当发生上述事件时,发送停止确认消息。当不暂停时进行跟踪点匹配。连续的跟踪点匹配通过如下方式处理:使第二个跟踪点匹配停止,直到第一个跟踪点匹配有机会发送暂停确认消息。
[0157] 共享功能存储器1410程序调度一般基于活动上下文,不使用调度排队。程序调度消息可以确定执行程序的上下文,并且程序标识符等同于上下文号。如果多于一个上下文执行相同的程序,那么单独地调度每个上下文。调度上下文中的程序引起上下文活动,上下文保持活动直到通过执行调度消息中Te=1的END指令或通过数据流终止而终止。
[0158] 只要HG_Input>HG_POSN,活动上下文就准备执行。可以按照轮转(round-robin)优先方式调度就绪上下文,并且在遇到数据流停止工作或在执行END指令之前,执行每个上下文。当程序试图读取无效的输入数据时,或当程序试图执行输出指令并且输出还没有被源许可使能时,可能出现数据流停止,因为输入数据由HG_POSN和关于HG_Input的存取的相对水平组位置确定。在任何一种情况中,如果存在另一个就绪程序,那么挂起停止程序,并且其状态存储在上下文保存/恢复电路7610中。调度器可以按照轮转优先次序调度下一个就绪上下文,为解决该停止条件提供时间。在重新启动挂起的上下文之前,应调度所有就绪上下文。
[0159] 如果存在数据流停止和其他程序都未准备就绪,那么程序在停止条件保持活动。其保持停止,直到解决停止条件,在该情况中,其从停止时间点重新开始,或直到另一个上下文准备就绪,在该情况中挂起该上下文以便于执行就绪程序。
[0160] 如上所述,所有系统级控制由消息完成。消息可以认为是应用于特定系统配置的系统级指令或命令。此外,配置本身,包括程序和数据存储器初始化——和对配置内事件的系统响应——可以由称为初始化消息的特殊形式的消息设置。
[0161] 本领域的技术人员将理解,在不偏离要求的本发明的保护范围的情况下,可以对所描述的实施例和实现的额外实施例作出改进。