在中央处理单元(CPU)与辅助处理器之间的改进的函数回调机制的制作方法

文档序号:11635640阅读:256来源:国知局
在中央处理单元(CPU)与辅助处理器之间的改进的函数回调机制的制造方法与工艺

本公开涉及从辅助处理器(例如图形处理单元(gpu))到中央处理单元(cpu)的函数回调请求,并且更具体而言,涉及针对这样的回调请求的效率改进。



背景技术:

异构处理系统(例如将cpu和gpu(或辅助处理器或加速器)组合在一个芯片上的处理器)变得越来越普遍。除了执行图形处理之外,gpu还可以用于从cpu卸载相对并行密集的计算任务。因为gpu架构通常面向并行计算,所以与cpu相比,gpu可以能够为这些类型的任务提供更高的性能和更低的能耗。在硬件和软件两方面,对从cpu到gpu的函数调用的支持变得更容易获得。

虽然这些异构处理器和编程框架可以允许cpu将工作卸载到gpu,但是通常没有对应的机制以便gpu将工作卸载回到cpu上。这样的能力在许多情况下可能是有用的,包括例如:(1)调用可能不在gpu上运行的操作系统函数,(2)调用尚未移植(port)到gpu的代码,以及(3)执行相对循序的或遵循不太适合于并行执行的不规则控制路径的代码。

附图说明

随着以下具体实施方式继续进行,并且参考附图,所要求保护的主题的实施例的特征和优点将变得显而易见,其中,同样的附图标记表示同样的部件,并且其中:

图1例示了与本公开一致的示例性实施例的顶层系统图;

图2例示了与本公开一致的一个示例性实施例的框图;

图3例示了与本公开一致的一个示例性实施例的操作的流程图;

图4例示了与本公开一致的另一示例性实施例的操作的流程图;

图5例示了与本公开一致的另一示例性实施例的操作的流程图;

图6例示了与本公开一致的另一示例性实施例的操作的流程图;以及

图7例示了与本公开一致的另一示例性实施例的平台的系统图。

虽然以下具体实施方式将参考说明性实施例进行,但是对于本领域技术人员来说,许多替代、修改及其变化将是显而易见的。

具体实施方式

一般地,本公开提供用于在辅助处理器(例如,gpu或其它类型的加速器)和中央处理单元(cpu)之间的函数调用和回调的系统、设备、方法和计算机可读介质,其具有改进的效率(包括减小的延迟)。异构处理器可以包括被配置为访问共享虚拟存储器(svm)的一个或多个gpu和cpu。cpu可以对gpu生成函数调用请求,以将工作卸载到gpu上。gpu可能进而对cpu生成函数回调请求,以执行该工作负载的选定部分。回调请求可以通过存储在svm中的双端队列来传送,如下面将更详细地解释的。回调请求可以包括:指向要在cpu上执行的回调函数的指针(例如,存储器地址);指向要提供给回调函数和/或要由回调函数返回的数据的指针;以及与一个或多个回调完成机制(包括信令标志(signalingflag)和连续内核(continuationkernel))相关的附加信息。

图1例示了与本公开一致的一个示例性实施例的顶层系统图100。一个或多个gpu(或gpu核心)102被配置为与一个或多个cpu104共享虚拟存储器(svm)106。gpu102和cpu104可以是异构处理器或芯片上的系统(soc)(其中可以在处理器之间共享工作)的一部分。例如,作为更通用的处理器的cpu可能更适合于处理以相对循序的(或不规则的)流程执行的任务,而被设计为具有更为并行的架构的gpu可能更适合于处理并行计算任务。cpu104可以被配置为对gpu102生成函数调用请求,以将工作卸载到适合于gpu架构的gpu上。gpu102可以被配置为向cpu104生成函数回调请求,以执行该工作负载的更适合于cpu架构的选定部分。一旦回调请求完成,cpu104可以对发起请求的gpu102生成完成信号。

svm106可以被配置为使得cpu104和gpu102能够透明地共享包含数据结构的指针并提供存储器一致性,使得gpu可以看到由cpu做出的更新且反之亦然。svm106还可以被配置为提供原子操作和围栏(fence)操作以协调对共享存储器的访问并防止cpu104与gpu102之间的冲突。可以通过存储在svm106中的双端队列(deques)108传送回调请求和完成信号。队列是被配置为保存多个数据元素的一种数据结构。双端队列(或deque)是这样的队列:其被配置为使得数据元素可以被添加到队列的头端或尾端,或从队列的头端或尾端删除。deque的头端还可以被称为“前”或“顶”端,而尾端可以被称为“后”或“底”端。头和尾的名称仅用作deque操作描述中的方便参考点,并且不引用固定的物理位置。换而言之,术语“头”和“尾”可以在不改变本公开的任何实施例的含义或操作的情况下,在以下的描述的通篇中进行互换。在一些实施例中,deque可以被实现为圆形或环形缓冲器,以便在需要时允许更有效率的大小调整。

