掌桥专利:专业的专利平台
掌桥专利
首页

通过硬件加速内核线程进行微线程控制的处理器架构

文献发布时间:2024-04-18 19:54:45


通过硬件加速内核线程进行微线程控制的处理器架构

相关申请的交叉引用

本申请要求2020年11月16日提交的美国临时申请序列号63113986的优先权和权益。前述申请的所有内容特此出于所有目的通过援引并入本文。

技术领域

本发明总体上涉及一种处理器系统,并且具体地涉及一种通过硬件加速内核线程进行微线程控制的处理器系统和其线程调度方法。

背景技术

实时多线程是如通信、金融、汽车、工业和无人机等许多嵌入式应用需要的共同特征。虽然实时操作系统(RTOS)可以通过软件支持实时多线程,但由于线程调度开销比较大,因此延迟很大。当架构扩展到多核时,这个问题会更加严重。虽然全硬件实施方式可以最小化用于线程调度的指令数量,但是硬件复杂性的增加对时钟频率具有负面影响。此外,这种解决方案无法随着硬件线程和处理核数量的增加而扩展。鉴于这些限制,本披露内容提出了一种独特的多核架构,其旨在提供可扩展性以调度在许多处理器核中运行的许多线程。

发明内容

鉴于上述背景技术,提供了一种通过硬件加速内核线程进行微线程控制的处理器系统和其线程调度方法。

在一个示例实施例中,提供了一种处理器系统。所述处理器系统包括至少一个处理器核和与所述至少一个处理器核连接的互斥处理单元(mutex processing unit)。每个处理器核提供用于并行执行的内核线程和多个用户线程,并且每个处理器核包括内核触发模块(kernel trigger module),所述内核触发模块被配置成监测一组触发条件并基于所述一组触发条件生成内核触发指示符(kernel triggering indicator)以激活所述处理器核中的所述内核线程。所述互斥处理单元被配置成从每个处理器核接收多个互斥请求,解析互斥依赖性,并且向每个处理器核广播多个互斥响应。所述多个互斥请求中的每一个互斥请求旨在创建互斥响应,从而影响所述至少一个处理器核中的至少一个用户线程的执行状态,以便当处理器执行从一个用户线程切换到另一个用户线程时提高线程调度效率。

在另一个示例实施例中,提供了一种用于在处理器系统中调度内核线程和用户线程的方法,所述处理器系统包括至少一个处理器核以及互斥处理单元。所述方法包括:由所述互斥处理单元接收源自所述至少一个处理器核中的特定用户线程的至少一个互斥请求,所述至少一个互斥请求请求影响所述处理器核中的至少一个处理器核中的至少一个用户线程的执行状态,其中,每个互斥请求指示所述请求处理器核的标识;由所述互斥处理单元解析所述至少一个互斥请求之间的互斥依赖性;由所述互斥处理单元为所述至少一个互斥请求生成至少一个互斥响应,其中,所述至少一个互斥响应包括所述至少一个处理器核的标识,并且导致所述至少一个处理器核中的一组触发条件发生改变,其中,所述一组触发条件在被满足时将激活所述处理器核中的至少一个处理器核中的内核线程;由所述互斥处理单元向每个处理器核广播所述至少一个互斥响应;由每个处理器核确定所述广播的互斥响应中的标识是否与其自身的标识相匹配;响应于所述广播的互斥响应中的标识与所述请求处理器核的标识相匹配,由所述请求处理器核的内核触发模块生成内核触发指示符以基于所述一组触发条件来激活所述请求处理器核的内核线程;以及由所述请求处理器核的内核线程执行内核线程程序以将执行控制从所述特定用户线程传递到另一个用户线程。

在另一个示例实施例中,提供了一种用于在处理器系统中的处理器核处调度内核线程和用户线程的方法,所述处理器系统包括互斥处理单元和至少一个包括内核触发模块的处理器核。所述方法包括以下步骤:由所述内核触发模块监测一组触发条件;当满足所述触发条件之一时,由所述内核触发模块为所述处理器核生成内核触发指示符,所述内核触发指示符指定要在所述处理器核中执行的特定用户线程;激活所述内核线程以运行内核线程程序;以及由所述内核线程程序发起执行所述特定用户线程。

上述示例实施例具有优于传统技术的益处和优势。例如,所提供的处理器架构和线程调度方法显著降低了线程调度开销并加速了线程操作。因此,这极大地有利于各种实时应用程序,尤其是所有类型的RTOS应用程序。同时,在多个处理器核中调度大量线程的可扩展性得到了提高。

附图说明

通过以下参考附图的详细描述,本发明的实施例的上述和其他特征、优点和方面将变得更加明显。在附图中,相同或相似的附图标记表示相同或相似的元件,其中:

图1示出了根据本披露内容的实施例的通过硬件加速内核线程进行微线程控制的处理器系统架构的图;

图2示出了根据本披露内容的一些实施例的图1的处理器系统架构中的处理器核的图;

图3示出了根据本披露内容的一些实施例的内核触发模块中的状态评估模块的示例性实施方式的图;

图4更详细地示出了根据本披露内容的一些实施例的互斥处理单元的图;

图5示出了根据本披露内容的一个实施例的互斥处理单元处理互斥请求的过程;

图6展示了根据本披露内容的实施例的用于特定用例的互斥处理单元处的过程的时序图;

图7示出了根据本披露内容的一些其他实施例的互斥处理单元的图;

图8是示出根据本披露内容的一些实施例的处理器核的统一缓存访问接口的图;以及

图9示出了根据本披露内容的一些实施例的处理器核中的上下文切换的示例过程。

具体实施方式

如本文和权利要求中所使用的,“包含(comprising)”意指包括以下要素,但是不排除其他要素。术语“基于(based on)”应被理解为“至少部分地基于(based at least inpart on)”。术语“一个示例实施例”和“示例实施例”应被理解为“至少一个示例实施例”。术语“另一个实施例”应被理解为“至少一个其他实施例”。

如本文和权利要求中所使用的,“内核线程(kernel thread)”是指在内核级管理的一类处理线程,并且“用户线程(user thread)”或“线程(thread)”是指由程序员和用户用来处理程序内多个控制流的实体。内核线程可以调度下一个用户线程。在整个说明书中,“线程”和“用户线程”可以互换地使用。

如本文和权利要求中所使用的,“互斥锁(mutex lock)”或“互斥(mutex)”是指当有许多线程在执行时对资源的访问实施限制或约束的机制,其中,锁被设计成实施互斥并行控制策略。

如本文和权利要求中所使用的,“处理器核(processor core)”是指多核处理器或处理器系统中的单个处理单元(也称为核)。在一些实施例中,处理器核是RISC(精简指令集计算机)核。

如本文和权利要求中所使用的,“逻辑一(logical one)”和“逻辑零(logicalzero)”是指关系运算符和布尔运算符的逻辑值。

如本文和权利要求中所使用的,“用户线程的执行状态(execution status ofauser thread)”是指用户线程可以在其生命周期期间执行的状态,如可运行、阻塞、等待、定时等待、运行、终止等。在一些实施例中,当用户线程不在运行时,其被认为是不激活(inactivated)的,并且当其被启动或创建时,其被认为是激活的。

如本文和权利要求中所使用的,除非另有说明,否则“耦合(couple)”或“连接(connect)”是指经由一个或多个电装置直接或间接地电耦合或连接。在一些实施例中,不同部件之间的连接是经由电线或总线。

本披露内容提出了一种具有硬件加速的实时内核触发器的独特架构,其目的在于提供可扩展性以利用硬件-软件协同设计架构加速线程操作来调度在一个或多个处理器核中运行的许多线程。可以单独或组合实践以下示例实施例以提供用于处理器系统中的多线程的方法和系统,所述处理器系统包括具有根据本披露内容的独特架构的至少一个处理器核。

根据本披露内容的第一方面,提供了一种处理器系统。在一个示例实施例中,所述处理器系统包括:至少一个处理器核和与所述至少一个处理器核连接的互斥处理单元。每个处理器核提供用于并行执行的内核线程和多个用户线程,并且每个处理器核包括内核触发模块,所述内核触发模块被配置成监测一组触发条件并基于所述一组触发条件生成内核触发指示符以激活所述处理器核中的所述内核线程。所述互斥处理单元被配置成从每个处理器核接收多个互斥请求,解析互斥依赖性,并且向每个处理器核广播多个互斥响应。所述多个互斥请求中的每一个互斥请求旨在创建互斥响应,从而影响所述处理器核中的至少一个处理器核中的至少一个用户线程的执行状态,以便当处理器执行从一个用户线程切换到另一个用户线程时提高线程调度效率。

