美国专利申请号10/684,350(MIPS.0188-01-US),申请日2003年10月10日,其标题为“确保在一多线程处理器上的程序执行的服务品质的机制”;以及
美国临时专利申请No.60/502,358(MIPS.0188-02-US),申请日2003年9月12日,其标题为“对在一处理器架构的多线程应用的特别扩充”;以及
【具体实施方式】
在本发明的一实施例中,一处理器架构包括一指令集,而该指令集包含多个特征、多个功能与多个指令,能够实现在一处理器上的多线程操作。本发明并不止限于任何特定的处理器架构与指令集,而为了例示的目的,公知的MIPS技术、指令集和处理器技术(总言之,为“MIPS技术”)被参考。并且加上本发明所详细描述的实施例也可归类为MIPS技术。更多有关MIPS技术的信息(包括以下所参照到的文件)可以从MIPS科技公司(MIPS ttechnology,Inc.)(位于Mountain View,California)取得,而其网站位于www.mips.com(公司网站)。
在此所示用的术语“处理器”与“数字处理器”其意义包含任何可程序化的装置(举例来说,微处理器、微控制器、数字信号处理器、中央处理单元、处理器核心等等),包含在硬件方面(例如,特殊应用硅芯片、可程序编辑门阵列(FPGA)等等),在软件方面(例如,硬件描述语言、C语言、C+语言等等)或任何其组成(或其组合)。
在此所示用的术语“线程”与“程序线程”在本文中代表相同的意义。一线程是一序列的计算机指令以及与这些指令的执行相关联的处理器状态改变的相关序列。该指令的序列通常但非必要包含一或多个程序控制指令(如一分支指令)。因此,这些指令可能具有或可能不具有连续性的存储器地址。该指令的序列是出自一单一程序。
概要描述
在本发明的实施例中,为了描述的目的,“线程上下文”基本上是 指为了描述在一处理器中的一指令串流执行的状态所需的一处理器状态的集合。所谓的状态基本上反映了处理器寄存器的内容。举例来说,在一个与工业规格MIPS32且/或MIPS64指令集架构兼容的处理器(一“MIPS处理器”),线程上下文是由通用寄存器(GPRs)、高低(Hi/Lo)乘法器结果寄存器、一程序计数器(PC)的一些表示与一些相关的专属系统控制状态的寄存器组成。系统控制状态被保存于MIPS处理器中通常称为共处理器零(“CP0”)的部份,并且大部分是被系统控制寄存器与(当被使用时)转换后备缓冲器(Translation Lookaside Buffer,“TLB”)所维护。相反的,“处理器上下文”是一个更大的处理器状态集合,其包含至少一个线程上下文。再参照之前提到的MIPS处理器,此情况下的一个处理器上下文包含至少一个线程上下文(如前述)、以及CP0和描述公知的MIPS32或MIPS64专属资源架构(“PRA”)所需的系统状态。(简单的说,PRA是一有关环境与能力的集合,而一个指令集架构而根据此集合进行工作。该PRA提供操作系统管理处理器的各资源所需要的机制,例如,虚拟存储器、高速缓存、异常与使用者上下文)。
根据本发明的一实施例,到一指令集架构与PRA的一多线程特殊应用扩充(“Multithreading ASE”)允许在一给定处理器中具有两个不同,但并不一定互相排斥的多线程能力。首先,一个单一处理器可以包含一定数目的处理器上下文,而每个皆可通过共享处理器中的某些资源以及支持一指令集架构,而作为一独立的处理元件进行工作。这些独立的处理元件在此是指虚拟处理元件(“VPEs”)。对软件而言,一个N VPE处理器看起来很像N个路径对称的多处理器(“SMP”)。这允许了现存的具SMP功能的操作系统可以管理VPE集合,该VPE集合显然共享处理器的执行单元。
图3用一单一处理器301描述了该能力,该处理器301支持一第一VPE(“VPE0”),其包含寄存器状态零302与系统共处理器状态零304。 处理器301也支持一第二VPE(“VPE1:),而其包含寄存器状态一306与系统共处理器状态一308。被VPE0与VPE1所共享的处理器301的那些部份包括提取、解码与执行流水线,及高速缓存310。可与SMP兼容的操作系统320被示出在该处理器301上运行,并支持VPE0与VPE1。软件进程A 322与进程C 326被示出分别运行于VPE0与VPE1上,如同它们在两个不同的处理器上运行。进程B 324被排队,而可以在VPE0或VPE1上运行。
第二个被多线程ASE所允许的能力为每个处理器或VPE可以在基本的架构所需的单一线程上下文外,再含有某些数目的线程上下文。多线程VPEs需要明确的操作系统支持,并且通过该支持,它们提供一个简易、细质多线程程序化模型,其中在典型情况下线程被产生与消灭,而没有操作系统干预,并且其中响应外部的状况(例如,事件等等),系统服务线程可被排定,具有零中断等待时间。
图4使用处理器401描述这第二个能力,该处理器401支持单一VPE,该VPE包含寄存器状态402、404与406(支持三个线程422)与系统共处理器状态408。与图3不同的是,在这个例子中三个线程是在位于单一VPE上的单一应用地址空间,该地址空间共享CP0资源(以及硬件资源)。另外,图4也描述了一专用多线程操作系统420。在此例中,多线程VPE正在处理来自一个宽频网络450的数据包,而此数据包负载分布于整组的先进先出缓冲器(FIFO)452(在多线程VPE的输入/输出存储器空间中,各FIFO有不同的地址)。控制应用程序产生了足够多的线程,当上FIFO进行服务时,且放置每一线程在读取FIFO的紧密循环中。
一个线程上下文可以是四种状态之一。其可以是空闲(free)、激活(activated)、停止(halted)或线连(wired)。一个空闲的线程上下文不具有有效的上下文,且不能被调度为发出指令。一个激活的线程上下文可以根据实施的策略来调度,而从程序计数器提取与发出指 令。一个停止的线程上下文可以具有有效的上下文,但被禁止提取与发出的指令。一个线连的线程上下文已被指定用作为阴影寄存器(ShadowRegister)储存器,也就是说是被保留用于一异常处理程序的互斥使用,以避免储存与恢复处理程序中的寄存器上下文的开销。一个空闲的线程上下文不可以是激活、停止或线连的。只有激活的线程上下文可以被调度。只有空闲的线程上下文可以被分配以产生新的线程。
为了允许协同线程的细质同步,一个线程间通信(“ITC”)的存储空间会产生于虚拟存储器中,并且有空的(empty)/满的(full)位语义,允许线程在加载或储存时被阻挡,直到其它线程产生或消耗数据。
在一般情况下,线程产生/消灭,与同步能力功能没有操作系统干预,但是他们所操控的资源可经操作系统是全部虚拟化。这允许具有比在一VPE上的线程上下文有更多的虚拟线程的多线程程序的执行,并允许线程的移动以平衡多处理器系统中的负载。
以其执行中的任何特定点,一个线程是附着在一个特定VPE上的特定线程上下文。VPE的线程上下文集的标记在该点的发生时间提供了一个唯一的标识符。但是上下文的切换与移动能够使单一序列的线程的执行以有一系列的不同的线程标记,例如是在一系列不同的VPE。
在一特殊处理器的重置配置状态中,线程上下文、TLB项目及其它资源动态地与在同一处理器上的数个VPE结合。每一个VPE项目如同其在一个不相同的处理器般准确地输入其重置向量。
多线程的执行与导常模型
多线程ASE并没有对平行线程与VPE的执行强加任何特殊的实现方式或调度的模型。调度可以是循环式的、时间分隔至任一粒度、或同时的。然而,实现方式必须不允许一个阻挡线程去独占任何共享的处理器资源,而使得硬件运行陷入僵局。
在一MIPS处理器中,在一单一VPE上的多个线程执行皆共享同一系统共处理器(CP0),同一TLB与同一虚拟地址空间。每一个线程有一个独立的核心/管理者/使用者状态,用于指令解码和存储器存取。当一个异常发生时,除了执行该异常之外,所有的线程都被停止或暂停,直到状态字的EXL与ERL位被清除。或者,在EJTAG Debug(除错)异常的情形下,该Debug状态被退出。该状态字置于位于CP0中的状态寄存器中。有关该EXL与ERL位还有EJTAG除错异常的细节可以从下列的两个出版物获得,该两出版物可以从MIPS科技公司取得,并被结合在此作为参考:MIPS32 TM Architecture for Programmers Volumn III:The MIPS32 TM Privileged Resource Architecture,Rev.2.00,MIPS科技公司(2003)与MIPS64 TM Architecture for Programmers Volume III:The MIPS64 TM Privileged Resource Architecture,Rev.2.00,MIPS科技公司(2003)。因为执行一个指令串流而引起的同步异常的异常处理程序,例如TLB遗失与浮点异常,都是由讨论中的执行该指令串流的该线程所执行。当一个未被屏蔽的异步异常,例如一个中断,被提升至一个VPE时,它的实行即与哪个线程执行了该异常处理程序相关。
每一个异常都与一个线程上下文有关,即使阴影寄存器集合被使用来运行异常处理程序。这个相关的线程上下文是被异常处理程序执行的RDPGPR与WRPGPR指令的目标。有关RDPGPR与WRPGPR指令(用来获取阴影寄存器)的细节,皆可以从MIPS科技公司取得的两出版物中获得,该两出版物被结合在此作为参考:MIPS32 TM Architecture forProgrammers Volume II:The MIPS32 TM Instruction Set,Rev.2.00,MIPS科技公司(2003)与MIPS64 TM Architecture for Programmers VolumnIII:The MIPS64 TM Instruction Set,Rev.2.00,MIPS科技公司(2003)。
该多线程ASE包含了两个异常状况。第一个即是一线程未取得状况,其中一个线程分配要求不能被满足的。第二个为线程下溢状况,其 中一个线程的终止与解除分配没有留下在一VPE上分配的线索。这两种异常状况都被映像至一单个新的线程异常。当该异常发生时,他们可以根据CPO寄存器位而被区分。
指令
在一实施例中,多线程ASE包含七个指令。FORK与YIELD指令控制线程分配、解除分配与调度,如果被实现与启动的话,在全部的执行模式中可获得。MFTR与MTTR指令是系统共处理器(Cop0)指令,可用于管理线程状态的特许系统软件。一个新的EMT指令与一个新的DMT指令是特许Cop0指令,用来启动与禁止一个VPE的多线程操作。最后,一个ECONF指令是特许的Cop0指令,以退出一个特殊处理器配置状态与重新初始化该处理器。
FORK(派生)-分配与调度一个新的线程
FORK指令可以使一个空闲线程上下文被分配与启动。它的格式500如图5所示。FORK指令从字段中标识的GPRs取两个操作值502(rs)与504(rt)。GPR rs的内容被用作为新线程的开始提取与执行地址。GPRrt的内容是一个待被传送至该新线程的GPR中的值。通过CPO的ThreadConfig寄存器的FORKTarget字段的值确定目的地GPR,其被示于图21中,并于稍后会加以描述。新线程的核心/管理者/使用者状态是被设定于FORK处理的线程中的状态如果没有空闲线程上下文可供该FORK指令使用,则会为此FORK指令产生一个线程异常。
YIELD(产出)-取消调度与有条件的解除分配(deallocation )一线程
(第一实施例)
YIELD指令使得当前的线程被选择性地取消调度。在一第一实施例 中,一YIELD指令600的格式如图6所示,而图32中的流程图3200描述了根据本发明的一个实施例的系统操作,使用图6的YIELD指令的功能。YIELD指令3500的一第二实施例以下参照图35至图40进行描述。
举例而言,YIELD指令600在字段602(rs)中标识的GPR中取一单个操作值。在一实施例中使用了一个GPR,但是在替换性实施例中,其操作值可以从实质上任何可由系统访问的数据储存装置(例如,非GPR寄存器、存储器等等)被储存或取得。在一实施例中,GPR rs的内容可以被认为是发出线程应被重新调度的情况的描述符。如果该GPR rs的内容是零(即该操作数的值为零),如图32的步骤3202所示,则该线程并不会被重新调度,而是会被解除分配(即终止或永久地停止更进一步的执行),如同步骤3204所示,还有与其相关的线程上下文储存(即上述标识出保存状态的寄存器)通过一些其它线程所发布的随后的FORK指令被空闲出来用于分配。如果该GPR rs的最低有效位被设定(即,rs0=1),则该线程马上会被重新调度,如图32的步骤3206所示,并且如果没有其它可被执行的线程被优先取得,则即刻继续执行。在此一实施例中,该GPR rs的内容是被视为十五位限定屏蔽,其描述在图7的表格700中(即编码许多状况的一位向量)。
请参照表格700,GPR rs的位15至位10指示了呈现给处理器的硬件中断信号,位9至位8指示了处理器所产生的软件中断信号,位7至位6指示了MIPS架构中Load Linked(负载连接)与Store Conditional(存储状况)同步运算基元,还有位5至位2指示了呈现给处理器的非中断外部信号。
假设GPR rs的内容是偶数的(even)(即位0未被设定),且GPR rs的限定屏蔽中任何其他位被设定(步骤3208),则该线程即会被暂停,直到满足至少一对应的状态。如果且当此情形发生时,该线程即会被重新调度(步骤3210),并且重新开始执行YIELD指令600之后的指令。这 个启动并不会受CP0.Status.IMn中断屏蔽位的影响,因此至多有被位15至10与位5至2(如图7所示)编码的十种外部状况(例如,事件等等)与四个被位9至6编码的软件状况(如图7所示),在目前的实施例当中被用来启动独立的线程以响应外部信号,而在处理器不需去引起一个异常。在这个特别的例子中,有六个硬件中断与四个非中断信号,再加上两个软件中断与两个非中断信号,及专用于总共十五种的状况的单个专用重新调度功能(即rs0)。(该CP0.Status.iMn中断屏蔽位是在CP0状态寄存器中的一个八位的集合,其可被选择性地屏蔽八个到MIPS处理器的中断输入。如果一个IM位被设定,则相关联的中断输入就不会引起断言时的处理器的异常事件。)
在EIC的中断模式中,IP2至IP7位编码最高优先权启动的中断,而不是表示了一个正交指示的向量。当处理器正在使用EIC中断模式时,在一个YIELD指令600中,与位IP2至IP7相关的GPR rs的位因此不再被使用以在一个特殊的外部事件上去重新启动线程调度。在EIC模式中,只有与系统相关连的外部事件指示(即,在本实施例中的GPR rs的位5至2)可以被使用为YIELD的限定器。EIC的中断模式与IP2至IP7位已被更进一步的描述于下列的出版物,它们再上文中已被指出并结合进来:MIPS32 TM Architecture for Programmers Volume III:TheMIPS32 TM Privileged Resource Architecture,与MIPS64 TM Architecturefor Programmers Volume III:The MIPS64 TM Privileged ResourceArchitecture。
如果YIELD 600d1执行导致处理器或VPE上最后分配的线程的解除分配,具有一个在CP0的ThreadStatus寄存器中的下溢指示的线程异常(示出在图18中且在稍后会加以说明)就会在YIELD指令600上产生。
上述的实施例使用了YIELD指令600中GPR rs所包含的操作数作为线程调度的参数。在该情况中,这个参数被视作为正交指示的15位向量 (参照图7,位1与15被保留因此在此实施例中只有15个编码的状况)。此实施例也将此参数视为一个规定的值(即,去决定是否一个给定的线程应该被解除分配,参阅图32的步骤3202)。然而,此参数的特性可以被改变,以适合该指令的各种不同实施例。例如,不同于只依赖最小有效位(即rs0)去决定是否一个线程可立即地重调度,该参数本身的值(例如,两个补码格式中的负1{-1}的值)可以被使用来决定一个线程是不是应该被重调度,而无须附加的等待时间(即重新排队用于调度)。
在该指令其他的实施例中可以视该线程调度参数为包含一个或多个多位值的字段,使得一个线程可以指定它将在出自一个大的(例如32位或更大)事件名称空间的单个事件上产生。在这样的实施例中,至少与一目标事件有关的位可以通过对象YIELD指令600所访问。当然,更多的位字段都可被传送至该指令(与更多的事件相关)而成为另一期望的特定实施例。
还有更多的YIELD指令600的实施例可包括有该指令访问的线程调度参数内的值字段与前述位量的组合值字段的组合或其他应用特定的变更与加强,以(例如)满足特定的实现需求。YIELD指令600的替换性实施例可以用任何已知的方法访问如前述的一个线程调度参数,例如从一个GPR(如图6所示)或从任意其它的数据储存装置(包含存储器)且作为该指令本身中的立即值。
MFTR-自线程寄存器移动
MFTR指令是一个特许的(Cop0)指令,可允许一个执行一线程的操作系统访问一个不同的线程上下文。其格式800被示于图8。
待被访问的线程的上下文是通过CPO的ThreadControl寄存器的AlternateThread字段的值被确定的,其显示于图16并且会在稍后描述。在选定的线程上下文中待被读取的寄存器是通过字段802中标识的 rt操作数寄存器的值,还有各自位于字段804与806中的MFTR指令的u与sel位被确定,并且依据在图9所显示的表格900被解释。结果值被写入于目标寄存器rd中,在字段808中被标识。
MTTR-移动到线程寄存器
MTTR指令与MFTR指令相反。其为一特许Cop0指令,其将一寄存器的值从目前线程的线程上下文复制至另一线程上下文中的一个寄存器。其格式1000显示于图10。
待被访问的线程的上下文是通过CP0的ThreadControl寄存器的AlternateThread字段的值被确定的,其显示于图16并且会在稍后描述。在选定的线程上下文中待被写的该寄存器通过字段1002标识的rd操作数寄存器中的值,还有各自字段1004与1006中的MTTR指令的u与sel位被确定,并且依据在图11所显示的表格1100被解释(其编码与MFTR相同)。字段1008中标识的的寄存器rt中的值被复制于选定寄存器。
EMT-启动多线程
EMT指令为一特许的Cop0指令,其通过设定CPO的ThreadControl(线程控制)寄存器的TE位来启动多线程的同时执行,其显示于图16并且会在稍后描述。其格式1200显示于图12。包含在该EMT执行之前的该被启动的线程(TE)位值的该ThreadControl寄存器的值会被传回寄存器rt。
DMT-禁止多线程
DMT指令为一特许的Cop0指令,其通过清除CPO的ThreadControl寄存器的TE位来禁止多线程的同时执行,其显示于图16并且会在稍后 描述。其格式1300显示于图13。
除了发出该DMT指令的线程之外的所有的线程都被禁止进一步指令获取与执行。这与每线程(per-thread)暂停状态无关。包含该DMT执行的该被启动的线程(TE)位值的该ThreadControl寄存器的值会被传回寄存器rt。
ECONF-结束处理器配置
ECONF指令为一特许的Cop0指令,其传送VPE配置结束的信号并启动多VPE的执行。其格式1400显示于图14。
当执行一个ECONF指令时,该Config3寄存器的VPC位(稍后描述)即被清除,同一寄存器的MVP位在其当前值变成只读,且处理器的所有VPE,包含一个正在执行ECNOF的VPE,皆获得一个Reset(重置)的异常。ECONF指令并不包含在Multithreading ASE(多线程ASE)的图35-40的替换性实施例中。
特许的资源
图15的表格1500列出了与多线程ASE相关的系统共处理器特许的资源。除了指示的外,以下标识的新的或是变更过的共处理器零(Coprocessor0,CP0)象常规的共处理器零(即在MIPS处理器)的系统控制寄存器一样是可存取的(即写入与读出)。
新的特许的资源
(A)ThreadControl(线程控制)寄存器(Coprocessor0 Register7,Select1)
该ThreadControl寄存器是在每个VPE中被例示为系统共处理器的一个部分。其布局1600显示于图16。该ThreadControl寄存器字段可 根据图17的表格1700来定义。
(B)ThreadStatus(线程状态)寄存器(Coprocessor0 Register12,Select4)
该ThreadStatus寄存器在每个线程上下文被例示。每一个线程皆有ThreadStatus其自己的备份,并且特许的代码可以经过MFTR与MTTR的指令来访问其它线程的ThreadStatus。其布局1800显示于图18。该ThreadStatus寄存器字段在图19的表格1900中被定义。
将一个1写至一个激活的线程的Halted(停止)位,会使得该激活的线程停止提取指令,并且设定其内部的重新开始PC到下一个发出的指令。将一个0写至一个激活的线程的Halted(停止)位,会使得该线程被调度从内部重新开始PC地址读取并执行。在未被激活的线程的激活位或是停止位任一中的1防止该线程通过一个FORK指令被分配和激活。
(C)ThreadContext(线程上下文)寄存器(Coprocessor0 Register4,Select1)
该ThreadContext寄存器2000在每个线程上下文被例示,并且如图20所示,具有与处理器GPR是相同的宽度。这纯粹是一个软件读/写寄存器,可被操作系统用作为线程特定的存储器,例如一个线程上下文保存区域的指针。
(D)ThreadConfig(线程配置)寄存器(Coprocessor0 Register6,Select1)
该ThreadConfig寄存器在每个处理器或VPE被例示。其布局2100显示于图21。该寄存器ThreadConfig的字段在图22的表格2200中被定义。
寄存器ThreadConfig的字段WiredThread允许在一个VPE上可用的线程上下文集合在阴影寄存器集合与平行执行线程之间被划分。线程带有少于该WireThread寄存器值的索引的线程上下文可利用作为阴影寄 存器集合。
(E)ThreadSchedule(线程线程)寄存器(Coprocessor0 Register6,Select2)
寄存器ThreadSchedule是任选的,但是当被实现时,是在每个线程被实现的。其布局2300显示于图23。调度向量(如图示,在一实施例中为32位宽)为一个为相关线程的所要求的发布带宽调度的描述。在此实施例中,每一个位代表了该处理器或VPE的发布带宽的1/32,并且每一个位位置代表了在一32区间调度周期中的一相异区间。
如果在一线程的ThreadSchedule寄存器中的一位被设定,那么该线程即被保证在相关的处理器或VPE上可能的,每32个可能连续发出的一相对应发出区间的可用性。当在相同处理器或VPE上的其它某些线程具有一样的ThreadSchedule位集合时,在线程的ThreadSchedule寄存器的一位写入一个1,会产生一个线程异常。虽然在一实施例中,寄存器ThreadSchedule的宽为32位,在用于其它的实施例中,仍然有其它的宽度可以取代(例如增大宽度或是减少宽度)。
(F)VPESchedule(VPE调度)寄存器(Coprocessor0 Register6,Select3)
寄存器VPESchedule是任选的,且在每个VPE被例示。它只有当寄存器Config3的MVP位被设定时,才是可写的(请参见图29)。其格式2400显示于图24。
调度向量(如图示,在一实施例中其宽度为32位)为一个用于相关VPE的所要求的发出带宽调度的描述。在此实施例中,每一个位代表了一多VPE处理器的发出总带宽的1/32,并且每一个位位置代表了一个32个区间调度周期中的一相异区间。
如果VPE的VPESchedule寄存器中的一位被设定,那么该线程即保证了在该处理器上可能每32个可能连续发出的一对应发出区间的可用 性。当某些其它的VPE具有一样的VPESchedule寄存器位集合时,在VPE的VPESchedule寄存器中的一位写入一个1,会产生一个线程异常。
依据处理器目前缺省线程调度策略(例如循环式等),未被任何的线程特别排定的发出区间可自由地被分配给任何可运行的VPE/线程。
寄存器VPESchedule与ThreadSchedule创建了一个发布带宽分配的架构。寄存器VPESchedule寄存器的集合指定了对于VPE的带宽为在一个处理器或核心的全部可取得的一部份,同时寄存器ThreadSchedule指定对于线程的带宽为一个包含这些线程的VPE可取得的一部份。
虽然在一实施例中,寄存器VPESchedule的宽为32位,但在其它的实施例中被使用时,可尝试改变该宽度(例如增大或是减小)。
(G)Config4寄存器(Coprocessor0 Register16,Select4)
寄存器Config4是对于每一个处理器被例示的。其包含了对于动态多VPE处理器配置所需的配置信息。如果处理器并不处于一个VPE配置状态(即该寄存器Config3的VMC位被设定),则除了M(连续)字段的所有字段值与实施有关,且可能不可预测的。其布局2500描述于图25。寄存器Config4字段被定义为如图26的表格2600中所示。在某些实施例中,有用于Config3寄存器的位VMC,其可以是一个被事先保留/未指定的位。
现有特许资源架构的变更
该多线程ASE修改了当前MIPS32与MIPS64 PRA的某些元件。
(A)状态寄存器(Status Register)
状态寄存器的CU位在多线程配置中具有一些额外的意义。设定CU位的动作将一个共处理器上下文与和该CU位有关的线程结合的请求。如果一个共处理器上下文可用,则它就会与该线程结合,使该线程所发出的指令能传向共处理器,并且该CU位会保留写入该位的1值。如果没有 一个共处理器上下文可用,该CU位读回为0。写入一个0至一设定的CU位,会导致任何相关的共处理器被解除分配。
(B)原因寄存器(Cause Register)
有一个被要求用于线程异常的新的原因寄存器ExcCode值,如图27所示。
(C)低进入寄存器(EntryLo Register)
一个先前被保留的高速缓存属性变成该ITC指示符,如图28所示。
(D)配置3寄存器(Config3 Register)
有新的Config3寄存器的字段被定义表示多线程ASE与多个线程上下文的可用性,如图29的表格2900所示。
(E)E基准(Ebase)
Ebase寄存器的先前保留的位30变成在每个VPE上下文的一个VPE的禁止位,如图30所示。
(F)SRSCtl
先前预设的HSS字段现在生成为该ThreadConfig WiredThread字段的一个功能(function)。
没有FORK的线程分配与初始化
在一实施例中,一个操作系统产生一个线程“by hand(用手)”的程序如下:
1、执行一个DMT,以停止其它线程的执行或是可能的FORK指令执行。
2、通过设定ThreadControl(线程控制)寄存器的AlternateThread(替换线程)字段至连续值,,并且用MFTR指令来读取寄存器ThreadStatus来标识一可用的Thread Context(线程上下文)。一个空闲韵线程没有其ThreadStatus(线程状态)寄存器的Halted(停止)或 Activated(激活)位。
3、设定该选定线程的ThreadStatus(线程状态)寄存器的Halted(停止)位,以避免其被其它线程配置。
4、执行一个EMT指令去重新启动多线程。
5、使用MTTR指令并使其字段u设至1,以复制任何期望的GPR进入选定的线程上下文。
6、使用MTTR指令并使其字段u与字段sel设为0及rt字段设为14(EPC),以将期望的开始执行地址写入线程内部重开始地址寄存器中。
7、使用MTTR指令而将Halted位为零和Activated位为1的值写至选定的寄存器ThreadStatus寄存器。
该新分配的线程然后可被调度。如果EXL或ERL在程序期间被设定,可以跳过那些执行DMT、设定新线程的Halted位与执行EMT的步骤,如同他们隐含地禁止多线程的执行。
没有YIELD的线程终止与解除分配
在本发明的一实施例中,一个操作系统用来终止当前的线程的程序为:
1、如果操作系统不支持一个线程下溢状态下的一个线程异常,则使用指令MFTR来扫描该组ThreadStatus寄存器,以验证在处理器上有另一个可运行的线程,相反,如果没有,就对该程序发出错误的信号。
2、写入任何重要的GPR寄存器值至存储器。
3、设定寄存器Status/ThreadStatus(状态/线程状态)中的核心模式。
4、当目前的线程维持在一个特许状态时,清除EXL/ERL以允许其它线程被调度。
5、使用一个标准的MTC0指令来将Halted与Activated位为零的值 写入ThreadStatus寄存器。
该正常的程序用于一线索以这种方式终止其自己。在一个特许模式中运行的一个线程也可以使用MTTR指令来终止另一个线程,只不过,会有一个额外的问题产生,操作系统需要决定那个线程上下文应被解除分配和在那个时间点该线程的计算的状态是稳定的。
线程间的通讯储存(Ihter-Thread Communication Storage)
线程间的通讯(ITC)储存是一个任选的能力,其可以提供用于细质多线程的Load-Linked/Storage-Conditional(加载-连接/存储-状况)。这个ITC对于指令集架构是不可见的,因其通过加载与储存而被操作,但是对于特许资源架构是可见的,且它需要明显微架构支持。
参照虚拟存储器页,其TLB项目被标记为对一个有特殊属性的储存的ITC储存解决。每一个页面映像一组1-128的64位存储位置,其中每一个位置都有一个与其相关的状态Empty/Full(空/满)位,并且可以使用标准加载与储存指令,以四种方法之一比访问。该访问模式是被编码在该产生的虚拟地址的最小有效(且未被转换)位种,如图31的表格3100所示。
每一个储存位置可以用C语言的结构来描述:
struct{
unit64 ef_sync_location;
unit64 force_ef_location;
unit64 bypass_location;
unit64 ef_state;
}ITC_location;
其中,全部四个位置都参照下面存储的同样64位。同样的Empty/Full协议在每一访问的基础上被强加,对该储存的参考可有少于 64位的访问类型(例如,LW,LH,LB)。
Empty(空)与Full(满)位是不相同的,因此去耦合的多项目数据缓冲器,例如FIFO,可以被映像至ITC存储器中。
ITC存储器可通过从/至通用存储器复制{bypass_location,ef_state}而被,或者可以用复保留和恢复。严格地说,当64位的bypass_location必须被保留时,只有ef_state的最小有效位需被操作。在多项数据缓冲器的情况下,必须读取每一个位置,直到Empty基于备份把所有的缓冲器都读出。
每4K页的位置数目与每一个VPE的ITC页的数目都是VPE或处理器的配置参数。
ITC储存的“物理地址空间”可全局跨越多处理器系统中的所有的VPE与处理器,以使一个线程便可以自一个其在上执行的VPE同步到另一个不同的VPE的位置上。全局ITC储存地址可以从每一个VPE的EBase寄存器的CPUNum字段导出。该CPUNum的10个位对应到另外ITC储存地址的10个有效位。为单处理器的应用所设计的处理器或核心不需要输出一个物理接口至ITC储存,并且可以将其视为一个处理器内部的资源。
VPE处理器
一个核心或处理器可以实现多个共享资源的VPE,如同是功能性单元。每一个VPE都可以看到自己的MIPS32与MIPS64的例示和特许资源架构。每一个都可以看到自己的寄存器文件或线程上下文阵列,并且也可看到自己的CP0系统共处理器和自己的TLB状态。对于来自2-CPU高速缓存相干SMP多处理器的软件而言,在同一个处理器上的两个VPE是无法分辨的。
在处理器上的每一个VPE都可以看到CPO的寄存器Ebase的CPUNum字段中的一个不同值。
处理器架构性资源,例如线程上下文和TLB储存及共处理器,可以在硬件配置中与VPE结合,或者在一个支持所需配置能力的处理器中被动态地配置。
重置与虚拟处理器配置
为了能够反向与MIPS32与MIPS64 PRA兼容,一个可配置的多线程/多VPE处理器具有在重置时相同的缺省线程/VPE设定一样。一般的情形下都是如此,但是对于一个有单一线程上下文的单一VPE却不一定必须是要如此做。该寄存器Config3的位MVP可以在重置时被取样,以决定动态的VPE配置是否是可能的。如果这项能力被忽略,如通过传统软件,该处理器将表现为用于缺省配置的每个说明书。
如果该MVP位被设定,则寄存器Config3的虚拟处理器配置VPC(虚拟处理器配置)位就可以被软件设定。这可以使得处理器进入一个配置状态,也就是寄存器Config4的内容可以被读出,以决定可用的VPE上下文、线程上下文、TLB项目和共处理器的数目,和变为可写的配置寄存器的只读“预设”字段。有一些限定可以被强加于配置状态指令串流,例如它们可以被禁止使用高速缓存或是TLB映射的存储器地址。
在配置状态中,可配置的VPE的全部数目都被编码于该寄存器Config4的字段PVPE中。通过将其索引写入寄存器EBase的CPUNum字段,每一个VPE都可被选择。对于被选择的VPE,下列的寄存器字段都可通过写至它们而可能地被设定。
·Config1.MMU_Size
·Config1.FP
·Config1.MX
·Config1.C2
·Config3.Nthreads
·Config3.NITC_Pages
·Config3.NITC_Plocs
·Config3.MVP
·VPESchedule
并不是所有上述所提到的配置参数都需要是可配置的。举例来说,每一个页的ITC位置的数目可以是固定的,即使该每一个VPE的ITC页是可配置的,或是它们两个参数都可以被固定,浮点运算单元(FPU)皆可以对于每个VPE被预先分配及硬连线。
共处理器作为离散单元被分配至VPE。该共处理器可被多线程化的程度应经由共处理器特定的控制与状态寄存器被指示或被控制。
通过清除该寄存器EBase的VPI禁止位,一个VPE可以被启动而用于配置后的执行。
通过发出一个ECONF指令,该配置状态被退出。这个指令可以使得所有不被禁止的VPE取得一个重置异常,并且开始同时执行。如果寄存器Config3的MVP位在配置期间被清除,而且通过一个ECONF指令被锁存至零,则该VPC位就不再被设定,而且该处理器配置就会被有效的冻结,直到下一个处理器重置。如果MVP保持设定,通过再次设定该VPC位,可以使一个操作系统再次进入该配置模式。对于重新进入配置模式的一运行VPE的结果可能是不可预测的。
多线程处理器的服务品质调度
到目前为止的说明,是描述一个MIPS兼容系统的应用特定扩充,以实现多线程。如前面所述,所述的MIPS实现是示例性的,并不是限制性的。所描述的功能与机制可以应用于除MIPS系统之外的其他方面。
有关寄存器ThreadSchedule(图23)与寄存器VPESchedule(图24)的上述讨论中提出了一个问题,即用于实时和近乎实时线程的多线程中 的特殊服务遇到的问题。本说明已经尽力将此部分说明的更清楚;也更清楚的说明了以线程级服务品质(“QoS”)解决的特殊扩充。
背景
被设计用于传输多媒体数据的网络都会牵涉到服务品质(“QoS”)的概念,来描述使用不同策略来处理在网络中不同的数据串流的需要。以语音连接为例,其是相对的不对于带宽有一定的要求,但是却不能忍受几十毫秒的等待时间。在宽带的多媒体网络中,QoS协议可以保证在时间为关键要素的传输中,能取得特别的处理且优先权是需要的以确保及时传输。
产生以在单一芯片上结合“RISC”与“DSP”的程序执行的主要反对理由之一,是在组合的一个多任务的环境中,要去保证DSP程序代码的严格实时执行是非常困难的。该DSP应用可被视为具有对处理器带宽中的“QoS”要求。
多线程与QoS
有许多方式可以调度来自多线程的指令的发出。当阻挡式的调度器在每当一个高速缓存错失或其它重大停顿发生时改变线程时,交错式的调度器可以在每个周期改变线程。以上详细描述的多线程ASE提供了一个框架用于试图避免对一个特殊线程调度机制或策略有任何依赖的显然多线程化的处理器。然而,该调度策略可能有重大的影响,基于该影响,对于线程的执行,QoS保证是可能的。
如果对于实时DSP程序代码能够作出QoS保证,一个DSP扩充的RISC会变得明显地更加有用。在该处理器上实现多线程,以使DSP程序代码在不同的线程中运行,也有可能是在不同的虚拟处理器上,并且该DSP线程的硬件调度能可被程序化地决定以提供确保得QoS,逻辑地去除对 接受DSP-加强得RISC领域得关键障碍。
QoS线程调度算法
服务品质线程调度可以宽松地被定义为一组调度机制和策略,它们允许一编程器或系统体系对于一特定区间代码的执行时间作出置信的、预测性的陈述。一般来说,这些陈述都有“此程序代码将在不多于Nmax且不少于Nmin周期中执行”的形式。在许多情况下,只有Nmax数字是实际结论的数字,但是在某些应用中,在调度之前运行也会造成问题,所以Nmin也应该被仔细的考虑。Nmax数字与Nmin数字之间的范围越小则整个系统的行为就更能精确地被预测。
简单的优先权方案
已被建议用于提供一些水平的QoS给多线程发出调度的一个简单的模型是简单地将最大优先权指定给单个被指定的实时线程,因此当该线程为可运行的,则它总被选定来发出指令。这种方式可以提供一个Nmin的最小的值,或许也可提供一个Nmax的可能的最小值用于该指定的线程,但是仍然会有一些不太好的后果。
首先,在该方案中只有单一个线程可以有任何QoS保证。该算法表示了用于在一个不同于指定的实时线程的线程中的任意程序代码的Nmax会有效地变为非限制。其次,当用于指定的线程内的程序代码块的Nmin数目被最小化的时候,则异常就必须被因子分解入该模型。如果通过该指定的线程取得这些异常,则该Nmax值就会变得更复杂,并且在某种情形下,是不可能去进行确定。如果通过除该指定的线程之外的线程取得这些异常,则该Nmax的值就会被严格地用于该被指定的线程中的代码,但是该处理器的中断响应时间变成非限制的。
该优先权方案也许在某些情形下是有用的,并且在硬件的实现中也 有实际的优点,但是它们仍然没有提供一个通用的QoS调度的解决方法。
基于保留的方案
另一个更强大的且独特的线程调度模型是基于保留发布区间(issueslot)。在该方案中,其硬件调度机制允许了一个或多个线程可被指定各M个连续发布区间中的N个发布区间。此方案并没有提供用于在一个不具中断的环境中的一段实时程序代码片段的优先权方案一般低的Nmin值,可是却拥有了其它的优点。
多于一个的线程可以具有保证的QoS。
即使中断被限制于其它除了具有最高优先权之外的线程,但中断等待时间可被限定。这样可以允许用于实时程序代码区块的Nmax中的减少。
一个保留调度的简单形式指定每第N个发布区间到一个实时线程。由于在1与2之间并没有N的中间值,因此表示了在一个多线程环境中的实时线程可以取得最多50%的处理器的发布区间。当一个实时任务消耗了多于50%的嵌入式处理器的带宽时,这种可以允许更有弹性的发布带宽的指定方案是非常期望的。
具有QoS的混合式线程调度
之前所述的多线程系统采用仔细的中性调度策略,但是还可以被扩充以允许一个混合式调度模型。在此模型中,实时线程可以被给予线程发布区间某部份的固定的调度,并且具有由与实现方式相关的缺省调度方案所指定的剩余的区间。
结合线程至发布区间
在一处理器中,各指令是被快速地顺序地发出。在一个多线程的环 境当中,通过陈述在一个给定的固定的发布区间数目中每个线程发出的区间数目的比例,可以计算出每个线程消耗的带宽。相反的,本发明人认识到可以任意地声明一固定数目的区间,并断言一种限定该处理器以保留用于特定的线程的该固定数目中的某些数目的区间。然后可指定对于一实时线程被保证的一固定部分的带宽。
很清楚地,对于多于一个的实时线程,可以指定成比例的区间,并且在此方案将操作的粒性通过该比例被作出的发布区间的固定数目而被限定。举例来说,如果32个区间被选定了,则任意一个特定的线程可以被保证具有从1/32至32/32的带宽。
可能地,用于将固定的发出带宽指定给线程的最普通的模型是将每一个线程与一对整数{N,D}相关连,该对整数形成了指定给该线索的发出时间段的一分数的分子与分母,例如是1/2、4/5。如果该该允许的整数的范围够大的话,则允许对线程优先权指定的几乎任意地作细质性的调变,但是如此做的话还是会有一些实质上的缺点。其中一个问题,是将一个很大的配对集合,{{N0,D0},{N1,D1},…{Nn,Dn}}转换为一发布调度的硬件逻辑并非是普通的,且导致多于100%的区间被指定的错误情况无法非常容易的被侦测到。另一个就是,虽然此方案长远的来说指定一线程被规定有N/D部分的发布区间,其不一定允许对哪些发出区间将被指定给在一较短子集码片断,作出任何声明。
因此,在本发明的一实施例中,替代一整数对,将一个表示有这些调度区间将被分配给该线程的位向量与每一个需要实时带宽的QoS的各线程相关联。在该实施例,该向量被系统软件可视为前述寄存器ThreadSchedule(图23)的内容。虽然该ThreadSchedule寄存器包含32位宽的调度“屏蔽”,但是该屏蔽的位数在别的实施例当中可以更大或更小。一个具有32位宽度的线程调度屏蔽允许一个线程被指定是从1/32至32/32的该处理器的带宽,也可进一步的对于特定的发出线程给予特 定发出带宽。假定一个32位屏蔽,一个值0xaaaaaaaa将每隔一个的区间指定给该线程。一个0x0000ffff的值也可将50%的的发布带宽指定给该线程,但有从16个连续区间的部分的方式。指定一个0xeeeeeeee的值到线程X,并且指定一个0x01010101的值至线程Y,将每四个周期中的三个(32个中的24个)给予线索X并将每八个周期中的一个(32个中的4个)给予线索Y,并且留下一32周期的组中剩下的4个周期通过其它者,可能较少确定性的硬件算法被指定给其他线程。更进一步的说,可知一个线程X可以有每四个周期中的三个周期,且该线程Y在连续指令之间不会具有超过八个周期的间隙。
在此实施例中的调度冲突可以很简单地侦测到,其中位不会被设定给多于一个线程的该寄存器ThreadSchedule中。也就是说,如果一个特定的位设定用于一个线程,那该位对于该发出屏蔽被指定给的所有其他线程就必须是零值。因此,如果有任何的冲突,都可以被轻易地侦测到。
该用于实时线程的发出逻辑是相对的简单直接:每一个发布机会被相关连至一个模32索引,其会被传送给所有已经准备的线程,并且该线程至多有一个会被指定到该相关连的发布区间。如果有一个事件触发该区间,则该相关的线程就会发布下一个指令。如果没有任何线程拥有该区间,则该处理器会选择一个可运行的非实时线程。
寄存器ThreadSchedule的实现如果是少于32位的话,可以减少每个线程的储存与逻辑的大小,但却会同时地减少调度的弹性。原则上,该寄存器可以扩充至64位,或甚至被实现(例如在一个MIPS处理器的情形)为在MIPS3 CPO寄存器空间中以选择值递增的一系列寄存器,以提供更长的调度向量。
免除线程的中断服务
如前所述,中断服务可以在取得异常的线程的执行时间中引入巨大 的可变性。因此,期望使要求严格的QoS保证的线程能够免除该中断服务。这在每一个线程给予一个单一位的实施例中被实现,其对于操作系统是可以看见的,用来使任何产生的异步异常被延迟,直到调度一个非免除的线程(例如寄存器ThreadStatus的位IXMT,请参考图18与图19)。这样会增加中断的等待时间,仍然到通过该寄存器ThreadSchedule的值的选择而可限制和控制的程度。如果中断处理程序执行只发生在那些没有被指定到免除实时QoS线程的发布区间期间,则该中断服务对于该实时程序代码的执行时间就没有任何第一级的影响。
对线程与虚拟处理元件的在发布区间分配
之前所描述的多线程ASE描述了一个线程资源的架构分配,其中某些数目的虚拟处理元件各自具有一些数目的线程当每一个VPE具有CPO的实现与特许资源架构(当在一MIPS处理器上被配置)时,在一VPE上运行的操作系统软件(“OS”)就不可能可以直接知道和控制在另一VPE上所要求的发布区间。因此每一VPE的发布区间的命名空间即关连到该VPE,也就是形成了一个发布区间分配的架构。
图34为一调度电路3400的方框图,其描述了此线程资源的架构分配。处理器调度器3402(即该主处理器的全部调度逻辑)经一“区间选择”信号3403,传递一个发布区间号码至位于该主处理器中全部VPE中的全部VPESchedule(VPE调度)寄存器。信号3403对应于该寄存器VPESchedule中的一位的位置(在本实施例中即为该三十二个位置中的一个)。调度器3402重复地循环该信号3403通过这样的位的位置,在每个发生的发布区间时移至一个增加的位置,并且当到达了最大有效位位置时(即在此实施例中是第三十一位)再重置到最小有效位位置(即零)。
参照图34,以此图为例,位的位置1(即“区间1”)是经由信号3403 传递至该主处理器内全部的寄存器VPESchedule,即寄存器3414和3416。任何具有对应位“设置”(即保持一逻辑1)的寄存器VPESchedule将此情况通知给具有“VPE发布请求”信号的该处理器调度器。作出响应,该调度器就会用一个“VPE发布允许”的信号来允许该VPE使用目前的发布区间。再参照图34,(VPE0中的)寄存器VPESchedule 3414有一个设定的位的位置1,而因此发出了一个VPE发布要求信号3415至该处理器调度器3402,该处理器调度器3402以VPE发布允许信号3405表示回应。
当一个VPE被允许一发布时,在VPE级上采用相类似的逻辑。再参照图34,VPE调度器3412(即VPE0的调度逻辑)响应于该信号3405,经由区间选择信号3405提供了一个发布区间号码给在该VPE内的全部ThreadSchedule寄存器。这些寄存器ThreadSchedule每一个都关连至一个被该相关的VPE所支持的线程。信号3413对应于该寄存器ThreadSchedule中的一个位位置(在本实施例中可以是三十二个位置中的一个)。调度器3412重复地循环该信号3413通过这些位置,在每个发布区间发生是提高该位置,并且当到达了最大有效位位置后(在此较佳实施例中是第三十一位),再重置到最小有效位位置(即零)。该区间号码与在该VPESchedule级所使用的区间号码无关。
请参照图34并以其为例,位位置0(即“区间0”)是经由信号3413传输至在该目标VPE内的全部寄存器ThreadSchedule,也就是寄存器3418与3420。任何在其寄存器ThreadSchedule的选定位置有一设定位的线程向该VPE调度器指出该情况,且表示该线程被允许使用目前的区间。参照图34,(线程0的)寄存器ThreadSchedule3418具有设定的位位置0,并且也因此传送线程发布要求信号3419至该VPE调度器3412,而该VPE调度器3412以一个线程发布允许信号3417作为回应(所以允许线程0可以使用目前的发布区间)。在没有VPE调度器位被设定 用于被指示的区间,或是没有ThreadSchedule位被设定用于被指示的区间的周期上,则该处理器或是VPE调度器就会根据一些其它缺省调度算法来允许下一个发布。
根据上述,在一实施例当中,每一个VPE,以图34的VPE0(3406)与VPE1(3404)为例,都被指定一个寄存器VPESchedule(其格式显示于图24中),其允许某些区间,这些空间以其寄存器内容的长度的模数来计算,可以被确定地指定到该VPE。图34的寄存器VPESchedule为VPE0的寄存器3414与VPE1的寄存器3416。其它没有被指定到任何VPE的发布区间通过实现特定分配策略被指定。
另外根据前面所描述,被指定给一个VPE中的线程的区间是从给予该VPE的分配被指定的。例如,如果一个处理器有两个配置的VPE,如图34所示,一个VPE具有包含0xaaaaaaaa的值的寄存器VPESchedule,且另一个VPE具有包含0x55555555的寄存器VPESchedule,则该发布区间就会在这两个VPE之间被交替。如果在这些VPE其中之一的一线程有一个包含0x55555555的寄存器ThreadSchedule,则其会取得包含它的VPE的每隔一个的发布区间,或者是说在整个处理器的每隔三个的发布区间。
因此,该与每一个VPE相关的寄存器VPESchedule的值决定了哪些正在处理的区间会分配给各VPE。特定的线程会被指定到每一个VPE,例如是显示在VPE0中的线程0与线程1。其它没有显示的线程也类似地被指定给VPE1。有与每个线程相关连的寄存器ThreadSchedule,例如用于线程0的寄存器3418与用于线程1的寄存器3420。该寄存器ThreadSchedule的值决定了被指定到一个VPE的每个线程的正在处理的区间的分配。
调度器3402与3412可以用简单的组合逻辑来构成,以实现上述功能,并且建构这些调度器,通过之前的描述当中并不需要复杂的实验就 能够由本领域的熟练技术人员来实现。例如可使用一些已知方法,例如是用组合逻辑、可编程逻辑、软件等等来构成以实现所需要的功能。图33描述了用一个通用形式的计算机系统3300,本发明的许多实施例可以通过该计算机系统来实施。该系统包含了一个处理器3302,其配置有所需的解码与执行逻辑(这对本领域的熟练技术人员而言是显见的),以支持一个或多个上述所提过的指令(即FORK、YIELD、MFTR、MTTR、EMT、DMT与ECONF)。在一实施例当中,核心3302还包括了如图34所显示的调度电路3400,并且也代表了如上述的“主处理器”。系统3300还包括了一个系统接口控制器3304,其可以双向地与该处理器沟通;还有可被该系统接口控制器所访问的随机存取存储器(RAM)3316与只读存储器(ROM)3314;更有三个输入/输出装置3306、3308与3310,其由一个总线3312与该系统接口控制器通信。虽然该装置的应用与程序代码都已经在这里被详细描述,该系统3300仍可以作为一个多线程系统进行工作。显然本领域的熟练技术人员可以对图33的普通形式作出许多修改。举例来说,该总线3312可以有许多的形式来实现,并且在某些实施例当中可以是单片总线。同样的该输入/输出装置的数目也只是示例性的,实质上是可以在不同的系统上有不同的数目。更进一步言,虽然在图中只有元件3306发出了一个中断要求,很明显地其它的装置也可以发出中断要求。
更进一步的改善
到目前为止,所描述的实施例用于32位的寄存器ThreadSchedule与VPESchedule,并不允许完全奇数分数的带宽的分配。期望只分配三分的一的所有发布区间至一个给定的线程的编程器不得不接近10/32或11/32。在一个实施例中,一个更进一步的可程序屏蔽或长度寄存器允许编程器去规定位于寄存器ThreadSchedule和(或)寄存器VPESchedule 中的位的一个子集重新开始该序列前由该发布逻辑所使用。在所提出的例子当中,该编程器仅规定了30个位是有效的,并且以0x24924924来编程适当的寄存器VPESchedule及/或寄存器ThreadSchedule。YIELD(产出)—取消调度以及有条件地解除分配一线程(第二实施例)
参考图35,一方框图显示本发明另一实施例中YIELD指令3500的格式。图35的YIELD指令3500类似于图6的指令600;然而,图35的YIELD指令3500有两个不同之处。第一,rs字段3502所规定的在寄存器中所储存的值的含义有些不同,如下述。第二,图35的YIELD指令3500亦包含一第二操作数字段rd 3504。在图35的实施例中,rd操作数字段3504包含YIELD指令3500的位11到15。rd操作数字段3504规定了一目的地寄存器(如6PR),其接收YIELD指令3500完成时的一结果值,如下述。
参考图36,显示本发明图35的另一实施例中,执行YIELD指令3500的一处理器核心3302的方框图。图36的处理器核心3302类似于图33的系统3300的处理器核心3302。处理器核心3302包含图34的一调度器3400。处理器核心3302亦包含由图35的rs字段3502所规定的一寄存器rs 3602、由图35的rd字段3504所规定的一寄存器rd 3604、一寄存器YQMask 3606、一三十一个二输入与门单元3608以及控制逻辑3612。
处理器核心3302接收三十一个YIELD限定(qualifier)(YQ)输入3614,以YQ0到YQ30表示。YQ输入3614可接收处理器核心3302以外的电路所产生的信号,其包含但不限于I/O装置(例如图33的I/O装置3306)所产生的中断信号。YQ输入3614亦接收处理器核心3302内部所产生的信号,其包含但不限于软件中断信号以及高速缓存遗失信号。再者,YQ输入3614可接收处理器核心3302外部及内部所产生的信号的结 合。在一实施例中,一信号源可与一YQ输入3614及处理器核心3302的一中断输入两者连接。在另一实施例中,一或多个YQ输入3614可能不与一信号源连接,而是与适当的一逻辑1或0值连接。
参考图37,一方框图显示图36的寄存器YQMask 3606的格式。寄存器YQMask 3606是一三十二位寄存器。位31为零。位0至30包含一屏蔽字段3702。屏蔽字段3702是可由软件(例如操作系统)编程的一位向量,其规定哪一个YQ输入3614可用作为重新调度发布YIELD指令3500的线程的状况。具体而言,若一YIELD指令3500规定在寄存器YQMask 3606中没有规定的一YQ输入3614,则处理器核心3302产生一异常,如下述。在一实施例中,寄存器YQMask 3606是逐VPE被定义的。
参考图36,每一与门3608在其一输入上接收一相对应的YQ输入3614。每一与门3608在其的其它输入上接收储存于寄存器YQMask 3606中三十一位向量中的一对应的位。与门3608的三十一个输出位被提供作为一位向量以在YIELD指令3500完成时,储存于rd寄存器3604中。寄存器rd 3604结果值在体系上被定义具有与YQ输入3614相同的字节组织及位置,如图37所示。
寄存器rs 3602储存应重新调度发布YIELD指令3500的线程的情况的描述符,已如前述。更具体而言,若其包含一正值,则寄存器rs 3602会规定YQ输入3614的一位向量。当在rs 3602位向量中规定的YQ输入3614之一为真时,处理器核心3302会重新调度该线程。
控制逻辑3612接收YQ输入3614、寄存器YQMask 3606的内容以及寄存器rs 3602的内容。控制逻辑3612可包含但不限于结合型或序列型逻辑、可编程逻辑、软件及其类似者,被配置以执行在此所描述的功能。控制逻辑3612产生一异常信号3622、一终止线程信号3624、一暂停线程信号3626以及一重调度线程信号3628,所有这些信号被提供给调度器3400。在一实施例中,控制逻辑3612及调度器3400可被整合为一。
异常信号3622表示YIELD指令3500已产生一异常。在一实施例中,若寄存器rs 3602位向量值规定一YQ输入3614,其在寄存器YQMask 3606中的对应位是空白(clear),则YIELD指令3500产生一异常。在一实施例中,若YIELD指令3500规定线程将被终止(即通过一零寄存器rs3602值),但发布YIELD指令3500的线程不是一动态可分配的线程(即线程是一线连的线程),则YIELD指令3500产生一异常。在一实施例中,若YIELD指令3500规定该线程将被终止(即经过一零寄存器rs 3602值),但没有其它线程可供重新调度,则YIELD指令3500产生一异常。
终止信号3624表示发布YIELD指令3500的线程应被终止或解除分配。处理器核心3302是通过停止从线程获取及发布指令,以终止或解除分配一线程。再者,处理器核心3302会释放先前分配用于该线程执行的硬件状态或资源,即线程上下文,其中该线程被释放的硬件状态可供另一线索分配。在一实施例中,硬件资源可包含但不限于一程序计数器寄存器、一组通用寄存器、乘法结果寄存器及/或一或多个特许系统共处理器资源,包含但不限于图15中所示的寄存器的某些部分。
暂停信号3626表示发布YIELD指令3500的线程将被暂停或阻挡。处理器核心3302通过停止获取及发布来自该线程的指令,来暂停或阻挡一线程。
重新调度信号3628表示发布YIELD指令的线程将被重新调度。处理器核心3302根据线程调度策略,通过指定可供执行的线程,来重新调度一线程。意即,处理器核心3302将该线程加入目前准备用于执行的线程清单中,使得当调度器3400如此规定时,处理器核心3302将开始从线程的程序计数器获取并发布指令。
参考图38,一流程图显示根据本发明的图36的处理器核心3302的操作,以执行图35的另一实施例的YIELD指令3500。流程开始于决定方块3802。
在决定方块3802,图36的控制逻辑3612检查寄存器rs 3602,以决定其数值是否为零。若是,则流程进行到方块3804;否则,流程进行到决定方块3806。
在方块3804,控制逻辑3612在图36的终止信号3624产生一真值,导致该线程被终止。意即,不重调度此线程,该线程的上下文被解除分配。并释放用于由随后FORK指令300进行分配。在一实施例中,若YIELD指令3500导致该线程被终止,且没有其它的线程可供调度,则处理器核心3302会产生一异常。在一实施例中,若处理器核心3302终止该线程,则无数值返回到寄存器rd 3604。流程在方块3804结束。
在决定方块3806,控制逻辑3612检查寄存器rs 3602,以决定其数值是否为负一(-1)。若是,则流程进行至方块3818;否则,流程进行到方块3808。
在方块3808,控制逻辑3612将储存于寄存器rs 3602的位向量与储存于寄存器YQMask 3606的位向量作比较。在一实施例中,除了寄存器rs-1以外的rs寄存器3602的负值会被保留;因此,在方块3808,已知储存于寄存器rs 3602的数值是正值。流程进行到决定方块3812。
在决定方块3812,控制逻辑3612决定设定于寄存器rs 3602的位0到30的任何一位,是否在寄存器YQMask 3606中具有一对应位是空值。若是,则流程进行至方块3814;否则,流程进行至决定方块3816。
在方块3814,控制逻辑3612在异常信号3622上产生一真值,以表示线程规定一无效YQ输入3614。流程在方块3814结束。
在决定方块3816,控制逻辑3612检查YQ输入3614,以决定寄存器rs 3602上的一组位所规定的所有YQ输入3614是否为假。若是,则流程回到决定方块3816,控制逻辑3612继续在暂停信号3626上产生一真值,以使线程维持暂停状态,直到寄存器rs 3602中的一组位所规定的YQ输入3614之一为真。否则,流程进行到方块3818。
在方块3818,控制逻辑3612在图36的重新调度信号3628上产生一真值,导致调度器3400重新调度该线程。意即,该线程在下一个机会有资格进行调度,但会要求调度器3400并放弃用于其他线程的处理器核心3302,根据调度器3400的调度策略,该其它线程应首先执行。流程进行至方块3822。
在方块3822,处理器核心3302将由寄存器YQMask 3606值屏蔽的YQ输入3614的信号值(即图36的与门的输出),储存在寄存器rd 3604。在一实施例中,在处理器核心3302重新试YIELD指令3500的时候,YQ输入3614信号值被取样。流程在方块3822结束。
在一实施例中,处理器核心3302不在包含YIELD指令3500的线程中发布指令,直到在方块3818重新调度线程后,调度器3400开始执行其线程为止。
虽然图35-40描述一实施例,其中对YIELD指令3500的输入操作数是提供于一通用寄存器(即寄存器rs 3602),但在其它实施例中,可通过其它方式提供输入操作数,例如通过一存储器或通过一非通用寄存器。举例而言,虽然实施例已描述处理器3302是一基于寄存器的处理器,但其它实施例亦可使用一基于堆栈的处理器,例如被配置以有效地执行Java虚拟机器码的处理器。在这样的实施例中,YIELD指令3500的输入操作数可规定于存储器中的操作数栈,以取代在寄存器中。举例而言,每一线程上下文可包含一栈指针寄存器,YIELD指令3500的一字段可将与堆栈指针寄存器相关联的YIELD输入操作数的一偏移规定在堆栈存储器中,以取代规定处理器的暂存空间中的一寄存器。类似地YIELD指令3500返回值可返回给一操作数栈,以取代返回给一寄存器。
如前述,本发明的YIELD指令3500有利地提供用于根据rs 3602输入操作数的数值,有条件地终止线程的方法。在一平行或多线程的计算中,执行一线程的终止条件可在运行时间被计算。举例而言,一回路 (loop)可测试欲满足的一组条件,并根据此测试,选择性地终止此回路。目前YIELD指令3500允许线程执行在寄存器rs 3602中产生零或负一的值的计算接着线程执行一YIELD指令3500在寄存器rs 3602值上,以终止(数值为零)或继续(数值为负一),并分支回到回路的顶部。虽然以附加的比较及分支指令亦可达到相类似效果,但基于当前状况值的YIELD指令3500使多线程码更为精简,并更为有效地在微处理器100的流水线中执行。
如前述,通过程序化寄存器YQMask 3606,并以一特定方式使用寄存器rd 3604返回值,一程序可执行一阻挡YIELD指令3500的操作两个潜在有用的仿真。
首先,即使待连接到YQ输入3614的信号的硬件来源并不存在,但是一操作系统仍可仿真在一特定YQ输入3614上阻挡的YIELD指令3500的操作,而不用改变应用程序。在开发硬件信号源或在原型开发期间,此仿真对测试应用程序是有用的。操作系统可编程寄存器YQMask 3606,以清除对应不存在的YQ输入3614的位使得在寄存器3602中具有对应位的一YIELD rd,rs 3500导致一异常。响应此异常,操作系统会暂停此线程,直到适合仿真「虚拟」YQ输入3614为真。在此时刻,操作系统会将YIELD指令3500的rd字段3504解码,以决定哪一寄存器被选为寄存器rd 3604、写入一适当的值至寄存器rd 3604、推进线程的程序计数器至紧接在YIELD指令3500之后的指令、并重新开始线程的执行。对应用程序而言,看起来YIELD指令3500好象被阻挡、等待、并重新调度,以响应规定的YQ输入6314上的一真值。再者,当从一处理器核心3302将线程移到另一个处理器核心(例如在多个处理器核心3302之间执行负载平衡)时,操作系统可使用寄存器YQMask 3606以确保程序作业。
第二,通过阻挡一YIELD指令3500的执行,直到寄存器rs 3602所规定的一组YQ输入3614为真值,一应用程序可清楚地在软件中仿真处 理器核心3302在硬件中执行的作业。软件仿真是类似对于一中断的程序轮询(polling),而非以允许硬件移转执行至中断服务例程来响应一中断请求。在正常情况下(即非仿真的情况),假设寄存器YQMask 3606具有一或多个位及一YIELD rd,rs 3500会在rs寄存器3602中的对应位被设定时被执行。处理器核心3302将会暂停发布YIELD指令3500的线程,直到所规定的YQ输入3614之一是真。为了仿真此作业,一程序储存一位向量在寄存器YQMask 3606,规定所讨论的YQ输入3614组。此程序发布一YIELD rd,其中寄存器rs 3602的数值是-1的rs3500导致线程被重新调度而不被阻挡。当完成YIELD指令3500时,寄存器rd 3604中的返回值将会包含规定于寄存器YQMask 3606中的YQ输入3614信号值。应用程序接着测试返回值,若为零,则环路回到YIELD指令3500,直到返回值不为零。因此,规定一寄存器rs 3602值为-1的YIELD指令3500,会成为轮询或取样原本处理器核心3302硬件会使用的YQ输入3614,以阻挡发布YIELD指令3500的线程的执行的方法。需要知道的是程序线程的执行仍会根据所规定的实际YQ输入3614而受到控制;然而,线程的硬件阻挡会由程序本身,而非处理器核心3302进行仿真。
参考图39,一方框图显示一处理系统3300(例如图33的处理系统3300),其包含图36的处理器核心3302,用于根据本发明的图35的另一实施例执行一YIELD指令3500。系统3300包含信号源3908,其产生信号3912,例如但不限于图33的I/O装置3306所产生的中断请求信号。
系统3300还包含一YQ输入管理单元3902。YQ输入管理单元3902包含31个YQ映像寄存器3906,控制对应的多路复用器3904。图39的实施例显示三个YQ映像寄存器3906,标示为YQ映像寄存器03906、YQ映像寄存器1 3906以及YQ映像寄存器30 3906,其对应的多路复用器3904输出被分别与YQ输入0 3614、YQ输入1 3614以及YQ输入30 3614连接。每一多路复用器3904接收来自信号源3908的所有信号3912,并 根据其对应的YQ映像寄存器3906所提供的一选择输入,选择信号3912之一提供给其对应的YQ输入3614。在一实施例中,YQ映像寄存器3906通过在处理器核心3302上执行的一程序是可编程的。在一实施例中,YQ输入管理单元3902被包含在处理器核心3302中,而非在处理器核心3302的外部。在另一实施例中,YQ输入管理单元3902被包含在处理器核心3302的一共处理器中。
参考图40,一方框图显示根据本发明的图35的另一实施例的一替换实施例中,图35的YIELD指令3500的rs字段3502中所规定的寄存器rs 3602的语义。图40的实施例是适用于一处理器核心3302中,该处理器核心3302仅接收四个图36的YQ输入3614,而非31个。此四个YQ输入3614是根据被编程到类似图39的YQ输入管理单元之一YQ输入管理单元3902中的数值而被选择。在一实施例中,YQ输入管理单元3902被包含在处理器核心3302的一共处理器中。在一实施例中,每一线程上下文包含一YQ输入管理单元3902。
寄存器rs 3602是分为八个四位的字段。其中四个字段是反屏蔽字段,标示为INV3、INV2、INV1以及INV0。四个字段是与启动(AND-enabling)项字段,标示为AND3、AND2、AND1以及AND0。图40中所显示的表格描述每一个字段。
控制逻辑3612包含根据寄存器rs 3602值,执行以下YQ输入3614操控的电路。四个YQ输入3614值会被带到四组独立的XOR门组,该四个YQ输入3614值对信号3912的映像由YQ输入管理单元3902所控制,而位于对应INVx字段的位被反转以建立一调节的(conditioned)高有效值组。一独立的n路AND(与)单元提供给四个调节的限定中的每一者,其中由相关的ANDx字段所选择的该组位是与一隐式1与在一起(即若仅设定有一ANDx位,则输出追踪对应的输入)以产生四个选通的限定中的一个。四个选通的限定然后被OR(或)在一起。若结果不为零,则 控制逻辑3612在重调度信号3628上产生一真值,以重新调度此线程。
在一实施例中,储存于寄存器rd 3604中的返回值,是四个选通的限定值的一向量。在一实施例中,返回值会储存于寄存器rd 3604的最低有效位中。在另一实施例中,返回值会向左移两个位,以产生一地址偏移,根据重新调度的原因,实现一软件切换。
如同在图35的实施例中,一零寄存器rs 3602值会导致线程被终止。然而,为了以-1达到图35中所规定的线程的无条件式重调度,寄存器rs 3602是以利用INV及AND屏蔽值被编程以产生用于4个YQ输入3614的任何“A”输出的(A)|(-A)。
虽然各实施例已描述31个YQ输入3614被提供以及一32位的架构被说明,但在此所描述的YIELD指令3500并不限于这些实施例,而是可增加或减少输入的数目及寄存器的大小。
在此所描述的多线程ASE自然可以硬件实施(例如在一中央处理单元“CPU”、微处理器、微控制器、数字信号处理器、处理器核心、单片系统“SOC”、或其它可编程装置中或与其连接)。再者,多线程ASE可以配置于存储该软件的例如一计算机可使用(例如可读取)媒体中的软件(例如计算机可读取程序代码、程序代码、或以任何形式存在的指令及/或数据,如来源、对象或机器语言)来实现。此软件实现在此所描述的装置及过程的功能、制造、模块化、仿真、描述及/或测试。举例而言,此可通过一般编程语言(如C、C++)、GDSII数据库、包含Verilog HDL、VHDL、AHDL(Altera HDL)的硬件描述语言(HDL)等等、或其它可使用的程序、数据库及/或电路(即图型)捕获工具的使用而实现。此软件可配置于任何已知计算机可使用的媒体,例如半导体、磁盘、光盘(例如CD-ROM、DVD-ROM等)且作为包含于一计算机可使用(例如可读取)的传输媒体(例如载波或任何其它媒体,包括基于数字、光学或模拟的媒体)中的计算机数据信号。这样,软件可通过通讯网络(包含网际网络 及内部网络)被传输。
以软件体现的一多线程ASE可被包含于一半导体知识产权核心,例如一处理器核心(例如以HDL体现的),并在集成电路的制做中被转换为硬件。再者,在此所描述的多线程ASE亦可以一硬件及软件的结合实施。
本领域的熟练技术人员显然了解在此所描述的实施例可做许多的变化,而不偏离本发明的精神及范围。举例而言,使用MIPS处理器、架构及技术描述的实施例被说明为特定实施例。在许多实施例中本发明可更广泛地应用,且并不限定在这些范例。再者,本领域的熟练技术人员可找到不同的方法,将上述的功能已不同的方式编程实现,这些方法皆应包含于本发明的范围内。在相对QoS的教示中,寄存器ThreadSchedule及VPESchedul3的内容并不受长度的限定,且许多改变可包含于本发明的精神及范围。
因此,本发明仅限定于以下的权利要求书的范围。
最后,本领域的熟练技术人员当知其可以容易地使用所述的概念及具体实施例作为设计或修改其它结构以实施相同发明目的的基础,而不偏离下述权利要求所界定本发明的范围及精神。