将数据添加到(或写入)deque的操作可以称为“推送”数据到deque的一端上。从deque中删除数据(或从deque读取)的操作可以称为“从deque的另一端“弹出”数据。如将在下面更详细地解释的,gpu102可以将回调请求推送到deque108上,并且cpu可以将其弹出以执行。

图2例示了与本公开一致的一个示例性实施例的框图200,其中,图1的系统被更详细地示出。gpu102被示出为包括任何数量的核心或执行单元(eu)102a、102b,其可以被配置为例如并行执行任务。这些任务可能与来自cpu104的函数调用相关联,这些函数调用旨在将工作从cpu卸载到gpu。在gpu核心或eu102上执行的任务进而可以请求去向cpu104的函数回调。

cpu104被显示为包括在cpu处理器上执行的任意数量的回调请求处理程序线程(也称为回调工作者线程)202a、202b。共享虚拟存储器(svm)106可以被配置为存储任意数量的deque108a、108b,尽管通常存在针对每个gpu核心的一个deque和针对每个deque的一个请求处理程序线程以避免争用并减少延迟。在一些实施例中,svm106还可以被配置为存储完成标志206a、206b。在特定核心(例如,102a)上执行的gpu任务可以通过将回调请求推送到与该核心108a相关联的deque上来请求对cpu104的函数回调。回调请求可以包括:指向要在cpu上执行的回调函数的指针,以及指向该函数的变元的指针。变元指针通常可以是指向一个数据结构的指针,该数据结构包含多个数据项目与参数(所述参数包括一个或多个存储器位置,cpu可以向所述存储器位置写入返回结果)。

cpu上的请求处理程序线程202a随后可以从该deque弹出回调请求,并执行与该回调请求相关联的函数。一旦该回调请求函数完成,请求处理程序线程就可以生成完成信号。在一些实施例中,完成信号可以通过执行原子操作来设置svm106中的完成标志206a(布尔变量)来完成。完成标志206可以由回调请求中的指针指定。gpu任务可以例如在执行其它任务时周期性地监控完成标志206a(使用原子操作),以确定何时回调请求已经完成。因此,gpu在由cpu执行回调期间不“停转(stall)”。

在一些实施例中,当请求处理程序线程202变为空闲时,例如当它们自己的deque变空时,请求处理程序线程202可以从彼此中窃取工作204。这可以通过随机选择候补deque来完成,从候补deque中弹出一个或多个回调请求。以这种方式窃取的工作可能会在多个请求处理程序线程中更有效地将工作铺开。

在一些实施例中,可以通过在svm106中固定(pin)或锁定deque108以避免由cpu或gpu产生页面故障,来进一步提高效率。如果deque的大小增长,则附加的存储也被固定。此外,可以在用户级别(例如,通过svm上的原子操作)执行工作排队,以避免与向操作系统(os)或gpu驱动程序的环过渡(ringtransition)相关联的开销。

可以为每个gpu核心(或eu)分配一个deque,以便由在该eu上执行的任务共享。因为deque的底端只能被该eu访问,所以数据位置(datalocality)得到改善,并且因为不同的eu(或gpu子片)被阻止争夺与该deque相关联的高速缓存线,所以争用减少。

用每个deque的一个专用的请求处理程序线程来配置cpu,可能有助于避免由长时间运行的cpu代码引起的deque备份。当deque包含剩余的回调请求时,该cpu线程将继续其执行。然而,如果deque变空,则cpu线程将尝试从其它随机选择的deque中窃取项目。如果cpu线程在允许的次数的窃取尝试后未能够成功地窃取回调请求,则它将在一定的时间段内暂停,以避免与更多的不成功的尝试相关联的成本。如果monitor/mwait指令在用户级别(环3)可用,则cpu线程可能会使用它们来等待,直到新的项目添加到该deque。否则,cpu线程可能会休眠一段时间,然后重新启动其正常操作:执行其自己的回调请求或从其它deque窃取。