在一些实施例中,每个处理器核中的内核线程被配置成在被内核触发指示符激活之后,基于以下各项来调度下一个用户线程:(1)处理器核中的用户线程的优先级,(2)用户线程的执行状态以及(3)对用户线程的多个互斥响应。

在一些实施例中,所述触发条件包括以下条件之一:分配给当前运行的用户线程的时间段已到期;出现比所述当前运行的用户线程优先级更高的用户线程;以及所述当前运行的用户线程不激活。

在一些实施例中,每个处理器核进一步包括:线程请求寄存器(thread requestregister)、多个优先级寄存器(priority register)和互斥寄存器(mutex register)。所述线程请求寄存器被配置成保存每个用户线程的状态,其中,所述线程请求寄存器中的每个位(bit)与一个用户线程相对应,并且在该用户线程将被激活时被设置为逻辑一,否则被设置为逻辑零。所述多个优先级寄存器被配置成保存每个用户线程的优先级,其中,每个优先级寄存器中每个位的位置与一个用户线程相对应,并且所述多个优先级寄存器中相同位位置中的位值的组合对特定优先级进行编码。所述互斥寄存器被配置成对于每个用户线程,保存其与互斥锁或条件变量相关联的状态,其中,所述互斥寄存器中的每个位与一个用户线程相对应,并且在该用户线程处于未解析的互斥依赖性下时被设置为逻辑零,否则被设置为逻辑真(logical true)。

在一些实施例中,每个优先级寄存器与特定优先级相对应,并且在该用户线程被指派了与对应优先级寄存器中的所述特定优先级相同的优先级时被设置为逻辑一,否则被设置为逻辑零。每个处理器核进一步包括状态评估模块(status evaluation module),所述状态评估模块包括多个逻辑门(logic gate)、线程选择器(thread selector)和优先级检测器(priority detector)。所述多个逻辑门被配置成对所述线程请求寄存器、所述多个优先级寄存器和所述互斥寄存器进行逐位(bitwise)运算,以输出以下各项:(i)第一组逐位“与”(AND)值,其中,所述第一组进一步包括多个子组,并且每个子组与对所述线程请求寄存器中的第i位、所述互斥寄存器中的第i位和一个特定优先级寄存器中的第i位进行的逐位”与”运算相对应,其中,第i位与所述处理器核中的第i个用户线程相对应;以及(ii)第二组“或”(OR)值,其中,“或”运算的每个输入与所述逐位“与”值的一个子组相对应。所述线程选择器被配置成接收所述第一组逐位“与”值,并且输出指示当前运行的用户线程是否不激活的第一信号。所述优先级检测器被配置成接收所述第二组“或”值,并且输出指示是否存在比所述当前运行的用户线程优先级更高的可运行用户线程的第二信号。

在一些实施例中,所述状态评估模块包括:多个逻辑门,所述多个逻辑门被配置成对所述线程请求寄存器、所述多个优先级寄存器和所述互斥寄存器进行逐位运算,以输出以下各项:(i)第一组逐位“与”值,其中,所述第一组进一步包括多个子组,并且每个子组与对所述线程请求寄存器中的第i位、所述互斥寄存器中的第i位和来自从经编码优先级位值产生特定优先级的解码器的第i位进行的逐位“与”运算相对应,其中,第i位与所述处理器核中的第i个用户线程相对应;以及(ii)第二组“或”值,其中,“或”运算的每个输入与所述逐位“与”值的一个子组相对应;线程选择器,所述线程选择器被配置成接收所述第一组逐位“与”值,并且输出指示当前运行的用户线程是否不激活的第一信号;以及优先级检测器,所述优先级检测器被配置成接收所述第二组“或”值,并且输出指示是否存在比所述当前运行的用户线程优先级更高的可运行用户线程的第二信号。

在一些实施例中,每个处理器核的内核触发模块被进一步配置成通过所述线程请求寄存器的对应位接收从外围控制器、内部DMA、跟踪缓冲器、专用硬件加速器的中断、异常和缓冲器计数状态的输出。

在一些实施例中,所述互斥处理单元包括请求仲裁器(request arbiter)、专用存储器(exclusive memory)和协处理器控制器(coprocessor controller)。所述请求仲裁器具有与所述至少一个处理器核连接的多个接口,并且被配置成从所述至少一个处理器核接收所述多个互斥请求并确定要处理哪些互斥请求。所述专用存储器用于存储获取或释放互斥锁以及条件变量的等待、信号通知和广播所需的数据。所述协处理器控制器被配置成与所述请求仲裁器协调以通过访问所述专用存储器和解析互斥依赖性来处理所述多个互斥请求,并且基于所述多个互斥请求的请求类型来生成所述多个互斥响应。所述协处理器控制器可以是专用硬件模块或者是具有加速互斥协处理的定制指令的处理器核。

在一些实施例中,所述专用存储器包括锁状态表、每个互斥至少一个阻塞请求队列和多个条件信号通知队列。所述锁状态表包括存储指示每个互斥锁的锁状态的信息的第一数组、存储请求互斥锁的所述处理器核的标识的第二数组、以及存储请求互斥锁的所述用户线程的标识的第三数组。所述第一数组、所述第二数组和所述第三数组中的元素与每个互斥锁的索引相关联。所述至少一个阻塞请求队列对所述多个互斥请求中被阻塞的互斥请求进行排队。多个条件信号通知队列中的每一个都与条件变量相关联,并且存储等待满足与该条件变量相关联的条件的至少一个用户线程的标识。

在一些实施例中,所述多个互斥请求中的每一个包括以下各项中的至少一项:请求处理器核的标识、指定处理器核的标识、请求类型、请求线程的标识、目标互斥锁的索引、以及所述请求线程需要的条件变量的索引。

在一些实施例中,所述多个互斥请求可以包括条件变量相关请求,所述条件变量相关请求用于处理位于由互斥锁保护的共享数据区域中的条件变量。所述与条件变量相关的请求包括以下请求类型之一:用于等待所述条件变量的信号通知的请求;用于唤醒特定处理器核中与所述条件变量相关联的特定用户线程的请求;以及用于向所有处理器核广播以唤醒正在等待所述条件变量的那些线程的请求。

在一些实施例中,所述多个互斥请求可以包括以下请求类型之一:用于激活特定线程的请求;用于终止特定线程的请求;用于锁定目标锁的请求;以及用于解锁目标锁的请求。

在一些实施例中,所述多个互斥响应中的每一个包括以下各项中的至少一项:请求处理器核的标识、响应类型、请求线程的标识;以及处理器核正在被所述互斥处理单元服务的指示。所述响应类型包括指示以下各项中任一项的信息:特定线程待激活;特定线程待终止;条件变量已准备好被访问;用于获取目标锁的请求被准许;用于解锁目标锁的请求被准许;用于解锁目标锁的请求无效;以及异常错误。在一个实施例中,异常是中断程序执行的正常流程的事件,如当FIFO(先进先出)队列溢出时。

在一些实施例中,所述多个互斥响应中的一些包括用于唤醒未决(pending)线程中与特定条件变量相关联的任一个未决线程的信号,或者用于唤醒与特定条件变量相关联的所有未决线程的信号。

在一些实施例中,所述互斥处理单元包括互斥缓存和请求仲裁器。所述互斥缓存用于存储获取或释放互斥锁以及条件变量的等待、信号通知和广播所需的数据。所述请求仲裁器具有与所述至少一个处理器核连接的多个接口,并且被配置成在接收到所述多个互斥请求时仲裁是否处理所述多个互斥请求中的一个或多个,并且基于所处理的互斥请求的类型生成所述互斥响应中的至少一个。在任何给定时间,在一个处理器核中运行的有且仅有一个线程被授予对所述互斥缓存的独占访问权(exclusive access right)。

在一些实施例中,至少一个处理器核中的每一个包括统一缓存访问接口,所述统一缓存访问接口使得所述处理器核能够将其本地数据缓存和所述互斥缓存作为统一缓存来访问。所述统一缓存访问接口包括互斥请求发生器,所述互斥请求发生器被配置成生成多个所述互斥请求之一;互斥响应解码器,所述互斥响应解码器被配置成接收所述多个互斥响应,所述多个互斥响应包括独占访问响应或读取数据响应,其中,所述独占访问响应更新所述处理器核的独占访问状态以独占访问所述互斥缓存,并且所述读取数据响应将从所述互斥缓存接收到的数据转发到所述处理器核;读取数据多路复用器,所述读取数据多路复用器与所述互斥响应解码器连接,并且被配置成输出由所述互斥响应解码器从所述本地数据缓存或所述互斥缓存转发到所述处理器核的读取数据端口的读取数据;以及请求解复用器,所述请求解复用器与所述互斥请求发生器连接,并且被配置成确定是否将所述处理器核的加载/存储请求转发到所述本地数据缓存还是转发到所述互斥请求发生器,以经由统一缓存访问接口来访问所述互斥缓存。

