上下文切换方法和装置的制作方法

文档序号:6362302阅读:317来源:国知局
专利名称:上下文切换方法和装置的制作方法
技术领域
本公开总体涉及处理器,并更具体地涉及处理集群。
背景技术
图1是描绘多内核系统(范围从2个到16个内核)的执行速率的加速比与并行开销的关系的图示,其中加速比是单个处理器执行时间除以并行处理器执行时间。可以看出,并行开销必须接近于零,以从大量内核获得显著益处。但是,由于如果并行程序之间存在任何交互,则开销往往非常高,因此通常难以高效使用多于一个或两个处理器来进行任何事情,除了完全分离的程序。因此,有必要改进处理集群。

发明内容
因此,本公开实施例提供了一种用于在具有预定深度流水线的处理器(808-1至808-N,1410,1408)上从第一上下文切换到第二上下文的方法。所述方法特征在于:在处理器(4324,4326,5414,7610)上执行第一上下文中的第一任务,使得第一任务穿越所述流水线;通过改变处理器(808-1至808-N, 1410,1408)的切换引线(force_pcz, force_ctxz)上的信号状态,使切换引线(force_pcz,force_ctxz)有效,以此调用上下文切换;从保存/恢复存储器(4324,4326,5414,7610)中读取用于第二任务的第二上下文;将用于第二任务的第二上下文经由输入引线(new_ctx, new_pc)提供给处理器(808-1至808-N, 1410,1408);摄取对应于第二任务的指令;在处理器(808-1至808-N,1410,1408)上执行第二上下文中的第二任务;以及在第一任务已穿越流水线到其预定的流水线深度之后,使处理器(808-1至808-N, 1410,1408)上的保存/恢复引线(cmem_wrz)有效。