图3例示了与本公开一致的一个示例性实施例的操作300的流程图。例示了gpu核心或执行单元(eu)102a、102b的操作。在操作302处,gpu核心发起cpu回调。在操作304处,回调请求被添加到与gpu核心相关联的deque。然后,gpu核心可以可选地在操作306处执行其它任务,同时等待回调的完成。在操作308处,与该请求相关联的完成标志206被测试,并且如果未设置,则在重新测试该完成标志之前,gpu可以继续执行其它任务(306)、添加附加的回调请求(304)或单单是等待/休眠一段时间。如果/当完成标志变为已设置时,则在操作310处,gpu核心读取从cpu回调提供的结果。这些结果可以在存储器位置处(例如在由回调请求中的指针指定的svm中)获得。cpu回调在操作312处完成。

图4例示了与本公开一致的另一示例性实施例的操作400的流程图。cpu回调工作者线程202a、202b的操作被示出为在操作402处开始。在操作404处,从与该工作者线程相关联的deque弹出回调请求。如果回调请求成功弹出,则在操作416处,用由回调请求提供的任何变元(argument)来调用/执行由回调请求指定的函数或过程。在回调函数完成之后,在操作418处,与该回调请求相关联的完成标志被设置,并且该工作者线程循环返回到操作404以处理下一个回调请求。

然而,如果弹出失败,例如,如果在与该工作者线程相关联的deque中没有更多回调请求,则在操作406处,使得窃取尝试的次数被增量。如果在操作408处,窃取尝试的次数超过了最大阈值,则在尝试另一个弹出之前,工作者线程在操作410处可以等待一段指定的时间。在一些实施例中,等待可以通过执行休眠指令或monitor/mwait指令来实现。否则,如果窃取尝试次数小于最大阈值,则在操作412处,从与其它工作者线程相关联的其它deque当中随机选择(例如,窃取)候补deque。然后,在操作414处,从候补的(窃取的)deque弹出回调请求,并且如上文所描述,该过程在操作416处继续。

图5例示了与本公开一致的另一示例性实施例的操作500的流程图。在该实施例中,提供了候补机制以避免要求gpu重复校验回调请求完成。这可以改善gpu的效率和能量消耗。该机制采用了“连续(continuation)”的使用,其代表了程序给定点处的计算状态。回调请求可以被配置为包括指向称为“连续内核”的gpu内核的指针或句柄,cpu在完成回调请求后将调用该指针或句柄。然后,gpu连续内核将在刚刚做出回调请求之后的点处逻辑地再继续执行原始gpu任务(或调用内核)。因此,gpu调用内核不被阻止,并且不必重复校验cpu回调是否已经完成。回调请求也可以被配置为包括将被传递回连续内核的数据指针(例如,连续变元指针)。通常,进行回调请求的gpu调用内核将在由连续变元指针引用的数据结构中的存储器位置中保存关键变量的值,以便它们随后可以被连续内核使用。另外,如果cpu回调函数要返回结果,则可以通过写入该数据结构中的存储器位置来实现。

现在参考图5(a),它描述了在gpu核心上的调用内核502的操作,在操作504处,调用内核发起cpu回调。在操作506处,堆栈变量被保存到由回调请求的连续变元指针引用的数据结构中。这些堆栈变量随后将被连续内核使用,以将调用内核从其要被停用(leftoff)的点处再继续(resume)。在操作508处,将回调请求添加到(推送到)与gpu核心或执行单元相关联的deque。在操作510处,gpu核心上的调用内核然后可以退出,从而允许例如gpu核心执行其它工作。虽然调用内核现在已经终止,但是连续内核随后可以使得意图在进行回调请求之后发生的计算或任务再继续,并且直接地如此进行,而不需要gpu等待或执行重复测试。

现在参考图5(b),描述了cpu回调工作者线程520的操作。在操作522处,以与上面结合图4描述的相似的方式来选择和执行工作。也就是说,从与工作者线程相关联的deque弹出回调请求,并且执行指定的回调函数。完成后,在操作524处,cpu回调工作者线程调用与该回调请求相关联的gpu连续内核。

现在参考图5(c),描述了gpu核心连续内核530的操作。在操作532处,被调用的连续内核加载堆栈变量(其先前由调用内核保存),并在操作534处,读取来自cpu回调的结果(如果有的话)。在操作536处,使用复原的堆栈变量来使得gpu核心调用内核再继续。