在一些实施例中,所述统一缓存访问接口进一步包括独占访问监测器,所述独占访问监测器被配置成监测所述处理器核的所述独占访问状态,并且向所述处理器核提供所述独占访问状态以促进所述独占请求的生成。

在一些实施例中,所述多个独占请求包括以下各项之一:用于获取访问所述互斥缓存的独占权的请求;用于释放所述独占权的请求;用于对所述互斥缓存进行读取的请求;用于对所述互斥缓存进行写入的请求;以及用于对任何处理器核中的内核触发寄存器进行写入从而导致所述处理器核中的触发条件发生改变的请求。所述多个特定互斥响应中的每一个包括以下各项之一:授予所请求的独占权;以及返回所述互斥缓存的读取数据。

在一些实施例中,每个处理器核进一步包括上下文切换模块和多页寄存器存储装置。所述多页寄存器存储装置包括多个寄存器组,每个存储组包括多个寄存器页,每个存储页包括多个寄存器;并且所述上下文切换模块被配置成在所请求的页被缓存时通过改变寄存器页指针来切换寄存器上下文,使得可以减少上下文切换开销。在任何给定时间,所述处理器核中的每个用户线程仅与所述多个存储组之一的一个页相关联。

在一些实施例中,每个处理器核进一步包括用于指示当前正在访问哪个存储页的第一控制寄存器和用于指示当前正在访问哪个存储组的第二控制寄存器,以及记录与寄存器页和寄存器组相关联的每个线程索引的存储数组。

在一些实施例中,通过修改所述内核触发寄存器,向每个处理器核提供特殊的可执行指令以进行线程控制的,包括用于启用或禁用任何处理器核中的新用户线程的指令、用于定义任一处理器核中的用户线程的线程优先级的指令、用于请求互斥锁以及用于控制条件变量的指令。

根据本披露内容的另一方面,提供了一种用于在处理器系统中调度内核线程和用户线程的方法,所述处理器系统包括至少一个处理器核以及互斥处理单元。所述方法包括:由所述互斥处理单元接收源自所述至少一个处理器核中的特定用户线程的至少一个互斥请求,所述至少一个互斥请求请求影响任一个所述处理器核中的至少一个用户线程的执行状态,其中,每个互斥请求指示请求处理器核的标识;由所述互斥处理单元解析所述至少一个互斥请求之间的互斥依赖性;由所述互斥处理单元为所述至少一个互斥请求生成至少一个互斥响应,其中,所述至少一个互斥响应包括所述至少一个处理器核的标识,并且导致所述多个处理器核中的至少一个处理器核中的一组触发条件发生改变,其中,所述一组触发条件在被满足时将激活所述至少一个处理器核中的内核线程;由所述互斥处理单元向每个处理器核广播所述至少一个互斥响应;由每个处理器核确定所述广播的互斥响应中的标识是否与其自身的标识相匹配;响应于所述广播的互斥响应中的标识与所述请求处理器核的标识相匹配,由所述请求处理器核的内核触发模块基于所述一组触发条件生成内核触发指示符,来激活所述请求处理器核的内核线程;以及由所述请求处理器核的内核线程执行内核线程程序以将执行控制从所述特定用户线程传递到另一个用户线程。

在一些实施例中,所述解析步骤进一步包括:由所述互斥处理单元内的请求仲裁器选择是否处理所述多个互斥请求中的一个或多个;响应于每个这样的互斥请求,确定以下各项之一:响应于对互斥锁的互斥请求被拒绝,将该互斥请求附加到所述互斥处理单元的专用存储器中的阻塞请求队列中;响应于对互斥锁的互斥请求被准许,生成指示所述互斥锁的授予状态的所述至少一个互斥响应;以及响应于等待条件变量的信号通知的互斥请求,将该互斥请求附加到所述专用存储器中的条件信号通知队列中。

根据本披露内容的另外的另一方面,提供了一种用于激活内核线程以在处理器系统中的处理器核处调度用户线程的方法,所述处理器系统包括互斥处理单元和至少一个包括内核触发模块的处理器核。所述方法包括以下步骤:由所述内核触发模块监测一组触发条件;当满足所述触发条件之一时,由所述内核触发模块为所述处理器核生成内核触发指示符,其中,所述内核触发指示符指定要在所述处理器核中执行的特定用户线程;激活所述内核线程以运行内核线程程序;以及由所述内核线程程序发起执行所述特定用户线程。

在一些实施例中,所述监测步骤进一步包括:收集来自多个外围硬件事件的一组指示符,来自所述互斥处理单元的响应于来自所述至少一个处理器核的互斥请求的第一指示符,以及来自通过在所述处理器核的执行单元中执行软件指令而生成的第二指示符,这些指示符存储在所述内核触发模块中并形成所述一组触发条件。

在一些实施例中,所述发起步骤进一步包括:识别所述处理器核中的可运行用户线程;对所述可运行用户线程进行优先级排序;以及选择具有最高优先级的可运行用户线程来继续。

在一些实施例中,所述处理器系统包括多个处理器核,并且所述方法进一步包括:由所述处理器核之一中的执行单元生成互斥请求,所述互斥请求影响所述多个处理器核中的至少一个处理器核中的线程调度;以及向所述互斥处理单元发送所述互斥请求,使得所述互斥处理单元可以向所述多个处理器核广播对应的响应,所述对应的响应导致所述多个处理器核中的至少一个处理器核中的所述一组触发条件发生改变。

在一些实施例中,所述监测步骤进一步包括监测以下条件之一:分配给当前运行的用户线程的时间段已到期;出现比所述当前运行的用户线程优先级更高的用户线程;以及所述当前运行的用户线程不激活。

在一些实施例中,所述互斥处理单元包括互斥缓存,所述互斥缓存用于存储获取或释放互斥锁以及条件变量的等待、信号通知和广播所需的数据,并且所述方法进一步包括:向所述互斥处理单元生成用于获取访问所述互斥缓存的独占权的互斥请求;以及响应于授予从所述互斥处理单元获取所述独占权,对所述互斥缓存执行写入和读取操作。

在一些实施例中,对所述互斥缓存执行写入和读取操作的步骤包括:从所述互斥处理单元接收多个互斥响应;对于所述多个互斥响应中的每一个,确定所述接收到的互斥响应是读取数据响应还是独占访问响应;响应于所述读取数据响应,将所述读取数据转发到读取数据端口;响应于所述独占访问响应,更新所述处理器核的独占访问状态。

在一些实施例中,对所述互斥缓存执行写入和读取操作的步骤进一步包括:由所述处理器核中的执行单元执行加载和存储指令,其中,所述加载和存储指令包括具有数据地址的读取请求或者具有数据地址和写入数据的写入请求;确定所述加载和存储请求中的所述数据地址是否落入所述互斥缓存的地址范围内;以及响应于所述数据地址落入所述互斥缓存的地址范围内以及授予所述处理器核的独占访问状态,生成用于对所述互斥缓存执行写入和读取操作的所述互斥请求。

处理器系统架构

现在参考图1,图1示出了通过硬件加速内核线程进行微线程控制的处理器系统架构的图100。在根据本披露内容的实施例的处理器系统架构中,所述多核处理器包括如处理器核#1 110、处理器核#2 120和处理器核#N 130等至少一个处理器核以及互斥处理单元140。每个处理器核具有指示为111、121和131的内核触发模块以及指示为112、122和132的执行单元。

应当理解,尽管本披露内容的实施例的一些附图示出了处理器系统中的若干个处理器核,但是本披露内容适用于包括任何数量的处理器核(即,一个或多个处理器核)的处理器系统。

每个处理器核提供内核线程和用于并行执行的多个用户线程。每个内核触发模块被配置成监测一组触发条件,并且基于所述一组触发条件生成内核触发指示符以激活该处理器核中的内核线程。这些触发条件可以与不同的源相关联,包括执行专门设计的指令的处理器核、对新调度的线程可以继续运行多少个周期进行计数的线程计时器以及从互斥处理单元140、从所有类型的外围设备和从不同的异常条件等获得的各种指示符。如果所述内核触发指示符被激活,例如被设置为‘1’,则下一个周期的处理器程序计数器(PC)被设置为内核线程PC以运行内核线程,所述内核线程又将在具有不同优先级的多个未决用户线程中调度下一个被激活的用户线程。