图1是多内核加速比参数的图示;图2是根据本公开实施例的系统的图示;图3是根据本公开实施例的SOC的图示;图4是根据本公开实施例的并行处理集群的图示;图5是处理集群中的一部分节点或计算元件的图示。图6是全局加载/存储(GLS)单元的示例的图示;图7是共享功能存储器(function-memory)的方框图;图8是描绘上下文命名的图示;图9是在示例系统上执行应用程序的图示;图10是在示例系统上执行应用程序时抢占(pre-emption)示例的图示;图11-13是任务切换的示例;图14是节点处理器或RISC处理器的更详细的图示;图15和图16是用于节点处理器或RISC处理器的部分流水线的示例的图示;以及
图17是零周期上下文切换的示例的图示。
具体实施例方式图2中示出了执行并行处理的SOC的应用的示例。在该示例中,示出了成像设备1250,并且该成像器件1250 (其可以例如是移动电话或摄像机)一般包括图像传感器1252、S0C1300、动态随机存取存储器(DRAM)1254、闪存1256、显示器1526以及电源管理集成电路(PMIC)1260。在操作中,图像传感器1252能够捕获图像信息(其可以是静止图像或视频),该图像信息可以由S0C1300和DRAM1254处理,并且存储在非易失性存储器中(即闪存1256)。此外,存储在闪存1256中的图像信息也可以通过使用S0C1300和DRAM1254显示在显示器1258上给用户。同样,成像设备1250常常是便携式的,并且包括电池作为电源;PMIC1260(其可以由S0C1300控制)可以帮助调节电源使用,从而延长电池寿命。在图3中,根据本公开实施例描绘了片上系统或S0C1300的示例。该S0C1300(其通常是集成电路或1C,例如0ΜΑΡ )—般包括处理集群1400 (其一般执行上述并行处理)和提供宿主环境(在上面描述和引用)的主处理器1316。主处理器1316可以是宽的(即32位,64位等)RISC处理器(例如ARM Cortex_A9),并且与总线仲裁器1310、缓冲器1306、总线桥1320(其允许主处理器131·6经由接口总线或Ibusl330访问外围接口 1324)、硬件应用编程接口(API) 1308以及中断控制器1322经由主处理器总线或HP总线1328进行通信。处理集群1400通常与功能电路1302(其可以例如是电荷耦合器件或CCD接口,并且可以与片外设备进行通信)、缓冲器1306、总线仲裁器1310以及外围接口 1324经由处理集群总线或PC总线1326进行通信。借助该配置,主处理器1316能够通过API1308提供信息(即将处理集群1400配置为符合期望的并行实现),同时处理集群1400和主处理器1316两者都可以直接访问闪存1256 (通过闪存接口 1312)和DRAM1254 (通过存储器控制器1304)。此外,通过联合测试行动组(JTAG)接口 1318可以执行测试和边界扫描。转到图4,根据本公开实施例描绘了并行处理集群1400的示例。通常,处理集群1400对应于硬件722。处理集群1400 —般包括分区1402-1至1402-R,它们可以包括节点808-1 至 808-N、节点包装器(node wrapper)810-1 至 810-N、指令存储器(MEM) 1404-1 至1404-R以及总线接口单元或(BIU)4710-1至4710-R (其在下面详细讨论)。节点808-1至808-N各自耦合到数据互连814(分别通过BIU4710-1至4710-R以及数据总线1422),并且分区1402-1至1402-R的控制或消息可以通过消息1420从控制节点1406提供。全局加载/存储(GLS)单元1408和共享功能存储器1410也提供用于数据移动的额外功能(如下描述)。此外,三级或L3高速缓存1412、外围设备1414 (其一般不包括在IC内)、存储器1416(其通常是闪存1256和/或DRAM1254以及不包括在S0C1300内的其它存储器)以及硬件加速器(HWA)单元1418与处理集群1400 —起使用。还可以提供接口 1405,以便将数据和地址传递到控制节点1406。处理集群1400 —般使用“推”模型(“puSh”m0del)用于数据传递。传递一般表现为缓冲写入(posted write),而不是请求-响应型的访问。与请求-响应的访问相比,这有利于将全局互连(即数据互连814)的占用减小一半,因为数据传递是单向的。一般不期望将请求路由通过互连814,接着将响应路由到请求器,这导致在互连814上有两个转换。推模型产生单个传递。这对于可扩展性是很重要的,因为随着网络大小增加,网络延迟增加,这必然降低请求-响应事务处理的性能。推模型以及数据流协议(即812-1至812-N)—般将全局数据流量最小化到用于正确性的全局数据流量,同时也一般最小化全局数据流对本地节点利用的影响。通常对节点(即808-1)性能影响很少或没有影响,即使在大量全局流量的情况下。源将数据写入到全局输出缓冲器(下面讨论),并且继续而不需要确认传递成功。数据流协议(即812-1至812-N)一般确保在第一次尝试将数据移动到目的地时传递成功,从而在互连814进行单个传递。全局输出缓冲器(其在下面讨论)可以容纳高达16个输出(例如),从而使节点(即808-1)不太可能由于用于输出的瞬时全局带宽不足而拖延/停止(stall)。此外,瞬时带宽不被请求-响应事务处理或失败传递的重试影响。最后,推模型更紧密地匹配编程模型,即程序不“摄取”它们自己的数据。相反,它们的输入变量和/或参数在被调用之前被写入。在编程环境中,输入变量的初始化表现为由源程序对存储器进行写入。在处理集群1400中,这些写入被转换成缓冲写入,其将变量值填充(populate)在节点上下文中。全局输入缓冲器(其在下面讨论)用于接收来自源节点的数据。由于用于各节点808-1至808-N的数据存储器(DMEM)是单端口的,因此输入数据的写入可能与本地单输入多数据(SIMD)的读取相冲突。通过将输入数据接受到全局输入缓冲器中来避免这个竞争,其中全局输入缓冲器可以等待开放的数据存储器周期(即,与SIMD访问没有存储体(bank)冲突)。数据存储器可以具有32个存储体(例如),所以缓冲器很可能被快速释放。然而,节点(即808-1)应该具有空闲缓冲器条目,因为没有握手来确认传递。如果期望,全局输入缓冲器可以停止本地节点(即808-1)并且对数据存储器进行强制写入,从而释放缓冲器位置,但该事件应该极其罕见。通常,全局输入缓冲器被实现为两个独立的随机存取存储器(RAM),使得一个存储器可以处于对全局数据进行写入的状态,而另一个存储器处于被读取到数据存储器中的状态。消息传送互连与全局数据互连分开,但也采用了推模型。在系统级,节点808-1至808-N在处理集群1400中是复制的,类似于SMP或对称多处理,其中节点数量被缩放到期望的吞吐量。处理集群1400可以缩放到很大数量的节点。节点808-1至808-N可以被分组到分区1402-1至1402-R,其中每个分区具有一个或多个节点。分区1402-1至1402-R通过增加节点之间的本地通信并且允许较大的程序计算较大量的输出数据来帮助可扩展性,从而使其更可能满足期望的吞吐量要求。在分区(即1402-1)内,节点使用本地互连进行通信,并且不需要全局资源。分区(即1404-1)内的节点也可以以任何粒度共享指令存储器(即1404-1):从每个节点使用专用指令存储器到所有节点使用公共指令存储器。例如,三个节点可以共享指令存储器中的三个存储体,第四个节点具有指令存储器中的专用存储体。当节点共享指令存储器(即1404-1)时,节点一般同步执行相同的程序。处理集群1400也可以支持很大数量的节点(即808-1)和分区(即1402_i)。然而,每个分区的节点数量通常限制在4个,因为每个分区具有4个以上节点一般类似于非均匀存储器访问(NUMA)架构。在该情形中,通过具有大致恒定的截面带宽的一个(或多个)交叉互连(crossbar)(其在下面针对互连814进行描述)连接分区。处理集群1400目前被构建为每个周期传递一个节点宽度的数据(例如,64个16位像素),被分割成在4个周期上每个周期16像素的4个传递。处理集群1400 —般容许延迟,并且节点缓冲一般防止了即使在互连814接近饱和时的节点停止(应该注意,除了合成程序之外,该条件难以实现)。通常,处理集群1400包括在分区之间共享的全局资源:(I)控制节点1406,其实现整个系统的消息传送互连(经由消息总线1420)、事件处理和调度以及到主处理器和调试器的接口(所有这些都在下面详细描述)。(2)GLS单元1408,其包含可编程精简指令集(RISC)处理器,从而使系统数据移动可以由C++程序来描述,C++程序可以被直接编译为GLS数据移动线程。这使得系统代码能够在交叉宿主环境中执行,而不需要修改源代码,并且比直接存储器访问更加通用,因为它可以从系统或SMD数据存储器(下面描述)中的任何一组地址(变量)移动到任何另一组地址(变量)。它是多线程的,在(例如)0周期上下文切换的情况下,支持例如多达16个线程。(3)共享功能存储器1410,其是大的共享存储器,所述共享存储器提供了通用的查找表(LUT)和统计收集设施(直方图)。它也可以支持使用大的共享存储器进行的像素处理,例如重采样和失真校正,这种像素处理不被节点SMD很好地支持(出于成本原因)。该处理使用(例如)六发射(six-1ssue) RISC处理器(即SFM处理器7614,其在下面详细描述),从而实现标量、向量以及2D阵列作为原生类型。(4)硬件加速器1418,其可以被包括而用于不需要可编程性的功能,或者用于优化电力和/或面积。加速器表现为子系统,作为系统中的其它节点,参与控制和数据流,可以创建事件和被调度,并且对调试器可见。(在适用情况下,硬件加速器可以具有专用的LUT和统计收集)。(5)数据互连814和系统开放内核协议(OCP) L3连接1412。这些管理节点分区、硬件加速器以及系统存储器和外围设备之间在数据总线1422上的数据移动(硬件加速器还可以具有到L3的专用连接)。(6)调试接口。这些在示意图上未示出,但在本文件中有描述。转到图5,可以更详细地看出节点808-1的示例。节点808-1是处理集群1400中的计算元件,而用于寻址和程序流控制的基本元件是RISC处理器或节点处理器4322。通常,该节点处理器4322可以具有32位的数据路径,其中具有20位指令(在40位指令中可能有20位立即字段)。像素操作例如以如下方式执行:在一组32像素功能单元中,在SMD组织中,与从SMD数据存储器到SMD寄存器的四个加载(例如)和从SMD寄存器到SMD数据存储器的两个存储(例如)并行(节点处理器4322的指令集架构在下面的第7节中描述)。指令包描述(例如)一个RISC处理器内核指令、四个SMD加载和两个SMD存储,与由所有SMD功能单元4308-1至4308-M执行的3发射SMD指令并行。通常,加载和存储(从加载存储单元4318-1)在SMD数据存储器位置和SMD本地寄存器之间移动数据,这些数据可以例如代表多达64个16位像素。虽然SMD加载和存储使用共享的寄存器4320-1来进行间接寻址(也支持直接寻址),但是SMD寻址操作读取这些寄存器:寻址上下文由内核4320管理。内核4320具有用于寄存器溢出/填充、寻址上下文以及输入参数的本地存储器4328。为每个节点提供分区指令存储器1404-1,其中多个节点可以共享分区指令存储器1404-1,从而对跨越多个节点的数据集执行较大程序。节点808-1也包括支持并行的若干特征。全局输入缓冲器4316-1和全局输出缓冲器4310-1 (其结合Lf缓冲器4314-1和Rt缓冲器4312-1,一般包括用于节点808-1的输入/输出(10)电路)将节点808-1输入和输出与指令执行去耦合,从而使节点不太可能由于系统IO而停止。输入通常在处理之前很好地被接收(通过SMD数据存储器4306-1至4306-M,和功能单元4308-1至4308-M),并且使用备用周期(spare cycle)存储在SMD数据存储器4306-1至4306-M中(这很常见)。SIMD输出数据被写入全局输出缓冲器4210_i,并且从那里被路由通过处理集群1400,从而使节点(即808-1)即使在系统带宽接近其极限(这也是不可能的)时也不太可能停止。SMD数据存储器4306-1至4306-M和对应的SMD功能单元4306-1至4306-M的各自统称为“SMD单元”。SIMD数据存储器4306-1至4306-M被组织成具有可变大小的、被分配到相关或不相关任务的互不重叠的上下文。上下文在水平和垂直两个方向上都是完全共享的。在水平方向上进行共享使用只读存储器4330-1和4332-1,它们对于程序是只读的,但可通过写入缓冲器4302-1和4304-1、加载/存储(LS)单元4318_i或其它硬件进行写入。这些存储器4330-1和4332-1也可以是约512x2位大小。一般地,这些存储器4330_i和4332_i对应于相对于被操作的中央像素位置而言在左边和右边的像素位置。这些存储器4330-1和4332-1使用写缓冲机制(即写入缓冲器4302-1和4304_i )来调度写入,其中侧上下文写入通常不与本地访问同步。缓冲器4302-1 —般与当前操作的邻近像素(例如)上下文保持一致性。在垂直方向上进行共享使用SMD数据存储器4306-1至4306-M内的循环缓冲器;循环寻址是LS单元4318-1所施加的加载和存储指令支持的一种模式。通常使用上面描述的系统级依赖性协议保持共享数据一致性。上下文分配和共享由SMD数据存储器4306-1至4306-M上下文描述符在与节点处理器4322相关联的上下文状态存储器4326中指定。该存储器4326可以例如是16x16x32位或2x16x256位的RAM。这些描述符也指定了数据如何在上下文之间以完全通用的方式共享,并且保留信息以处理上下文之间的数据依赖性。上下文保存/恢复存储器4324通过允许寄存器4320-1并行保存和恢复,以此用于支持O周期任务切换(如上描述)。针对每个任务使用独立的上下文区域来保持SMD数据存储器4306-1至4306-M和处理器数据存储器4328上下文。SIMD数据存储器4306-1至4306-M和处理器数据存储器4328被划分成具有可变大小的可变数量的上下文。垂直帧方向的数据被保留并且在上下文本身内再使用。通过将上下文链接在一起成为水平组来共享水平帧方向的数据。重要的是要注意,上下文组织方式与计算中所涉及的节点数量以及它们如何彼此交互是基本上无关的。上下文的主要目的是保留、共享以及再使用图像数据,而不管操作该数据的节点的组织方式。通常,SIMD数据存储器4306-1至4306-M包含(例如)由功能单元4308-1至4308-M操作的像素和中间上下文。SMD数据存储器4306-1至4306-M —般划分成(例如)多达16个不相交的上下文区域,其各自具有可编程的基地址,其中从所有的上下文可访问公共区域,公共区域由编译器用于寄存器溢出/填充。处理器数据存储器4328包含输入参数、寻址上下文以及用于寄存器4320-1的溢出/填充区域。处理器数据存储器4328可以具有(例如)高达16个不相交的本地上下文区域,它们对应于SMD数据存储器4306-1至4306-M上下文,并且各自具有可编程的基地址。通常,节点(即节点808-1)例如具有三种配置:8个SMD寄存器(第一配置);32个SIMD寄存器(第二配置);以及32个SMD寄存器加上在每个较小的功能单元中有三个额外的执行单元(第三配置)。
现转到图6,可以更详细地看到全局加载存储(GLS)单元1408。GLS单元1408的主处理部件是GLS处理器5402,其可以是类似于上面详述的节点处理器4322的通用32位RISC处理器,但可以被定制用于GLS单元1408中国。例如,GLS处理器5402可以被定制为能够复制用于节点(即808-1)的SMD数据存储器的寻址模式,使得已编译的程序可以按期望产生用于节点变量的地址。GLS单元1408 —般也可以包括上下文保存存储器5414、线程调度机制(即消息列表处理5402和线程包装器5404)、GLS指令存储器5405、GLS数据存储器5403,请求队列和控制电路5408、数据流状态存储器5410、标量输出缓冲器5412、全局数据IO缓冲器5406以及系统接口 5416。GLS单元5402也可包括用于交织和解交织的电路和用于实现配置读取线程的电路,用于交织和解交织的电路可以将交织的系统数据转换成非交织的处理集群数据,反之亦然,用于实现配置读取线程的电路可以从存储器1416取出用于处理集群1400的配置(包含程序,硬件初始化等),并且将其分发给处理集群1400。对于GLS单元1408,可以有三个主接口(即系统接口 5416、节点接口 5420以及消息传送接口 5418)。对于系统接口 5416,通常有到系统L3互连的连接,用于访问系统存储器1416和外围设备1414。该接口 5416—般具有两个缓冲器(以乒乓(ping-pong)布置方式),它们足够大以存储(例如)128线的各自256位L3分组。对于消息传送接口 5418,GLS单元1408可以发送/接收操作消息(即线程调度、信令终止事件以及全局LS单元配置),可以分发所摄取的用于处理集群1400的配置,并且可以将传输标量值传输到目的地上下文。对于节点接口 5420,全局IO缓冲器5406 —般耦合到全局数据互连814。一般地,该缓冲器5406足够大以存储64线的节点SMD数据(每个线例如可以包含16位的64个像素)。缓冲器5406也可以例如被组织为256x16x16位,从而匹配每周期16像素的全局传递宽度。现在,转到存储器5403、5405和5410,其各自包含一般与驻留线程有关的信息。GLS指令存储器5405—般包含用于所有驻留线程的指令,而不管线程是否是活动/激活的。GLS数据存储器5403 —般包含用于所有驻留线程的变量、临时变量(temporary)以及寄存器溢出/填充值。GLS数据存储器5403也可以具有对线程代码隐藏的区域,该区域包括线程上下文描述符和目的地列表(类似于节点中的目的地描述符)。也有标量输出缓冲器5412,其可以包括到目的地上下文的输出;该数据一般被保持以复制到水平组中的多个目的地上下文,并且将标量数据的传递流水线化,从而匹配处理集群1400处理流水线。数据流状态存储器5410 —般包含从处理集群1400接收标量输入的每个线程的数据流状态,并且控制依赖于该输入的线程的调度。通常,用于GLS单元1408的数据存储器被组织成若干部分。数据存储器5403的线程上下文区域对于GLS处理器5402的程序是可见的,而其余的数据存储器5403和上下文保存存储器5414保持私有。上下文保存/恢复或上下文保存存储器通常是针对所有挂起线程(即16x16x32位寄存器内容)的GLS处理器5402寄存器的副本。数据存储器5403中两个其它私有区域包含上下文描述符和目的地列表。请求队列和控制5408 —般监视GLS处理器5402在GLS数据存储器5403之外的加载和存储访问。这些加载和存储访问由线程执行,从而将系统数据移动到处理集群1400,反之亦然,但数据一般不物理地流过GLS处理器5402,且GLS处理器5402 —般不对数据执行操作。相反,请求队列5408将线程“移动”转换成在系统级上的物理移动,从而针对移动匹配加载与存储访问,并且使用系统L3和处理集群1400数据流协议执行地址和数据排序、缓冲分配、格式化以及传递控制。上下文保存/恢复区域或上下文保存存储器5414 —般是宽的RAM,其可以立即保存并恢复用于GLS处理器5402的所有寄存器,从而支持O周期上下文切换。线程程序每一数据访问会需要若干周期,用于地址计算、条件测试、环路控制等。因为有大量的潜在线程,并且因为目的是保持所有线程足够活动以支持峰值吞吐量,所以重要的是,上下文切换可以以最小周期开销发生。也应该注意,由于单线程“移动”传递用于所有节点上下文的数据(例如在水平组中每个上下文的每个变量的64像素),因此线程执行时间会部分地偏移。这可以允许相当大数量的线程周期,同时仍支持峰值像素吞吐量。现在,转到线程调度机制,该机制一般包括消息列表处理5402和线程包装器5404。线程包装器5404通常接收输入消息到邮箱(mailbox)中,从而调度用于GLS单元1408的线程。一般地,每个线程有一邮箱条目,其可以包含如下信息,例如初始的线程程序计数以及在线程的目的地列表的处理器数据存储器(即4328)中的位置。消息也可以包含参数列表,其在O偏移处开始写入到线程处理器数据存储器(即4328)上下文区域中。邮箱条目也在线程执行期间用于当线程挂起时保存线程程序计数,并且用于定位目的地信息以实现数据流协议。除了消息传送之外,GLS单元还执行配置处理。通常,该配置处理可以实现配置读取线程,其从存储器摄取用于处理集群1400的配置(包含程序、硬件初始化等),并且将其分发到其余的处理集群1400。通常,该配置处理经由节点接口 5420执行。此外,GLS数据存储器5403 —般可以包括用于上下文描述符、目的地列表和线程上下文的部分或区域。通常,线程上下文区域对GLS处理器5402是可见的,但GLS数据存储器5403的其余部分或区域可能是不可见的。转到图7,可以看到共享功能存储器1410。共享功能存储器1410 —般是大的集中存储器,其支持节点不能很好地支持(即出于成本原因)的操作。共享功能存储器1410的主要部件是两个大的存储器:功能存储器(FMEM) 7602和向量存储器(VMEM) 7603 (其各自具有在例如48至1024千字节之间的可配置大小和组织)。该功能存储器7602实现了高带宽的基于向量的查找表(LUT)和直方图的同步的指令驱动的实现。向量存储器7603可以支持暗示(imply)向量指令(在上面第8部分中详细描述)的6发射处理器(即SFM处理器7614)进行的操作,向量指令例如可以用于基于块的(block-based)像素处理。通常,可以使用消息传送接口 1420和数据总线1422访问该SFM处理器7614。SFM处理器7614例如可以对宽像素上下文(64像素)操作,宽像素上下文可以具有比节点中的SMD数据存储器更通用的组织和总存储器大小,其中更通用的处理被应用到数据。其支持对标准C++整数数据类型进行标量、向量和数组操作,以及对与各种数据类型可兼容的包装的像素进行标量、向量和数组操作。例如并如图示出,与向量存储器7603和功能存储器7602相关联的SMD数据路径一般包括端口 7605-1至7605-Q以及功能单元7605-1至7605-P。所有处理节点(即808-1)可以访问功能存储器7602和向量存储器7603,在这个意义上,功能存储器7602和向量存储器7603 —般是“共享”的。可以通过SFM包装器访问提供给功能存储器7602的数据(通常以只写的方式)。该共享一般也与上述针对处理节点(即808-1)描述的上下文管理一致。处理节点和共享功能存储器1410之间的数据I/O也使用数据流协议,并且且处理节点通常不能直接访问向量存储器7603。共享功能存储器1410也可以对功能存储器7602进行写入,但当其正在被处理节点访问时不可以写入。处理节点(即808-1)可以对功能存储器7602中的公共位置进行读取和写入,但(通常)作为只读LUT操作或只写直方图操作。处理节点也可能对功能存储器7602区域进行读写访问,但这对于给定程序的访问应该是专有的。因为有许多类型的共享数据,所以引入术语来区分共享类型和用于大致确保满足依赖性条件的协议。下面的列表定义了图8中的术语,且也引入用于描述依赖性解析的其它术语:中央输入上下文(Cin):这是从一个或多个源上下文(即3502-1)到主SMD数据存储器(不包括只读左侧和右侧上下文随机存取存储器或RAM)的数据。左输入上下文(Lin):这是来自一个或多个源上下文(即3502-1)的、作为中心输入上下文被写到另一个目的地的数据,其中目的地的右上下文指针指向该上下文。当其上下文被写入时,数据通过源节点被复制到左上下文RAM中。右输入上下文(Rin):类似于Lin,但其中由源上下文的左上下文指针指向该上下文。中央本地上下文(Clc):这是由在上下文中执行的程序产生的中间数据(变量、临时变量等)。左本地上下文(Lie):这类似于中心本地上下文。然而,其不在该上下文内产生,而是由通过其右上下文指针共享数据的上下文产生,并且被复制到左侧上下文RAM中。右本地上下文(Rlc):类似于左本地上下文,但是其中由源上下文的左上下文指针指向该上下文。设置有效(Set_Valid):来自外部数据源的信号,其指示完成针对那组输入的输入上下文的最后传递。信号与最后的数据传递同步发送。输出停止(Output_kill):在帧边界的底部,循环缓冲器可以用早先提供的数据执行边界处理。在该情形中,源可以使用Set_Valid触发执行,但通常不提供新数据,因为这会改写边界处理所需的数据。在该情形中,数据伴随该信号,从而指示数据不应该被写入。
源数量(#Source ):输入源的数量通过上下文描述符指定。上下文应该在执行可以开始之前,从每个源接收所有的所需数据。分开考虑到节点处理器数据存储器4328的标量输入和到SMID数据存储器(即4306-1)的向量输入一总共可以有四种可能的数据源,并且源可以提供标量或向量数据,或者它们两者。Input_done:由源发送(signal)该信号,以指示没有更多的来自该源的输入。伴随的数据是无效的,因为该条件由源程序中的流控制检测,不与数据输出同步。这使接收的上下文停止期待来自源的Set_Valid,例如用于初始化的曾经提供的数据。Release_Input:这是个指令标志(由编译器确定),其指示输入数据不再被需要,并且可以由源改写。左有效输入(Lvin):这是指示输入上下文在左侧上下文RAM中有效的硬件状态。其在左侧的上下文接收正确数量的Set_Valid信号之后,当该上下文将最后的数据复制到左侧RAM中时被设置。该状态由指令标志(由编译器706确定)复位,以指示输入数据不再被需要,并且可以由源改写。左有效本地(Lvlc):依赖性协议一般保证当程序执行时Llc数据通常是有效的。然而,有两个依赖性协议,因为可以与执行同时或非同时提供Llc数据。该选择是基于当任务开始时上下文是否已经有效而做出的。此外,该数据源一般防止在数据被使用之前改写数据。当Lvlc被复位时,这指示Llc数据可以被写入到上下文中。中央有效输入(Cvin):这是指示中心上下文已接收到正确数量的Set_Valid信号的硬件状态。该状态由指令标志(由编译器706确定)复位,以指示输入数据不再被需要,并且可以由源改写。右有效输入(Rvin):类似于Lvin,除了右侧上下文RAM之外。右有效本地(Rvlc):依赖性协议保证右侧上下文RAM通常是可用的以接收Rlc数据。然而,当相关任务准备执行时,该数据不总是有效的。Rvlc是指示Rlc数据在上下文中有效的硬件状态。左侧右有效输入(LRvin):这是左侧上下文的Rvin位的本地副本。到中心上下文的输入也提供到左侧上下文的输入,所以该输入一般不能启用,直到左侧输入不再被需要(LRvin=O)0这被保持为本地状态,以有助于访问。右侧左有效输入(RLvin):这是右侧上下文的Lvin位的本地副本。其用途类似于LRvin,以基于右侧上下文也对输入可用,启用到本地上下文的输入。输入启用(InEn):这指示对上下文启用输入。其在当针对中心、左侧以及右侧上下文已释放输入时被设置。当Cvin=LRvin=RLvin=O时,满足该条件。水平方向上共享的上下文在左和右两个方向上具有依赖性。上下文(即3502-1)接收来自其左边和右边上下文的Llc和Rlc数据,并且也提供Rlc和Llc数据给那些上下文中。这在数据依赖性中引入了循环性:在上下文可以提供Rlc数据给其左边的上下文之前,上下文应该接收来自其左边的上下文的Llc数据,但在左边的上下文可以提供Llc上下文之前,左边的上下文期望来自其右边的这个上下文的Rlc数据。使用细粒度多任务打破该循环。例如,任务3306-1至3306-6 (图9)可以是相同的指令序列,在六个不同上下文中操作。这些上下文在帧的相邻水平区域上共享侧上下文数据。该图也示出两个节点,每个节点具有相同任务集和上下文配置(针对节点808-(i+l)示出部分序列)。为了进行解释,假设任务3306-1处于左边界上,那么其没有Llc依赖性。通过任务在相同节点上(即808-1)不同时间片中执行来示出多任务;任务3306-1至3306-6水平展开,从而强调帧中与水平位置的关系。当任务3306-1执行时,其生成用于任务3306-2的左本地上下文数据。如果任务3306-1到达其会需要右本地上下文数据的点,则其不能进行,因为没有提供该数据。由在其自身上下文中执行的任务3306-2使用任务3306-1生成的左本地上下文数据来生成其Rlc数据(如果需要)。由于硬件竞争(两个任务在相同节点808-1上执行),任务3306-2还没有执行。在该点处,任务3306-1被挂起,而任务3306-2执行。在任务3306-2的执行期间,其提供左本地上下文数据给任务3306-3,并也提供Rlc数据给任务3308-1,其中任务3308-1仅是相同程序的延续,但具备有效的Rlc数据。这个解释是针对节点内组织,但同样的问题适用于节点间组织。节点间组织仅仅是广义的节点内组织,例如用两个或多个节点取代节点 808-1。当所有的LiruCin和Rin数据对上下文有效时(如果需要),如LviruCvin和Rvin状态确定的,程序可以在该上下文中开始执行。在执行期间,程序使用该输入上下文生成结果,并且更新Llc和Clc数据——该数据可以不受限制地使用。Rlc上下文是无效的,但Rvlc状态被设置为使硬件能够使用Rin上下文而不停止。如果程序遇到对Rlc数据的访问,则其不能超越该点进行下去,因为该数据可能还没有被计算(计算它的程序不一定能执行,因为节点数量小于上下文的数量,所以不是所有的上下文可以并行计算)。在访问Rlc数据之前指令完成时,任务切换发生,从而挂起当前的任务,并启动另一个任务。当任务切换发生时,复位Rvlc状态。任务切换是基于编译器706设置的指令标志,编译器706认识到右侧的中间上下文在程序流中第一次被访问。编译器706可以在输入变量和中间上下文之间进行区分,因此可以避免针对输入数据的这个任务切换,输入数据是有效的,直至不再被需要。任务切换释放节点,从而在新的上下文中计算,通常是其Llc数据被第一任务更新的上下文(其例外在下面说明)。该任务执行与第一任务相同的代码,但在新的上下文中,假设Lvin、Cvin和Rvin被设置——Llc数据有效,因为其较早被复制到左侧上下文RAM中。新任务生成结果,该结果更新Llc和Clc数据,并且也更新在前一上下文中的Rlc数据。因为新任务执行与第一任务相同的代码,所以其也将遇到相同的任务边界,并且随后的任务切换将发生。该任务切换以信令发送其左边的上下文,从而设置Rvlc状态,因为任务结束意味着所有的Rlc数据在执行中有效直到该点。在第二任务切换中,有两个可能的选择来调度下一个任务。第三任务可以在下一个右边的上下文中执行相同的代码,如刚才所述,或者第一任务可以在其被挂起的地方恢复,因为其现在具有有效的Lin、Cin、Rin、Llc、Clc和Rlc数据。两个任务应该在某一时刻执行,但是次序通常与正确性没有关系。调度算法通常尝试选择第一选择,尽可能从左至右进行(可能的所有路线到右边界)。这满足更多的依赖性,因为该次序生成有效的Llc和Rlc数据,而恢复第一任务将生成Llc数据,如先前一样。满足更多的依赖性将最大化准备恢复的任务的数量,从而当任务切换发生时,一些任务更可能准备运行。最大化准备执行的任务数量是重要的,因为多任务也用于优化计算资源的利用率。这里,有大量的数据依赖性与大量的资源依赖性相互作用。没有固定的任务调度可以保持硬件在依赖性冲突和资源冲突两者都存在的情况下完全被利用。如果节点(即808-1)出于某些原因(一般因为还没有满足依赖性)不能从左至右进行,则调度器将恢复第一上下文中的任务,也就是,节点(即808-1)上最左边的上下文。左边的任何上下文应该准备执行,但是在最左边上下文中进行恢复最大化可用于解决导致执行次序的这个变化的那些依赖性的周期数量,因为这使任务能够在最大数量的上下文中执行。因此,可以使用抢占(即抢占3802),其为修改任务调度的时间。转到图10,可以看到抢占的示例。这里,任务3310-6不能在任务3310-5之后立即执行,但任务3312-1至3312-4准备执行。任务3312-5不准备执行,因为其依赖于任务3310-6。节点810-1上的节点调度硬件(即节点包装器810-1)认识到任务3310-6没有准备好,因为Rvlc没有被设置,并且节点调度硬件(即节点包装器810-1)在最左边的上下文中开始准备好的下一个任务(即任务3312-1)。其继续在连续上下文中执行那个任务,直到任务3310-6准备好。其尽快恢复到原来的调度,例如,仅任务3314-1抢占2212-5。优先从左至右执行仍是重要的。概括来说,相对于它们的水平位置,任务从最左边的上下文开始,尽可能从左至右进行,直到遇到停止或最右边的上下文为止,然后在最左边的上下文中恢复。这通过最小化依赖性停止的几率来最大化节点利用率(节点,例如节点808-1,可以具有高达八个调度程序,并且来自这些程序中的任何一个程序的任务可以被调度)。迄今为止,对侧上下文依赖性的讨论专注于真正的依赖性,但是在侧上下文中也有反依赖性。程序可以对给定的上下文位置写入不止一次,并且通常就这样做,以最小化存储器要求。如果程序在这些写入之间读取那个位置上的Llc数据,则这意味着右边的上下文也期望读取该数据,但是由于用于该上下文的任务还没有执行,因此在第二任务读取它之前,第二写入将改写第一写入的数据。通过在第二写入之前引入任务切换来处理该依赖性情形,并且任务调度确保任务在右边的上下文中执行,因为调度假设该任务不得不执行以提供Rlc数据。然而,在该情形中,任务边界使第二任务在第二次修改Llc数据之前读取它。任务切换由软件使用(例如)2位标志指示。任务切换可以指示nop无操作、释放输入上下文、设置输出有效或任务切换。2位标志在指令存储器(即1404-1)的一级中被解码。例如,可以假设,第一时钟周期的任务I会接着在第二时钟周期中导致任务切换,并且在第二时钟周期中,来自指令存储器(即1404-1)的新指令取出用于任务2。2位标志在称为csjnstr的总线上。此外,PC —般可以源自两个地方:(I)如果任务没有遇到BK位,则来自程序的节点包装器(即810-1);以及(2)如果已看到BK且任务执行已结束,则来自上下文保存存储器。可以使用图10的两个节点808-1和808- (i+Ι)来解释任务抢占。在该例子中,节点808-k具有分配给程序的三个上下文(上下文0,上下文1,上下文2)。同样,在该例子中,节点808-1和808- (i+Ι)在节点内配置中操作,并且节点808- (k+Ι)以及用于节点808- (k+Ι)的上下文O的左上下文指针指向节点808-k的右上下文2。节点808-k的各个上下文和set_valid接受之间存在关系。当set_valid被接收用于上下文O时,其设置上下文O的Cvin并且设置上下文I的Rvin。由于Lf=I指示左边界,因此对于左上下文没有什么需要做的;类似地,如果Rf被设置,则没有Rvin应该被传播。一旦上下文I接收Cvin,它就传播Rvin到上下文0,并且由于Lf=l,因此上下文O准备执行。上下文I 一般地应当在执行之前将Rvin、Cvin和Lvin设置到I ;类似地,对于上下文2同样如此。此外,对于上下文2,当节点808- (k+Ι)接收set_valid时,Rvin可以被设置为I。Rvlc和Lvlc —般不被检查,直到达到BK=I,此后任务执行折回(wrap around)并且此时应该检查Rlvc和Lvlc。在达到BK=I之前,PC源于另一程序,并且此后,PC源于上下文保存存储器。并发任务可以通过写入缓冲解决左上下文依赖性,这已经在上面描述,并且可以使用如上所述的编程规则来解决右上下文依赖性。有效本地像存储一样被处理,并且也可以与存储配对。有效本地可以被发送到节点包装器(即810-1),并且从那里,直接路径、本地路径或远程路径可以用来更新有效本地。可以在触发器中实现这些位,并且设置的位是上述总线中的SET_VLC。上下文编号在DIR_CONT上传送。使用在任务切换之前保存的前一上下文编号来本地完成VLC位的复位——使用延迟一个周期的版本CS_INSTR控制。如上所述,有各种参数被检查以确定任务是否准备好。对于现在的任务,将使用输入有效和本地有效来解释任务抢占。但是,这也可以扩展到其它参数。一旦Cvin、Rvin和Lvin是I,任务就准备执行(如果没有看见Bk=l)。一旦任务执行折回,除了 Cvin、Rvin和Lvin之外,Rvlc和Lvlc也可以被检查。对于并发任务,Lvlc可以被忽略,因为实时依赖性
检查接管了。同样,当在任务之间(即任务I和任务2)之间转变时,任务I的Lvlc可以在任务O遇到上下文切换时被设置。此时,当在任务O将要完成之前使用任务间隔计数器检查任务I的描述符时,任务I没有准备好,因为Lvlc没有被设置。然而,任务I被假设为准备知道当前任务是O并且下一个任务是I。类似地,当任务2例如返回任务I时,任务I的Rvlc可以再次由任务2设置;Rvlc可以在上下文切换指示对任务2呈现时被设置。因此,当在任务2完成之前检查任务I时,任务I没有准备好。这里再次地,任务I被假设为准备知道当前上下文是2并且下一个执行的上下文是I。当然,所有的其它变量(像输入有效和有效本地)应该被设置。任务间隔计数器指示任务执行的周期数量,并且可以在基础上下文完成执行时捕获该数据。在该示例中再次使用任务O和任务1,当任务O执行时,任务间隔计数器无效。因此,在任务O执行之后(在任务O执行的阶段I期间),设置描述符、处理器数据存储器的推测读取。实际的读取发生在任务O执行的接下来的阶段,并且在预期任务切换时设置推测的有效位。在下一个任务切换期间,推测的副本更新架构副本,如早先描述的。访问下一个上下文信息没有与使用任务间隔计数器一样理想,因为立即检查下一个上下文是否有效可能导致没有准备好的任务,同时等待直到任务完成结束可能实际上准备好了任务,因为更多的时间已给出用于任务准备检查。但是,由于计数器是无效的,没有其他的可以做。如果存在由于在检查看任务是否准备好之前等待任务切换而造成的延迟,那么延迟任务切换。通常重要的是,在看到任务切换标志之前做出所有决定,例如执行哪一个任务等,并且当看到任务切换标志时,任务切换可以立即发生。当然,有这样的情形,在看到标志之后,任务切换不会发生,因为下一个任务等待输入,并且没有其它任务/程序进行。一旦计数器有效,在任务之前的若干(即10个)周期将完成,下一个要执行的上下文被检查其是否准备好。如果它没有准备好,则可以考虑任务抢占。如果因为任务抢占已完成(一个级别的任务抢占可以完成),任务抢占不能完成,则可以考虑程序抢占。如果没有其它程序准备好,则当前程序可以等待任务准备好。当任务是停止的时,可以由用于上下文编号的有效输入或本地有效唤起,所述上下文编号在如上描述的Nxt上下文编号中。当程序更新时,Nxt上下文编号可以与基础上下文编号一起被复制。同样,当程序抢占发生时,抢占的上下文编号被存储在Nxt上下文编号中。如果没有看见Bk并且任务抢占发生,则Nxt上下文编号再次具有应该执行的下一个上下文。唤起条件启动该程序,并且从入口 O开始逐个检查程序入口,直到检测到准备好的入口。如果没有入口准备好,则进程继续,直到检测到准备好的入口,其然后导致程序切换。唤起条件是可以用于检测程序抢占的条件。当任务间隔计数器是任务将要完成之前的若干(即22个)周期(可编程值)时,检查每个程序入口,以查看其是否准备好。如果准备好,则在程序中设置准备好的位,其可以在当前程序中没有准备好的任务时使用。注意任务抢占,程序可以写为先进先出(FIFO)并且可以以任何次序读出。次序可以通过接下来哪一个程序是准备好的而确定。在当前执行的任务将要完成之前的若干(即22个)周期,确定程序准备度。在进行选定程序/任务的最后探测之前(即10个周期),程序探测(即22个周期)应该完成。如果没有任务或程序准备好,则无论何时有效输入或有效本地进来,探测都重新启动以确定哪个入口是准备好的。对节点处理器4322的PC值是若干(即17)位,并且通过将来自程序的若干(即16)位向左偏移(例如)1位而获得该值。当使用来自上下文保存存储器的PC执行任务切换时,不需要偏移。当在任务期间计算的变量的侧上下文需要或不需要时,节点级程序(其描述算法)内的任务是一批指令,其起始于输入有效的侧上下文和任务切换。下面是节点级程序的示例:
权利要求
1.一种用于在具有预定深度的流水线的处理器(808-1至808-N,1410,1408)上从第一上下文切换到第二上下文的方法,所述方法特征在于: 在所述处理器(4324,4326,5414,7610)上执行第一上下文中的第一任务,使得所述第一任务穿越所述流水线; 通过改变所述处理器(808-1至808-N, 1410,1408)的切换引线(force_pcz, force_ctxz)上的信号状态,使所述切换引线(force_pcz, force_ctxz)有效,以此调用上下文切换; 从保存/恢复存储器(4324,4326,5414,7610)中读取用于第二任务的所述第二上下文; 将用于所述第二任务的所述第二上下文经由输入引线(new_ctx, new_pc)提供给所述处理器(808-1 至 808-N, 1410,1408); 摄取对应于所述第二任务的指令; 在所述处理器(808-1至808-N,1410,1408)上执行所述第二上下文中的所述第二任务;以及 在所述第一任务已穿越所述流水线到其预定的流水线深度之后,使所述处理器(4324,4326,5414,7610)上 的保存/恢复引线(cmem_wrz)有效。
2.根据权利要求1所述的方法,其中调用步骤进一步的特征在于: 使程序计数器切换引线(forCe_pCZ )有效;以及 使上下文切换引线(force_ctxz)有效。
3.根据权利要求2所述的方法,其中所述程序计数器切换引线(forCe_pCZ)和上下文切换引线(force_ctxz)各自是一个位宽。
4.根据权利要求1、2或3所述的方法,其中提供步骤进一步的特征在于: 经由程序计数器输入引线(new_pC)提供程序计数器值;以及 经由上下文输入引线(new_ctx)提供机器状态。
5.根据权利要求4所述的方法,其中所述程序计数器输入引线(new_pC)是17位宽,而所述上下文输入引线(new_ctx)是592位宽。
6.根据权利要求1、2、3、4或5所述的方法,其中执行所述第一任务的步骤进一步的特征在于,执行所述第一上下文上的多个第一任务。
7.根据权利要求1、2、3、4、5或6所述的方法,其中执行所述第二任务的步骤进一步的特征在于,执行所述第二上下文上的多个第二任务。
8.一种装置,其特征在于: 保存 / 恢复存储器(4324,4326,5414,7610); 指令存储器(1404-1 至 1404-R,5405,7616); 数据存储器(4328,5403,7618); 处理器(4322,5402,7614),其耦合到所述保存/恢复存储器(4324,4326,5414,7610)、所述指令存储器(1404-1至1404-R,5405,7616)以及数据存储器(4328,5403,7618),其中所述处理器(4322,5402,7614)具有预定的流水线深度,并且其中所述处理器包括: 切换引线(force_pcz, force_ctxz),其用于通过改变所述切换引线(force_pcz,force_ctxz)上的信号状态来调用上下文切换;输入引线(new_ctx, new_pc),其用于提供来自所述保存/恢复存储器(4324,4326,5414,7610)的上下文数据; 指令地址引线(imem_addr),其用于提供指令存储器地址; 指令数据引线(imeme_rdata),其用于接收指令数据;以及 写入启用引线(cmem_wrz),其用于启用上下文写入。
9.根据权利要求8所述的装置,其中所述切换引线(force_pcz,force_ctxz)进一步的特征在于,程序计数器切换引线(force_pcz)和上下文切换引线(force_ctxz)。
10.根据权利要求9所述的装置,其中所述程序计数器切换引线(f0rCe_pCZ)和上下文切换引线(force_ctxz)各自是一个位宽。
11.根据权利要求8、9或10所述的方法,其中所述输入引线进一步的特征在于: 程序计数器输入引线(new_pc ),其用于提供程序计数器值;以及 上下文输入引线(new_ctx),其用于提供机器状态。
12.根据权利要求11所述的方法,其中所述程序计数器输入引线(new_pC)是17位宽,而所述上下文输入引线(neW_Ctx)是592位宽。
13.一种用于在具有预定深度流水线的处理器(808-1至808-N,1410,1408)上从第一上下文切换到第二上下文的系统,所述系统特征在于: 用于在所述处理器(4324,4326,5414,7610)上执行所述第一上下文中的第一任务,使得所述第一任务穿越所述流水线的装置; 用于通过改变所述处理器( 808-1至808-N, 1410,1408 )的切换引线(force_pcz,force_ctxz)上的信号状态,使所述切换引线(force_pcz, force_ctxz)有效,以此调用上下文切换的装置; 用于从保存/恢复存储器(4324,4326,5414,7610)中读取用于第二任务的所述第二上下文的装置; 用于将用于所述第二任务的所述第二上下文经由输入引线(new_ctx, new_pc)提供给所述处理器(808-1至808-N, 1410,1408)的装置; 用于摄取对应于所述第二任务的指令的装置; 用于在所述处理器(808-1至808-N,1410,1408)上执行所述第二上下文中的所述第二任务的装置;以及 用于在所述第一任务已穿越所述流水线到其预定的流水线深度之后,使所述处理器(4324,4326,5414,7610)上的保存/恢复引线(cmem_Wrz)有效的装置。
14.根据权利要求13所述的系统,其中用于调用的装置进一步的特征在于: 用于使程序计数器切换引线(forCe_pCZ)有效的装置;以及 用于使上下文切换引线(force_ctxz)有效的装置。
15.根据权利要求14所述的系统,其中所述程序计数器切换引线(f0rCe_pCZ)和上下文切换引线(force_ctxz)各自是一个位宽。
16.根据权利要求13、14或15所述的系统,其中用于提供的装置进一步的特征在于: 用于经由程序计数器输入引线(new_pC)提供程序计数器值的装置;以及 用于经由上下文输入引线(new_ctX)提供机器状态的装置。
17.根据权利要求16所述的系统,其中所述程序计数器输入引线(new_pC)是17位宽,而所述上下文输入引线(neW_Ctx)是592位宽。
18.根据权利要求1、2、3、4或5所述的系统,其中用于执行所述第一任务的装置进一步的特征在于,用于执行所述第一上下文上的多个第一任务的装置。
19.根据权利要求1、2、3、4、5或6所述的方法,其中用于执行所述第二任务的步骤进一步的特征在于,执行所述第 二上下文上的多个第二任务。
全文摘要
本发明提供了一种用于在具有预定深度流水线的处理器上从第一上下文切换到第二上下文的方法。在处理器上执行第一上下文中的第一任务,使得第一任务穿越流水线。通过改变处理器的切换引线(force_pcz,force_ctxz)上的信号状态,使切换引线(force_pcz,force_ctxz)有效,以此调用上下文切换。从保存/恢复存储器中读取用于第二任务的第二上下文。用于第二任务的第二上下文经由输入引线(new_ctx,new_pc)提供给处理器。摄取对应于第二任务的指令。在处理器上执行第二上下文中的第二任务,在第一任务已穿越流水线到其预定的流水线深度之后,使处理器上的保存/恢复引线(cmem_wrz)有效。
文档编号G06F9/44GK103221918SQ201180055694
公开日2013年7月24日 申请日期2011年11月18日 优先权日2010年11月18日
发明者W·约翰森, J·W·戈楼茨巴茨, H·谢赫, A·甲雅拉, S·布什, M·琴纳坤达, J·L·奈, T·纳加塔, S·古普塔, R·J·尼茨卡, D·H·巴特莱, G·孙达拉拉彦 申请人:德克萨斯仪器股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1