在一些实施例中,程序员可以通过编写存储堆栈变量的值所需的调用内核的代码,以及编写用于重新加载那些堆栈变量值的连续内核的代码,来实现cpu回调请求。然而,在其它实施例中,编译器或转换器可以被配置为发出(emit)该代码,并因此简化了使用cpu回调所需的编程工作。编译器还可以被配置为将包含cpu回调的单个gpu内核转换为适当的调用内核和连续内核的序列,以及关联的堆栈变量保存和复原(restore)代码,以进一步简化函数回调的使用。

图6例示了与本公开一致的另一示例性实施例的操作600的流程图。这些操作提供了请求在第一处理器与第二处理器之间的函数回调的方法。在操作610处,回调请求由第一处理器的执行单元(eu)推送到第一双端队列(deque)。deque被存储在耦合到第一和第二处理器的共享的虚拟存储器(svm)中。在操作620处,由在第二处理器上执行的请求处理程序线程从第一deque弹出回调请求中的一个回调请求。在操作630处,请求处理程序线程执行由弹出的回调请求指定的函数。在操作640处,响应于函数的完成,请求处理程序线程对eu生成完成信号。

图7例示了与本公开一致的一个示例性实施例的系统图700。系统700可以是移动平台710或计算设备(诸如,举例来说,智能手机、智能平板电脑、个人数字助理(pda)、移动互联网设备(mid)、可变形平板电脑、笔记本或膝上型计算机或任何其它适当的设备)。然而,应当理解,本文描述的系统的实施例不限于移动平台,并且在一些实施例中,系统700可以是工作站或台式计算机。设备通常可以经由显示元件760(诸如,举例来说触摸屏、液晶显示器(lcd)或任何其它适当的显示类型)向用户呈现各种界面。

系统700被示出为包括第一处理器或cpu104以及第二处理器或gpu102,第一处理器或cpu104可被配置为例如通用处理器,第二处理器或gpu102可被配置为以更高效率执行并行操作。在一些实施例中,处理器102和104可以被实现为任意数量的处理器核心。通常,处理器(或处理器核心)可以是任何类型的处理器(诸如,举例来说,微处理器、嵌入式处理器、数字信号处理器(dsp)、图形处理器(gpu)、网络处理器、现场可编程门阵列或被配置为执行代码的其它设备)。处理器可以是多线程核心,因为它们可以为每个核心包括多于一个硬件线程上下文(或“逻辑处理器”)。系统700还被示为包括svm106,其包括任意数量的deque108,deque108被配置为实现在先前描述的处理器之间的改进的函数回调请求。

系统700被示出还包括存储器730。存储器730可以被耦合到处理器。存储器730可以是本领域技术人员已知的或以其它方式可用的各种各样的存储器(包括存储器层级和/或存储器高速缓存的各种层)中的任何一种。应当理解,处理器和存储器可以被配置为存储、托管和/或执行一个或多个用户应用程序或其它软件模块。这些应用程序可以包括但不限于例如任何类型的计算、通信、数据管理、数据存储和/或用户界面任务。在一些实施例中,这些应用程序可以采用或与移动平台710的任何其它部件交互。

系统700还被示为包括输入/输出(io)系统或控制器750,其可被配置为实现或管理处理器102、104和系统700的其它元件(包括显示元件760)和/或系统700外部的其它元件(未示出)之间的数据通信。

系统700还被示为包括耦合到处理器并被配置为存储程序、应用程序和/或数据的存储系统740(例如硬盘驱动器(hdd)或固态驱动器(ssd))。

系统700还被示为包括网络接口模块770,网络接口模块770可以包括无线通信能力(诸如,举例来说,蜂窝通信、无线保真(wifi)、和/或近场通信(nfc))。无线通信可以符合或以其它方式与任何现有或尚未开发的通信标准(包括wi-fi和移动电话通信标准的过去、当前和未来版本)兼容。

应当理解,在一些实施例中,系统700的各种部件可以在片上系统(soc)架构中组合。在一些实施例中,部件可以是硬件部件、固件部件、软件部件或硬件、固件或软件的任何适当的组合。

本文描述的方法的实施例可以在包括一个或多个存储介质的系统中实现,该一个或多个存储介质具有单独地或组合地存储在其上的指令,该指示在由一个或多个处理器执行时执行该方法。这里,处理器可以包括例如系统cpu(例如,核心处理器)和/或可编程电路。因此,意图是根据本文描述的方法的操作可以跨多个物理设备(诸如,举例来说,在几个不同物理位置处的处理结构)分布。此外,意图是可以单独地或以子组合来执行方法操作,如本领域技术人员将理解的。因此,不需要执行每个流程图的所有操作,并且本公开明确地意图使得如被本领域普通技术人员所理解的这样的操作的所有子组合都被使能。