当执行线程指令时,处理器核中的每个执行单元可以生成互斥请求,所述互斥请求旨在创建互斥响应,所述互斥响应影响所述多个处理器核中的一个或多个处理器核中的至少一个用户线程的执行状态。所述互斥处理单元140与所述多个处理器核连接,并且被配置成从所述多个处理器核中的每一个接收多个互斥请求,并且提供对应的互斥响应。

为此,在一些实施例中,每个处理器核都集成了新指令,即,微线程指令扩展,用于线程控制,如启用或禁用任何核中的新线程,以便定义线程优先级、调度线程、请求互斥和控制条件变量。

所述互斥处理单元140在接收到所述互斥请求时确定何时以及如何响应,并且生成对应的互斥响应,并且然后将所述互斥响应广播给所述处理器核。因此,所述多个互斥响应导致所述多个处理器核中的至少一个的触发条件发生改变。所述互斥响应可以使所述请求处理器核的内核触发模块或(多个)其他处理器核的内核触发模块生成内核触发指示符,并且进而使(多个)对应的处理器核执行内核线程并且调度用户线程。

在一些实施例中,虽然可能存在从多个处理器核同时发送的互斥请求,但是互斥处理单元140缓冲和仲裁传入的请求,并且串行地一个接一个地处理所述请求,从而避免竞争情况。所述互斥处理单元在满足原子性约束的同时解析互斥依赖性并且维护条件变量。此外,所述互斥处理单元对那些未能获取互斥锁的互斥请求进行排队,并且稍后自动重试所述互斥请求,直到互斥锁被释放。

根据本披露内容的实施例,线程管理功能包括创建线程、暂停线程、调度线程、设置线程优先级、获取/释放互斥锁以及监测条件变量…等。处理器核不仅可以控制自己运行的线程,还可以控制在另一个处理器核中运行的任何线程。如上所述,为了利用具有高性能的微线程特征,每个处理器核都结合了多个扩展指令,这些扩展指令可以对不同核的内核触发模块中的内部寄存器进行读取和写入。此外,每个处理器核可以执行用于与互斥处理单元通信以发送互斥和条件变量请求的指令。因此,不需要运行任何软件来从互斥处理单元获得响应,因为所述互斥处理单元直接修改或激活目标核的内核线程寄存器。

处理器核在任何给定时间执行内核线程或用户线程。内核线程拥有最高特权,并且因此其可以访问所有寄存器和硬件资源。如果内核触发模块检测到触发条件,则当前用户线程立即暂停,并且保存当前线程的下一个PC值。然后,内核触发器将下一个PC设置为内核线程程序的第一条指令以激活内核线程。然后处理器核执行内核线程以执行将详细讨论的以下任务中的至少一个:

-调度要执行的下一个用户线程,使得下一个线程在所有符合条件的线程中具有最高优先级。如果有多个符合条件的线程具有相同的最高优先级,则使用轮询算法或加权轮询算法来选择所述线程中的一个线程。

-通过改变寄存器页指针或者将寄存器内容与存储器内容进行交换来执行上下文切换。在交换的情况下,处理器将最近最少使用的(LRU)页保存到系统存储器中,并且然后用从存储器中检索的下一个线程的寄存器页覆盖LRU页。

-为下一个线程设置计时器。当线程计时器完成计数时,其将触发内核线程,并且当前线程被中断。计时器防止线程长时间占用硬件以及使其他线程没有响应。

-激活调度线程。

根据将在下文详细讨论的本披露内容的实施例,提供了用于实施互斥协同处理的至少三个选项。在互斥处理单元处,专用存储器被配置成存储获取或释放互斥锁以及条件变量的等待、信号通知和广播所需的数据。专用存储器可以包括如FIFO队列、数组、表格等所有类型的数据结构。

-第一选项是使用固定功能硬件加速器连同专用存储器和(多个)请求/响应接口。

-第二选项是使用专用处理器核(如RISC核)连同专用存储器和(多个)请求/响应接口,其中,所述处理器核具有用于加速处理的定制的指令,如用于加速处理阻塞互斥和条件变量的FIFO队列的指令。

-第三选项是除了每个处理器核中的统一缓存接口之外,还使用专用存储器和(多个)请求/响应接口,其中,所述互斥处理工作负荷分布在也运行用户线程的处理器核中。

这种独特的硬件-软件协同设计多核架构提供了可扩展性,以在加速线程切换操作的同时调度在许多处理器核中运行的许多线程。

处理器核

图2示出了根据本披露内容的一些实施例的图1的处理器系统架构中的处理器核200的图。如所示出的,具有硬件多线程的处理器核200由处理器的一些共同部件构成,如由取指令级201、解码器级203、执行级205、存储器访问级207和寄存器写回级209组成的处理器流水线,以及一些硬件模块,如外围控制器211、计时器213、直接存储器访问(DMA)控制器215、加速器217和跟踪缓冲器219。应当理解,为了不混淆对本披露内容的实施例的描述,没有示出处理器中的一些其他共同部件,如I-缓存和D-缓存。

在一些实施例中,执行级205和存储器访问级207、209中的一个或多个可以用作类似于图1中的执行单元112、122或132的执行单元210。

在本披露内容的一些实施例中,处理器核200另外包含多个独特的硬件模块,包括内核触发模块220、多页寄存器存储装置230和用于控制不同处理器核中的线程、互斥和条件变量的多个新处理器指令。

考虑到所述上下文切换是线程调度中最大的开销,在一些实施例中,多页寄存器存储装置230被集成在处理器核200中,使得所述页寄存器存储装置可以通过改变寄存器页指针来切换寄存器上下文,而不是在所请求的页没有被缓存的情况下在寄存器文件与系统存储器之间复制值。以这种方式,如果所需的寄存器页已经被缓存,则可以显著减少上下文切换开销。因为线程的数量大于寄存器页的数量,所以如果请求页没有被缓存,则使用类似缓存的最近最少使用的(LRU)算法来选择要刷新的页。细节将在稍后讨论。

内核触发模块220是持续监测处理器核200的触发条件的硬件模块。其包括多个内核触发寄存器以保存由处理器核200管理的每个用户线程的执行状态信息。在一个实施例中,内核触发模块220具有三种类型的专用线程寄存器来跟踪触发条件,即线程请求寄存器222、多优先级寄存器224和互斥寄存器226。另外地,内核触发模块220具有状态评估模块228,所述状态评估模块在逐位的基础上对三个专用线程寄存器进行操作。

所述多个优先级寄存器被配置成保存每个用户线程的优先级。每个优先级寄存器中每个位的位置与一个用户线程相对应,并且所述多个优先级寄存器中相同位位置中的位值的组合对特定优先级进行编码。

假设T是处理器核200中用户线程的最大数量,并且P是用户线程支持的优先级数量。线程请求寄存器222、多优先级寄存器224和互斥寄存器226的每个单独的位分别表示为request_mask[t]、priority_mask[p][t]和mutex_mask[t],其中,0<=p

在一个实施例中,根据以下标准,各种线程寄存器位被设置为‘1’:

-对于线程请求寄存器222:如果第t个线程被激活,则第t位为‘1’,否则为‘0’;

-对于多优先级寄存器224:如果用户线程t*被指派了优先级p*,则priority_mask[p*][t*]=1;

-对于互斥寄存器226:如果第t个线程已经请求了互斥锁M*但是M*还不可用,则第t位为‘0’;如果没有互斥请求或者所请求的互斥锁M*被互斥处理单元授予,则值为‘1’。互斥寄存器也被条件信号通知共享。如果用户线程正在等待条件信号,则对应的位被设置为‘0’,并且所述位稍后将被互斥处理单元设置为‘1’。

在另一个实施例中,假设X=log

应当理解,提供这些专用线程寄存器来保存与每个用户线程相关的状态信息,这些信息可能影响其执行状态。上述实施方式仅作为示例进行描述。

线程请求寄存器222由各种软件和硬件模块更新。在一个实施例中,如果与第i个请求位相关联的硬件模块检测到中断或外部事件,则所述硬件模块将把第i个线程的请求位设置为‘1’。如果触发源来自软件,则可以将任意位设置为‘1’或‘0’。以下示出了在3种情况下如何生成线程请求:

-软件指令可以通过修改线程请求寄存器222的与用户线程相对应的位来启用或禁用某个用户线程;

