用于调用多线程加速器的装置和方法_3

文档序号:9221608阅读:来源:国知局
路。
[0044]在各实施例中,不管加速器如何被提供有主线程的上下文,主线程的上下文(例如,当加速器被调用时(例如,就在这之后),机器针对主线程的架构状态)未被修改,除了修改(例如,递增)指令指针以及调整某些寄存器以便反映执行状态(成功/失败以及相关细节)之外。换言之,对微线程中的主线程上下文/架构状态的任何改变对主线程的调用应用隐藏。这允许微线程按顺序执行。
[0045]在进一步的实施例中,由于加速器可在与主线程相同的程序存储器空间之外操作,作为调用过程的一部分,指令指针被改变为指向加速器代码的开始。这样,主线程的指令指针上下文未被复制,作为微线程在之外操作的加速器调用的一部分(在加速器已经完成其操作之后,其可被复制为将程序流返回主线程)。在此,值得指出的是期望编程微线程加速器具有其自身的指令取出单元,用于从程序存储器取出微线程指令。
[0046]取决于方法,加速器的微线程之一可被认为是在其他微线程之前开始操作并且控制其他微线程中的一个或多个微线程的开始的主微线程。在这种情况下,微线程调度本质上由创建微线程的编译器执行(通过其制作主微线程代码)。在实施例中,指令指针被改变为指向主微线程的开始。该方法可适合于线程之间存在某些相关性的情况(即,线程不完全隔离地操作)。
[0047]在替代实施例中,例如,其中微线程彼此不具有相关性或依赖性,一组指令指针被传递到加速器,每个指令指针具有用于多个微线程(诸如有待由加速器执行的代码的所有微线程)中的一个不同微线程的对应起始地址。微线程仅例如并行地通过直接引用其对应的指令指针开始。该组指令地址可被作为通用CPU核的主线程所进行的调用的输入参数传递。在此,允许由ABI使用的单独的寄存器可用于每个不同的起始地址。在另一种方法中,如果加速器代码能够引用SMD寄存器空间,起始地址被保持在SMD寄存器空间内的单个向量内。
[0048]如果微线程具有某种相关性,在实施例中,微线程调度提示由主线程作为加速器调用的输入参数提供给加速器。例如,描述不同微线程的起始序列顺序的某个方面的特定输入参数可被从主线程传递到加速器硬件。加速器硬件指令取出逻辑引用该信息以便理解或确定应当在哪个周期时间启动哪些微线程。用于各个微线程的指令地址指针可由上述任何技术传递到加速器。在实施例中,编译器向主线程代码添加提示。
[0049]在实施例中,加速器返回给主线程的特定结果也以与ABI—致的方式呈现。在实施例中,加速器的主微线程将多个微线程的结果组合和/或监督为单个结果。在实施例中,在加速器产物被返回到主线程之前,通用CPU核的寄存器空间内的任何微线程上下文被切换出通用CPU核的寄存器空间,并且如果主线程的上下文在加速器操作期间被切换出主(PU核的寄存器空间,其被切换回通用CPU核的寄存器空间。这样,主线程返回其调用加速器的状态并且重新唤醒以便找到从加速器返回的结果。该结果可以是在标量寄存器空间中提供的标量或者在向量寄存器空间(例如,SIMD寄存器空间)中提供的向量。
[0050]在此,对于上述上下文切换活动中的任何活动,其中主线程或微线程上下文被切换到/切换出通用CPU核的寄存器空间,通用CPU核具有被设计成用于实现对应的上下文切换活动的对应逻辑电路。
[0051]异常、中断和违规
[0052]异常是通常由微线程本身在加速器的微线程中的一个微线程内检测到的问题。中断是位于加速器外部的事件(例如,输入新的用户命令)。
[0053]在实施例中,参照图4,在或者异常或者中断的情况下,加速器微线程暂停执行401。针对每个微线程,将加速器内部的任何状态信息外部地保存到诸如存储器(例如,调用加速器的应用的存储器空间(例如,用户栈))、加速器私有的寄存器空间或主CPU核402的寄存器空间。本质上,微线程的状态被冻结并且被保存在外部。控制返回到主线程,该主线程在其调用加速器的时刻在其状态下唤醒(栈指针可被修改以便反映附加栈使用)403。在此,在异常的情况下,加速器可返回“异常”的结果以便通知主线程需要异常处理器。在中断的情况下,通用CPU核上的另一个活跃线程可触发加速器转储其状态并唤醒主线程。
[0054]然后主线程调用处理问题的异常和/或中断处理器(例如,通过在异常的情况下引用保存在外部的微线程状态信息)404。在问题被处理之后,中断/异常处理器将微线程的保存在外部的状态恢复到加速器405内。然后,加速器的微线程从原始中断/异常点重新开始操作406。
[0055]在替代方法中,在异常的情况下,不是返回主线程以便使其调用异常处理器,而是,加速器硬件直接调用异常处理器而不唤醒主线程并且将指针传递到异常线程的所保存状态信息的位置(在此,响应于异常,再次将加速器内的微线程的内部状态信息保存在外部)。根据该方法,异常处理器直接引用异常代码并解决问题。执行随后被返回到加速器,例如不涉及主CPU线程。加速器重新调用保存在外部的微线程状态信息并重新开始操作。
[0056]在实施例中,与主线程对加速器的原始调用相关联的状态信息被保存在寄存器或存储器空间内,从而使得程序控制可从异常处理器直接传递到加速器而不涉及主线程。根据一种方法,实现IRET指令(或用于确定当从中断处理器返回时将程序流指引到何处的类似指令)的逻辑电路包括使用所保存的调用状态信息将流返回到加速器的微代码或其他电路。这样,IRET指令具有表明中断是来自加速器并且作为响应将程序流返回加速器的某种类型的输入参数。在无需表明异常是来自加速器的输入参数的情况下,IRET指令逻辑/微代码将程序流返回主CPU线程。
[0057]在其他实施例中,异常处理器可被重新设计成用于使用所保存的调用状态信息将流返回到加速器,或者异常微线程被允许实际上尽可能继续操作,就像没有异常被丢弃。在后一种方法中,无需外部地保存加速器微线程状态。当加速器最终将其结果返回到主线程时,更早的异常致使主线程调用异常处理器。当异常处理器解决问题时,加速器被从头重新调用,仿佛加速器之前尚未被调用。在此,所保存的调用的所保存的状态信息可用于重新调用加速器。
[0058]从不符合底层机器所确立的要求的代码触发违规。根据一种可能性,加速器本身可强加限制,诸如对所加速的应用回调代码的限制(例如,仅64位模式等等)。在微线程代码不符合为加速器所确立的要求的情况下,违规可被如此标记但是与异常相同或类似地处理。
[0059]在一个实施例中,异常处理器可使用其中保存微线程状态的存储区域来在非加速模式下完成原始加速操作(例如,通过通用CPU核)。在操作完成时,异常处理器将执行返回到加速器调用之后的指令。可替代地或者结合地,触发违规的指令在软件中执行(例如,通过由通用CPU核执行的指令)以便实现其操作。当其操作重新开始时,引起违规的微线程如上所述由处理器用标记来保持其状态以便将操作返回违规指令之后的下一指令。
[0060]在另一种方法中,违规对软件(例如,调用加速器的主应用软件程序)隐藏。也就是,不存在异常处理器。而是,处理器使用微代码来以对软件隐藏的方式执行以下内容:1)
当前第3页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1