存储介质可以包括任何类型的有形介质(例如,任何类型的盘,包括软盘、光盘、压缩盘只读存储器(cd-rom)、可重写的压缩盘(cd-rw)、数字多功能盘(dvd)和磁光盘、诸如只读存储器(rom)的半导体器件、诸如动态和静态ram的随机存取存储器(ram)、可擦除可编程只读存储器(eprom)、电可擦除可编程只读存储器(eeprom)、闪速存储器、磁卡或光卡或适合于存储电子指令的任何类型的介质)。

在本文任何实施例中使用的“电路”可以包括例如单独地或以任何组合形式存储由可编程电路执行的指令的硬连线电路、可编程电路、状态机电路和/或固件。应用程序可以体现为可以在诸如主处理器或其它可编程电路的可编程电路上执行的代码或指令。在本文的任何实施例中使用的模块可以被实现为电路。电路可以被实现为诸如集成电路芯片的集成电路。

因此,本公开提供了用于实现在第一处理器与第二处理器之间的函数回调请求的系统、设备、方法和计算机可读介质。以下示例涉及另外的实施例。

根据示例1,提供了一种用于实现在第一处理器与第二处理器之间的函数回调请求的系统。该系统可以包括耦合到第一和第二处理器的共享虚拟存储器(svm),svm被配置为存储至少一个双端队列(deque)。该示例的系统还可以包括第一处理器的执行单元(eu),该eu与第一deque相关联,被配置为将回调请求推送到第一deque。该示例的系统还可以包括在第二处理器上执行的请求处理程序线程,其被配置为:从第一deque弹出回调请求中的一个回调请求;执行由弹出的回调请求指定的函数;以及响应于函数的完成而对eu生成完成信号。

示例2可以包括示例1的主题,并且回调请求包括:函数指针,用于指定要由第二处理器执行的函数;以及变元指针,用于指定针对要提供给被执行函数的数据以及要提供给eu的由被执行函数生成的结果的在svm中的位置。

示例3可以包括示例1和示例2的主题,并且响应于检测到第一deque为空,请求处理程序线程进一步从第二deque弹出回调请求中的一个回调请求,该第二deque与第二eu相关联。

示例4可以包括示例1-3的主题,并且deque被固定在svm中,以防止响应于由eu和请求处理程序进行的访问尝试而产生页面错误。

示例5可以包括示例1-4的主题,并且完成信号是用于在svm中设置完成标志,并且eu进一步用于轮询完成标志。

示例6可以包括示例1-5的主题,并且完成信号用于触发eu上的连续内核,连续内核用于复原先前保存的堆栈变量。

示例7可以包括示例1-6的主题,并且请求处理程序线程响应于从任何deque弹出回调请求中的一个回调请求而进一步休眠。

示例8可以包括示例1-7的主题,并且休眠包括执行monitor/mwait指令。

示例9可以包括示例1-8的主题,并且第一处理器是图形处理器单元(gpu),并且第二处理器是通用的中央处理器单元(cpu)。

根据示例10,提供了一种用于在第一处理器与第二处理器之间的函数回调请求的方法。该方法可以包括:由第一处理器的执行单元(eu)将回调请求推送到第一双端队列(deque),deque存储在耦合到第一处理器和第二处理器的共享虚拟存储器(svm)中;由在第二处理器上执行的请求处理程序线程从第一deque弹出回调请求中的一个回调请求;由请求处理程序线程执行由弹出的回调请求指定的函数;以及由请求处理程序线程响应于函数的完成而对eu生成完成信号。

示例11可以包括示例10的主题,并且回调请求包括:函数指针,用于指定要由第二处理器执行的函数;以及变元指针,用于指定针对要提供给被执行函数的数据以及要提供给eu的由被执行函数生成的结果的在svm中的位置。

示例12可以包括示例10和示例11的主题,并且还包括:响应于检测到第一deque为空,由请求处理程序线程从第二deque弹出回调请求中的一个回调请求,该第二deque与第二eu相关联。

示例13可以包括示例10-12的主题,并且进一步包括:将deque固定在svm中,以防止响应于由eu和请求处理程序进行的访问尝试而产生页面错误。

示例14可以包括示例10-13的主题,并且生成完成信号还包括:在svm中设置完成标志以供eu进行轮询。