-从如DMA控制器215、硬件加速器217和跟踪缓冲器219等不同的内部硬件模块生成的异常或特定事件可以修改线程请求寄存器222的位。内核线程将调度适当的子例程来处理对应的事件或异常;

-如GPIO、IO FIFO、UART调试端口等外围控制器可以修改线程请求寄存器222的与输入中断或外围FIFO计数器满足某些计数器条件的事件相对应的位,使得内核线程将调度对应的中断子例程。计数器条件可以是输入FIFO计数器大于阈值,使得触发外围子例程将数据从输入FIFO存储器复制到系统存储器以避免缓冲器溢出。所述计数器条件也可以是输出FIFO计数器小于阈值,使得触发外围子例程将数据从系统存储器复制到输出FIFO存储器以避免缓冲器下溢。

多优先级寄存器224可以由各种软件更新。在一些情况下,当设置线程请求寄存器222中的位时,需要设置多优先级寄存器224之一中的对应位。硬件模块和外围设备的优先级可由用户根据应用程序的需求进行编程。一般来说,实时应用程序比非实时应用程序优先级更高。

根据本披露内容的一些实施例,每个处理器核或中断硬件可以通过例如向互斥处理单元发送互斥请求并从互斥处理单元接收互斥响应来修改或使得修改任何处理器核的任何内核触发模块中的专用线程寄存器。在示例性实施例中,执行单元210可以生成互斥请求并将其发送到互斥处理单元140,从而为由处理器核200管理的用户线程请求互斥锁,或者请求改变另一个处理器核中的用户线程的运行状态。另一方面,来自互斥处理单元140的互斥响应影响三个寄存器222、224和226的值。

在一个实施例中,如果多个源同时请求修改这些寄存器222、224和226的不同位,则处理器核200可以在每个时钟周期中仅服务于这些源中的一个。那些竞争失败的源需要继续请求访问期望的寄存器,直到每个请求都被服务。

如上所述,内核触发模块220被配置成监测一组触发条件,并且基于所述一组触发条件生成内核触发指示符以激活该处理器核200中的内核线程。根据一个实施例,内核触发模块220还维护线程计时器229,所述线程计时器监测当前用户线程消耗的时钟周期数。

在该实施例中,内核触发模块220对内核线程的激活取决于线程计时器229和三个特定线程寄存器的逐位“与”值。在触发时,如果线程t的逐位“与”值、即priority_mask[p*][t]与request_mask[t]与mutex_mask[t]等于‘1’,则内核线程将仅在调度期间考虑该线程t。

假设当前执行的线程表示为curTh,并且当前线程的线程优先级表示为curP。根据一些实施例,如果以下三个触发条件中的任一个为真,则内核触发模块220将输出内核触发指示符来激活处理器核200中的内核线程。

-当前运行的用户线程(即curTh)变成不激活;

-比当前运行的用户线程的优先级(即curP)更高的用户线程可运行;以及

-分配给当前运行的用户线程的时间段已到期。

第一触发条件

第二触发条件

第三触发条件

一旦内核线程被内核触发指示符激活,下一个时钟周期的程序计数器就被设置为内核线程的第一指令的程序计数器。然后,内核线程执行基于优先级的调度来选择下一个用户线程。在一些实施例中,每个处理器核中的内核线程被配置成在被内核触发指示符激活之后,基于以下各项来调度下一个用户线程:(1)处理器核中的用户线程的优先级,(2)用户线程的执行状态以及(3)对用户线程的多个互斥响应。

在考虑其他优先级较低的符合条件的线程之前,将首先评估优先级最高的符合条件的线程。如果多个符合条件的线程具有相同的最高优先级,则处理器核采用仲裁算法(如轮询算法或加权轮询算法)来选择用户线程之一。

以下伪代码示出了以轮询方式仲裁最高优先级线程(即Nxt_thread)的实施例之一,其中,‘rrptr’是轮询指针。

图3示出了根据本披露内容的一些实施例的内核触发模块中的状态评估模块的示例性实施方式的图300。如图所示,状态评估模块具有多个逻辑门,所述多个逻辑门被配置成对线程请求寄存器、多优先级寄存器和互斥寄存器进行逐位运算。状态评估模块还具有线程选择器310和优先级检测器320。

在该示例性实施例中,作为示例讨论了处理器核中的四个用户线程t

状态评估模块包括例如与门331-334和341-344以及或门351和353。这些逻辑门输出

(i)来自与门331-334和来自与门341-344的第一组逐位“与”值。换句话说,第一组逐位“与”值可以进一步包括多个子组,并且逐位“与”值的每个子组与该处理器核中具有一个特定优先级的所有用户线程相对应;以及

(ii)来自或门351和353的第二组“或”值。换句话说,每个“或”值都是逐位“与”值的每个子组的输出“或”值,并且与逐位“与”值的一个子组相对应。

线程选择器310被配置成接收第一组逐位“与”值,并且输出指示当前运行的用户线程是否不激活的第一信号。在一个实施例中,关于当前线程的标识及其优先级的信息可以在当前线程寄存器312和当前优先级寄存器314中,以便线程选择器310基于‘current_thread’寄存器312和‘current_priority’寄存器314来选择激活信号。如果所选激活信号变为‘0’,则上文讨论的第一触发条件将触发内核触发指示符的生成。

优先级检测器320被配置成接收第二组“或”值,并且输出指示是否存在比当前运行的用户线程的优先级更高的可运行用户线程的第二信号。如所示出的,优先级解码器320接收不同优先级的线程激活信号,并且然后选择最高的激活优先级。如果新优先级具有比当前优先级更高的优先级,则上文讨论的第二触发条件将触发内核触发指示符的生成。

如上结合图2所述,在一个实施例中,线程选择器310的输出和优先级检测器320的输出形成状态评估模块228的输出。它们与内核计时器229一起建立完整的触发条件,并且进而确定是否将生成内核触发指示符来激活处理器核中的内核线程。

在以不同方式实施多优先级寄存器的一些其他实施例中,内核触发模块中的状态评估模块的硬件结构可以被相应地调整。例如,在多优先级寄存器由X个寄存器构成的情况下,其中,X=log

应当理解,内核触发模块中的状态评估模块的上述实施方式仅被描述为示例。硬件设计可以用这些具体细节的变化来实践,并且这将被认为在本披露内容的精神和范围内。

互斥处理单元

示例1

图4更详细地示出了根据本披露内容的一些实施例的互斥处理单元的图400。在这些实施例中,微线程架构包括作为互斥处理单元410的专用线程协处理器,所述专用线程协处理器可以访问专用缓存/存储器416以集中方式解析互斥锁定和条件信号通知,从而避免竞争情况。

大多数处理器使用某种原子指令对锁进行读取和写入来提供互斥锁的基本支持,所述锁本质上是共享存储器位置。因为不能保证获得所述锁,所以需要循环(“自旋”)来重复尝试锁定直到所述锁可用。自旋锁只有在线程可能只被阻塞很短时间的情况下才是高效的。如果另一个线程长时间持有锁,则所述锁会因为没有做有用的工作而浪费处理带宽。以下是基于原子x86指令xchg()的自旋锁的简单实施方式,所述指令在原子步骤中交换存储器值。

由于在多核系统中使用自旋锁非常普遍,因此共享存储器访问涉及总线事务和一致性缓存协议,这两者都可能因高开销而影响整体性能。更高效的解决方案是在等待获取锁的同时切换到不同的线程,使得处理器核可以被释放来执行另一个有用的任务。

为此,根据本披露内容的实施例,互斥处理单元包含请求仲裁器412、协处理控制器414和专用存储器416,所述专用存储器至少存储以下数据结构:锁状态表417、至少一个阻塞请求队列418和至少一个条件信号通知队列419。

请求仲裁器412具有与N个处理器核421-423连接的N个请求端口。所述请求仲裁器最多同时接收N个互斥请求,但每个周期最多可以处理R个请求,其中,1<=R<=N,并且R是硬件参数。

互斥协处理单元414内部的协处理控制器414可以被实施为硬接线逻辑块或者专用于线程协处理的处理器核。处理器核的处理速度低于专用硬件块。但是互斥和条件变量(CV)的处理工作负荷并不大。此外,可以使用某个定制的指令集来提高处理性能,以加快与互斥和条件变量(如队列操作)相关的协处理工作负荷。处理器核具有通过软件实施更复杂操作的优点。此外,与硬接线解决方案相比,基于处理器(如基于RISC)的协处理器支持更多的互斥锁和条件变量,因为处理器核可以在内部缓存不足时使用下一级缓存。