示例15可以包括示例10-14的主题,并且生成完成信号还包括:触发eu上的连续内核,连续内核用于复原先前保存的堆栈变量。

示例16可以包括示例10-15的主题,以及还包括由请求处理程序线程响应于从所述deque中的任意一个deque弹出回调请求中的一个回调请求的失败而进行休眠。

示例17可以包括示例10-16的主题,并且休眠还包括执行monitor/mwait指令。

根据示例18,提供了至少一个具有存储在其上的指令的计算机可读存储介质,该指令在由处理器执行时对第一处理器与第二处理器之间的函数回调请求引起以下操作。该操作可以包括:由第一处理器的执行单元(eu)将回调请求推送到第一双端队列(deque),该deque存储在耦合到第一处理器和第二处理器的共享虚拟存储器(svm)中;由在第二处理器上执行的请求处理程序线程来从第一deque弹出回调请求中的一个回调请求;由请求处理程序线程执行由弹出的回调请求指定的函数;以及由请求处理程序线程响应于函数的完成而对eu生成完成信号。

示例19可以包括示例18的主题,并且回调请求包括:函数指针,用于指定要由第二处理器执行的函数;以及变元指针,用于指定针对要提供给被执行函数的数据以及要提供给eu的由被执行函数生成的结果的在svm中的位置。

示例20可以包括示例18和19的主题,还包括响应于检测到第一deque为空,由请求处理程序线程从第二deque弹出回调请求中的一个回调请求,该第二deque与第二eu相关联。

示例21可以包括示例18-20的主题,还包括将deque固定在svm中,以防止响应于由eu和请求处理程序进行的访问尝试而产生页面错误。

示例22可以包括示例18-21的主题,并且生成完成信号还包括:在svm中完成标志以供eu进行轮询。

示例23可以包括示例18-22的主题,并且生成完成信号还包括:触发eu上的连续内核,连续内核用于复原先前保存的堆栈变量。

示例24可以包括示例18-23的主题,还包括由请求处理程序线程响应于从所述deque中的任意一个deque弹出回调请求中的一个回调请求的失败而进行休眠。

示例25可以包括示例18-24的主题,并且休眠还包括执行monitor/mwait指令。

根据示例26,提供了一种用于在第一处理器与第二处理器之间的函数回调请求的系统。该系统可以包括用于由第一处理器的执行单元(eu)将回调请求推送到第一双端队列(deque)的模块,该deque存储在耦合到第一处理器和第二处理器的共享虚拟存储器(svm)中;用于由在第二处理器上执行的请求处理程序线程从第一deque弹出回调请求中的一个回调请求的模块;用于由请求处理程序线程执行由弹出的回调请求指定的函数的模块;以及用于由请求处理程序线程响应于该函数的完成对eu生成完成信号的模块。

示例27可以包括示例26的主题,并且回调请求包括:函数指针,用于指定要由第二处理器执行的函数;以及变元指针,用于指定针对要提供给被执行函数的数据以及要提供给eu的由被执行函数生成的结果的在svm中的位置。

示例28可以包括示例26和27的主题,还包括用于执行以下操作的模块:响应于检测到第一deque为空,由请求处理程序线程从第二deque弹出回调请求中的一个回调请求,所述第二deque与第二eu相关联。

示例29可以包括示例26-28的主题,还包括用于将deque固定在svm中以防止响应于由eu和请求处理程序进行的访问尝试而产生页面错误的模块。

示例30可以包括示例26-29的主题,并且用于生成完成信号的模块还包括用于在svm中设置完成标志以供eu进行轮询的模块。

示例31可以包括示例26-30的主题,并且用于生成完成信号的模块还包括用于触发eu上的连续内核的模块,连续内核用于复原先前保存的堆栈变量。

示例32可以包括示例26-31的主题,还包括用于由请求处理程序线程响应于从所述deque中的任意一个deque弹出回调请求中的一个回调请求的失败而进行休眠的模块。

示例33可以包括示例26-32的主题,并且用于休眠的模块还包括用于执行monitor/mwait指令的模块。

本文中使用的术语和表述被用作描述而不是限制的术语,并且在使用这些术语和表述中没有意图排除所示和所描述(或其部分)的特征的任何等同物,并且认识到在权利要求的范围内可以进行各种修改。因此,权利要求旨在涵盖所有这样的等同物。本文已经描述了各种特征、方面和实施例。如本领域技术人员将理解的,特征、方面和实施例易于彼此组合以及变化和修改。因此,本公开应当被认为包括这样的组合、变化和修改。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1