协处理控制器414可以访问专用存储器(或缓存)416来存储锁状态表、至少一个阻塞请求队列和至少一个条件信号通知队列以支持类似多线程的API,如mutex_lock()和signal()等。在没有互斥处理单元410的处理器系统中,这些数据结构可以分布在不同处理器核的一致性缓存中。因此,在运行一致性协议时,由于缓存之间的数据交换,线程功能可能会干扰其他应用程序线程的缓存存储。专用缓存/存储器的分配可以有效地消除一致性开销,因为其不会污染每个处理器核中的本地缓存。为了最小化实时应用程序的最坏情况延迟,避免不可预测的缓存一致性开销是至关重要的,尤其是当核数量增加时。如果互斥处理单元中使用了专用缓存,则所述专用缓存将与下一级存储器连接以获得更多的存储容量。

锁状态表417以不同数组存储每个互斥锁的状态,即locked[k]、locked_core[k]和locked_thread[k],其中,k是互斥锁ID。Locked[k]等于‘1’表示锁k不可用,并且因此被锁定,并且等于‘0’表示其他情况。Locked_core[k]和locked_thread[k]分别表示已经获得锁k的处理器核和线程。当处理互斥请求时,协处理控制器414可以对锁状态表417进行读取和写入。如果锁请求被拒绝,则所述协处理控制器将把被拒绝的请求附加到阻塞请求队列418之一以便稍后当目标锁被解锁时进行处理。同时,如果协处理控制器414正在等待另一个线程发送满足与变量c相关联的条件的信号,则所述协处理控制器将线程放入与条件变量c相关联的条件信号通知队列419之一中。

在一些实施例中,每个互斥请求或每个请求端口由多个信号组成,指示以下各项中的一项或多项:请求核、请求类型、目标锁、请求线程、目标核、目标线程和条件变量。一个示例请求可以具有如下元素。

请求类型可以是以下可能值之一:

NO_REQ:没有请求。

THREAD_START_REQ:请求激活线程,这将对应的请求位设置为‘1’。

THREAD_KILL_REQ:请求终止线程,这将对应的请求位设置为‘0’。

LOCK_REQ:请求锁定特定目标锁。

UNLOCK_REQ:请求解锁特定目标锁。

CV_WAIT_REQ:请求等待条件变量。

CV_SIGNAL_REQ:请求发送信号以唤醒任何一个与条件变量相关联的未决线程。

CV_BROADCATS_REQ:请求广播信号以唤醒与条件变量相关联的所有未决线程。

在一些实施例中,当发出锁请求LOCK_REQ或条件等待请求CV_WAIT_REQ时,与请求线程相对应的互斥位可以被设置为‘0’。当处理器核获得锁或稍后接收到条件信号时,互斥位将恢复为‘1’。在其他实施例中,与请求线程相对应的互斥位由互斥处理单元通过互斥响应来设置。

处理器核可以生成具有与上文列出的请求类型之一相对应的请求代码的消息,使得互斥处理单元可以解码所述消息并相应地处理所述请求。例如,当请求锁定互斥时,处理器核的请求代码等于LOCK_REQ。当请求解锁互斥时,处理器核的请求代码等于UNLOCK_REQ。

多个处理器核421-423可以同时向互斥处理单元发送请求。请求仲裁器412使用如轮询算法等仲裁算法来服务来自不同来源的请求。在一个实施例中,如果请求仲裁器412决定接收来自请求源(比如c*)的请求,则其将对应的请求就绪标志(即reqRdy[c*])设置为‘1’,并且将其他核的请求就绪标志设置为‘0’,即对于所有不等于c*的c,reqRdy[c]=0。发出请求后,如果reqRdy等于‘0’,则每个请求处理器核必须停止。然后处理流水线将停止,并且其只能取出下一条指令来执行,直到reqRdy变为‘1’。

在总线被用于每个处理器核发送互斥请求和接收互斥响应的其他实施例中,请求就绪标志可以被省略,并且指示被服务的处理器核的对应端口或互斥响应可以用作请求就绪标志。

同时,协处理器控制器414向每个处理器核广播仲裁结果。每个互斥响应由多个信号组成,包括以下各项中的一项或多项:处理器核的标识(ID)和接收互斥授予的线程的ID。所述协处理器控制器还输出一种可能的响应类型。一个示例响应可以具有如下元素。

响应类型可以是以下可能值之一:

THREAD_START:如果被服务的请求是THREAD_START_REQ,则互斥处理单元将检查所述请求,并且向指定核发送THREAD_START响应。

THREAD_KILL:如果被服务的请求是THREAD_KILL_REQ,则互斥处理单元将检查所述请求,并且向指定核发送THREAD_KILL响应。

LOCK_GRANT:如果被服务的请求是LOCK_REQ,并且在没有检测到任何错误的情况下所述请求被准许,则互斥处理单元返回LOCK_GRANT消息。

MUTEX_READY:如果被服务的请求是CV_WAIT_REQ,则请求后互斥位被自动设置为‘0’。当对应请求被准许时,互斥处理单元可以通知每个请求处理器核哪个互斥位可以被设置为‘1’,使得内核触发器将激活内核线程以在必要时调度用户线程。

UNLOCK_GRANT/UNLOCK_ERROR:如果被服务的请求是解锁请求,并且在没有检测到任何错误的情况下所述请求被准许,则互斥处理单元返回UNLOCK_GRANT消息。但是,如果互斥处理单元发现所请求的线程不是锁的所有者,则所述互斥处理单元将设置UNLOCK_ERROR消息,使得处理器核可以处理所述错误。

如果被服务的请求是LOCK_REQ,则协处理器控制器检查目标锁的锁定位(即locked[reqTarget])以确定其是否可用。如果所请求的锁可用(即locked[reqTarget]=0),则所选请求的响应是LOCK_GRANT。协处理器控制器通过设置locked[reqTarget]=1来更新锁状态表,并且将请求核(即request_core)和请求线程(即request_thread)与目标锁(即reqTarget)相关联,即locked_core[reqTarget]=request_core并且locked_thread[reqTarget]=request_thread。如果所请求的锁不可用(即locked[reqTarget]=1),则协处理器控制器将不输出对所述请求的任何响应,并且失败的请求被附加到阻塞请求队列中。由于请求核在执行互斥请求指令时同时将对应的互斥位设置为‘0’,因此如果请求核没有收到任何响应,则其将在下一个周期中变成不激活,这将使内核触发器调用内核线程来调度新的用户线程。如果授予信号为UNLOCK_ERROR,则协处理器控制器可以生成异常,使得某个软件将处理所述错误。

当接收到MUTEX_READY响应时,每个处理器核中的内核触发模块检查来自仲裁器响应的核索引是否与其自己的核索引相匹配。如果匹配,则所述内核触发模块将相应地将第t个互斥位设置为‘1’,其中,t是从所述仲裁器响应接收到的线程索引。应当注意,响应中的线程索引t不一定等于最后请求的线程,因为响应可能与来自阻塞请求队列之一的较早请求相对应。如果授予信号指示所请求的锁可用,则指定处理器核的第t个互斥位被设置为‘1’。

阻塞请求队列允许处理器核以即发即弃(fire-and-forget)的方式控制线程。如果线程未能获取目标锁,则阻塞请求被放入阻塞请求队列中,使得互斥处理单元可以在稍后目标锁被解锁时获取目标锁。如果使用单个请求队列,则可能会遇到队首阻塞问题。队列中第一个请求所请求的锁可能未就绪,但是后续请求之一已经就绪。为了避免队首阻塞问题,互斥处理单元可以为每个目标锁分配一个阻塞请求队列,即总共LOCK_NUM个请求队列,其中,LOCK_NUM是可用锁的数量。如果获取锁k有任何失败,则请求仲裁器将把用于获取目标锁k的阻塞请求附加到reqQueue[k]中,使得0<=k

当涉及启用条件变量时,在本披露内容的一些实施例中,多线程API要求程序员将条件变量c与互斥m相关联。一些线程可能发现它们尚未准备好运行,因为不满足某个条件,而该条件取决于由m保护的一些共享数据。例如,在经典的生产者-消费者示例中,消费者线程必须等待队列不为空的条件,而空的条件取决于可以由生产者和消费者线程修改的共享计数器。为了避免浪费处理带宽来进行轮询并且等待条件改变,停止的线程应该声明它们正在等待条件变量c的信号通知,释放互斥m,并且然后进入睡眠状态。当另一个线程锁定m以获得对共享数据的独占访问时,其可以改变共享数据,如增加计数器值,并且确定是否满足信号通知条件。如果是,则所述线程将生成针对c的信号,并且唤醒至少一个等待c的线程。

如果处理器核R

图5示出了根据本披露内容的一个实施例的互斥处理单元处理互斥请求的过程500。为了简化描述,这里假设使用单个阻塞请求队列。

过程500开始于501,其中,互斥处理单元开始处理其接收到的互斥请求。在503处,互斥处理单元检查阻塞请求队列是否为空。如果是,则在511处,所述互斥处理单元直接选择新接收的请求来根据新请求的仲裁策略进行处理。否则,在505处,互斥处理单元根据现有请求和新请求的不同仲裁策略来仲裁要处理哪个请求。

在一个示例性实施例中,在505处,在检查需要特定互斥锁的第一阻塞请求中指示的信息时,互斥处理单元通过访问第一阻塞请求包含的专用存储器来确定第一阻塞请求的目标锁是否可用。如果目标锁可用,则在507处,仲裁的结果指示处理第一阻塞请求。然后,第一阻塞请求被处理并且从阻塞请求队列中弹出。因此,在513处,生成互斥响应以通知请求处理器核将与请求处理器核中的请求线程相对应的互斥寄存器的位设置为“1”。进一步地,在使用请求就绪标志的一些实施例中,对于所有其他请求核,请求就绪标志可以被设置为“0”。在互斥请求被处理之后,在517处,锁状态表和条件信号通知队列中的信息被相应地更新。

如果目标锁不可用,则在513和515处,互斥处理单元执行必要的动作,并且第一阻塞请求被保持在阻塞队列中或者被推到阻塞请求队列的末尾。另一方面,如果在507处,仲裁的结果指示处理新的请求,而不是阻塞请求队列中的那些请求,则过程500进行到框511以根据新请求的仲裁策略选择新接收的请求进行处理,并且然后进行到框513以相应地处理所选的新请求。

在一个实施例中,如果还没有要被服务的阻塞请求,则处理新请求之一,并且如果来自核c的请求被处理,则设置reqRdy[c]=1。如果新请求的目标锁可用,则返回LOCK_GRANT响应。如果目标锁不可用,则新请求被推入阻塞队列,并且不提供响应。如果新请求具有解锁锁的请求类型,并且新请求与先前的锁请求匹配,则返回UNLOCK_GRANT响应。如果解锁请求无效,则返回UNLOCK_ERROR响应,并且如果阻塞请求队列中没有空间,则返回QUEUE_ERROR响应。

应当理解,对于不同类型的互斥请求,互斥处理单元相应地进行处理,并且产生不同类型的互斥响应。上述实施例仅展示了一些用例作为示例。

图6展示了根据本披露内容的实施例的用于特定用例的互斥处理单元处的过程600。如所示出的,在该实施例中,讨论了包括两个处理器核(即处理器A和处理器B)以及互斥处理单元的处理器系统。在该图中,水平轴指示时钟周期,并且竖直轴指示过程600中的不同参与者。

过程600开始于处理器核A中的第一用户线程(即,用户线程UT1)正在运行,并且同时处理器B中的用户线程(即,用户线程UT3)正在运行。在某个点处,正在运行的UT1需要互斥K,并且处理器A向互斥处理单元发送互斥请求LOCK_REQ,请求获取互斥K。同时,UT1被停止,并且处理器A等待来自处理单元的响应。

在一个实施例中,一旦发送了LOCK_REQ,如果在下一个周期或接下来的几个周期中没有接收到LOCK_GRANT响应,则处理器A的内核触发模块中的UT1的互斥位被自动设置为“0”,这进而满足触发条件之一,并且将触发生成内核触发指示符。

另一方面,在接收到互斥请求时,互斥处理单元通过访问其专用存储器来解析互斥依赖性,并且确定互斥K是否可用。假设互斥K被授予处理器B的UT3,并且当前UT3拥有由互斥K管理的关键资源。换句话说,在一个实施例中,如果对于LOCK_REQ,互斥K不可用,则互斥处理单元将不输出对该LOCK_REQ的任何响应,并且该LOCK_REQ将被附加到专用存储器中的阻塞请求队列。

处理器A在下一个周期检测到互斥K不可用,并且内核线程被内核触发指示符激活。处理器A的内核线程执行基于优先级的调度来选择下一个用户线程。假设UT2的优先级比UT1低,那么UT2开始在处理器A中运行。

一旦处理器B的UT3完成了关于互斥K的动作,处理器B就向互斥处理单元发送UNLOCK_REQ以请求释放互斥K。一旦接收到UNLOCK_REQ,互斥处理单元就处理从处理器A发送的先前被阻塞的LOCK_REQ,并且生成对处理器A的LOCK_GRANT响应,并且优选地生成对处理器B的UNLOCK_GRANT响应。响应被广播到所有处理器核。

处理器A从LOCK_GRANT响应中得到通知,互斥K可供UT1获取和使用。LOCK_GRANT响应可以直接将处理器A的内核触发模块中UT1的互斥位从“0”修改为“1”。处理器A中的内核触发模块监测线程寄存器,并且发现UT1由于其较高的优先级而准备好被调度,即使UT2还没有完成。内核触发指示符由UT1的线程寄存器的位生成。相应地,内核线程被激活,并且UT1被调度在处理器A中运行。

应当理解,图6仅以简单的方式展示了示例性用例。根据本披露内容的其他实施例,互斥处理单元以集中的方式处理所有处理器核的所有互斥相关请求,以在满足原子性约束的同时解析互斥依赖性并维护条件变量。

示例2

图7示出了根据本披露内容的一些其他实施例的互斥处理单元的图700。在这些实施例中,微线程架构包括作为互斥处理单元的另一实施方式的互斥加速器740和指示为710、720和730的多个处理器核。互斥加速器740经由N个单独请求接口和一个响应接口与N个处理器核连接。处理器核710、720和730中的每一个只有在互斥加速器740根据请求仲裁授予访问权之后才能获得对互斥加速器740的访问权。

互斥加速器740被配置成减少专用于互斥处理单元的逻辑资源。在一些实施例中,可以重用一个处理器核710、720或730来在其内核线程中运行协处理操作,而不是在互斥处理单元中运行线程管理软件。

在一个实施例中,互斥加速器740仅允许处理器核之一执行以下两个功能之一:

(i)获取互斥加速器中嵌入的互斥缓存741的独占读取权和写入权;以及

(ii)对另一个处理器核的微线程寄存器进行写入。

在该实施例中,每个处理器核具有与图2和图3所示的类似部件。处理器核710、720和730各自具有微线程寄存器711、721和731以及加载/存储单元712、722和732。微线程寄存器可以是内核触发模块中的线程寄存器,包括线程请求寄存器、多优先级寄存器和互斥寄存器。加载/存储单元可以是执行单元210的一部分。

多个处理器核中的有且仅有一个处理器核被授予在任何给定时间获取对互斥缓存741的独占访问权的独占请求。一旦处理器核获得互斥缓存的独占访问权,其就可以访问本地数据缓存或互斥缓存,就好像所述处理器核只访问一个缓存一样。另外地,为了使每个处理器核能够将本地数据缓存或共享互斥缓存作为统一缓存来访问,每个处理器核可以结合被指示为713、723和733的统一缓存访问接口。下面将结合图8讨论统一缓存访问接口的细节。

在一个实施例中,互斥加速器740包括由所有处理器核共享的互斥缓存741以及请求仲裁器742。互斥缓存741存储管理线程所需的所有数据结构,包括获取/释放互斥锁、将阻塞的互斥请求附加到未决队列、关于条件变量的等待/信号通知/广播等。嵌入式互斥缓存741可以具有数据缓存的所有必要且充分部件,包括用于缓存标签查找的硬件资源、缓存替换策略(如LRU策略)以及到下一级存储器的接口,所述下一级存储器可以是2级(L2)缓存或外部双倍数据速率(DDR)芯片。如果在互斥缓存741中没有找到所请求的数据,则互斥加速器740将从下一级存储器重新填充缺失的缓存行。

请求仲裁器742具有与至少一个处理器核连接的至少一个接口,并且被配置成在接收到多个互斥请求时仲裁是否处理所述多个互斥请求中的一个或多个,并且基于所处理的互斥请求的类型生成至少一个互斥响应。

在一个示例性实施例中,互斥请求和互斥响应的类型可以如下表1和表2所示。

表1

表2

图8是示出根据本披露内容的一些实施例的处理器核的统一缓存访问接口的图800。统一接口包含互斥请求发生器810、缓存请求解复用器820、互斥响应解码器830、读取数据多路复用器840和独占访问监测器850。所述统一接口还具有多个端口861-868以发送或接收请求或响应,并且从本地数据缓存和共享互斥缓存中写入或读取数据。

互斥请求发生器810被配置成生成如上表1所示的请求。根据经由端口868发送的来自处理器核执行的指令的输入以及来自请求解复用器820的输入,互斥请求发生器810创建不同类型的互斥请求。

缓存请求解复用器820被配置成将加载/存储请求转发到本地数据缓存或互斥缓存。加载/存储请求可以包括读取/写入地址和写入数据。请求解复用器820检查读取/写入地址范围是否落入互斥范围内,并且基于检查结果,如果地址超出范围,则确定将加载/存储请求转发到本地数据缓存,否则转发到互斥缓存。如果加载/存储请求应该被转发到互斥缓存,则请求解复用器820将所述请求发送到互斥请求发生器810进行进一步处理。在一些实施例中,加载/存储请求指示如表1所示的用于修改另一个处理器核的微线程寄存器的请求。请求解复用器820还将该加载/存储请求转发到互斥请求发生器810以进行进一步处理。

响应解码器830被配置成确定来自互斥加速器的互斥响应是与读取数据相关联的读取数据响应还是用于授予独占访问权的独占访问响应。根据互斥响应类型和参数,如果响应指示授予独占权,则响应解码器830更新独占访问监测器850,并且如果响应是读取数据响应,则所述响应解码器将读取数据转发到读取数据多路复用器840。

读取数据多路复用器840被配置成选择来自本地数据缓存或互斥缓存的读取数据以返回到处理器核。应该执行该选择,以确保数据按照与请求顺序相同的顺序返回。

独占访问监测器850被配置成监测访问权授予的状态,所述状态指示处理器核是否已经获得用于访问互斥加速器的独占权。访问权授予的状态可以存储在独占访问监测器850中的访问权授予寄存器中,并且由互斥响应解码器830更新。

图8中还显示了以下程序,示出了处理器核如何通过统一缓存访问接口访问互斥加速器。

在进程1处,一个或多个处理器核执行用于对控制和状态寄存器(CSR)进行写入以请求mutex_cache_access的指令,这使得互斥请求发生器810向互斥加速器发送独占访问请求。在一个实施例中,CSR位于统一缓存访问接口内部。如果互斥缓存没有被任何处理器核获取,则互斥加速器执行轮询仲裁,以将访问权授予发送这种请求的竞争处理器核之一。此外,互斥加速器设置其自己的状态寄存器以防止再次对其他处理器核授予访问权。同时,互斥加速器向被授权的处理器核的互斥响应解码器830发送响应以指示独占访问监测器850将访问权授予寄存器设置为‘1’。同时,所述互斥加速器还可以向所有请求处理器核发送响应以通知哪个核获得了独占访问权。

需要进程2确保其在对互斥缓存进行读取或写入之前已经获得了独占访问权。在对互斥缓存进行读取或写入之前,每个请求处理器核执行用于从CSR中读取mutex_cache_grant状态的指令,其读取独占访问监测器850的状态。如果访问权授予的状态是‘1’,这意味着处理器核已经获得了独占访问权,并且因此其准备好对互斥缓存进行读取/写入。否则,所述处理器核将停止运行,直到获得对互斥加速器的访问权。

在进程3(即,3a和3b)处,处理器核使用标准的加载/存储指令来访问本地数据缓存或互斥加速器中的互斥缓存,就好像所述处理器核只访问一个缓存一样。如果请求解复用器820确定加载/存储地址没有落入互斥地址范围内,则其将读取/写入地址和写入数据转发到本地数据缓存的地址端口和写入数据端口863。另一方面,如果地址落入互斥范围内,则独占访问监测器850检查其内部状态以确定处理器核是否具有独占访问权。如果否,则意味着潜在的软件问题。因此,访问权授予监测器850可以生成异常信号以让处理器核运行异常子例程来处理所述问题。如果没有异常,则请求解复用器820将地址和写入数据转发到互斥请求发生器810,然后所述互斥请求发生器将读取请求或写入请求输出到互斥加速器的互斥请求端口864。同时,处理器核还可以经由互斥加速器发送用于修改其他处理器核中的微线程寄存器的请求,所述微线程寄存器包括线程请求寄存器、多优先级寄存器和互斥寄存器。互斥请求发生器810从请求解复用器820接收这样的请求,并相应地生成请求。一般来说,被授予独占访问权的处理器核可以以任意顺序访问互斥缓存或线程请求。

在进程4处,在处理器核已经完成对互斥缓存和/或微线程寄存器的访问之后,其应该尽快释放访问权限,使得其他未决处理器核可以获得独占访问权。处理器核可以经由CSR向互斥请求发生器810发送互斥释放请求,并且其相应地生成请求。

多页寄存器文件的上下文切换

如在处理器核部分中所提到的,由于上下文切换的开销很大,因此在一些实施例中,多页寄存器存储装置被集成在每个处理器核中,使得如果所请求的寄存器页被缓存,则处理器核可以通过改变寄存器页指针来切换上下文。为了在切换上下文时支持寄存器页刷新,处理器核支持用于检查与线程相关联的寄存器是否缓存在寄存器页之一中的指令。如果所请求的寄存器页没有被缓存,则其仍然可以将LRU页的内容与存储器内容进行交换。

考虑到时钟频率随着寄存器页数和每页中寄存器数量的增加而降低,寄存器页数受到目标操作频率和所选硬件平台(例如,ASIC(专用集成电路)或FPGA(现场可编程门阵列))的约束。为了最小化总体寄存器数量,优选的是根据页使用情况来优化每个页的寄存器数量。由于与用户线程相比,内核线程功能相对简单,因此在不损失性能的情况下为内核线程保留具有较少寄存器的页。此外,根据每页的寄存器数量,其他寄存器页可以被分成一个或多个页组。不同的线程与不同的页组相关联。

为此,在一些实施例中,每个处理器核进一步包括上下文切换模块和多页寄存器存储装置。所述多页寄存器存储装置包括多个寄存器组,每个存储组包括多个寄存器页,每个存储页包括多个寄存器;并且所述上下文切换模块被配置成在所请求的页被缓存时通过改变寄存器页指针来切换寄存器上下文,使得可以减少上下文切换开销。所述处理器核中的每个用户线程与所述多个存储组之一的一个页相关联。

假设不同页组中的寄存器表示为reg[g][p][r],其中,g表示页组,p是指所述页组g中的一个页,并且r是指页p中的一个寄存器。在一个实施例中,同一组中的所有页每页具有相同数量的寄存器。表示为curPage和curGroup的两个对照寄存器指示当前被访问的页和当前页组。给定访问寄存器r的指令,要访问的物理寄存器是reg[curGroup][curPage][r]。

在该实施例中,处理器核具有记录与每个寄存器页p和组g相关联的线程索引的存储装置,表示为page2Thread[g][p]。另外地,所述处理器核还具有记录组g的页p被访问的最近时间的存储装置,表示为page2Recent[g][p]。不失一般性地,假设page2Recent的值越大,则最近最少使用该页。

图9示出了根据本披露内容的一些实施例的处理器核中的上下文切换的示例过程900。过程900可以由处理器核的执行单元来执行。假设在901处,内核线程调度新线程t

在905处,curGroup被设置为g

如果在907处检查的条件不满足,则在909处,执行单元首先需要通过扫描page2Thread[g

如果在911处没有找到这样的p

在917处,LRU页中的现有寄存器内容(即page2Thread[g

根据上述示例实施例提供的多核架构和线程调度方法显著降低了线程调度开销并加速了线程操作。因此,这极大地有利于各种实时应用程序。同时,在多个处理器核中调度大量线程的可扩展性得到了大幅提高。

本发明的示例性实施例由此得到了充分描述。尽管描述参考了特定的实施例,但是本领域的技术人员将会清楚,本发明可以通过这些具体细节的变化来实施。因此,本发明不应被解释为局限于本文阐述的实施例。

不同附图中讨论的方法可以添加到其他附图中的方法中,或者与其他附图中的方法交换。进一步地,特定数值的数据值(比如特定的数量、数字、类别等)或其他特定信息应该被解释为说明性的,用于讨论示例实施例。这种特定信息不是为了限制示例实施例而提供的。

相关技术
  • 通过微架构带宽抑制进行处理器功耗控制和降低电压
  • 通过微架构带宽抑制进行处理器功耗控制和降低电压
技术分类

06120116381330