管理计算系统中协处理器的计算资源的方法和系统 版权声明和许可:
本专利文献的一部分公开内容包含受版权保护的材料。版权所有者不反对任何人以专利商标局的文件或记录的形式对专利文献或专利公开内容进行传真复制,但是保留所有版权。以下公开内容适用于所述文献Copyright2001,Microsoft Corp。
【技术领域】
本发明涉及管理计算系统中协处理器的计算资源的系统和方法。
背景技术
自本世纪60年代中叶的第一个分时系统开始,操作系统(OS)实现了许多允许多个互不了解的应用程序共享计算机计算资源的方法。通过为各个应用程序分配较小的″时间片″,并且在″时间片″用完时中断应用程序,计算机可以为各个应用程序提供正在计算机上单独运行的假象。例如,2个应用程序可以按照1毫秒的时间片在系统上运行。在这种情况下,各个应用程序的运行速度略微小于其在计算机上单独运行时的速度的一半(由于2个应用程序之间的切换所需的开销),其中各个应用程序每秒均得到大约500个时间片。较长的时间片产生较少的开销,并且产生粗的执行粒度,使得系统不太适于定时要求较高的应用程序。
人们在开发各种诸如虚拟存储器、进程和线程的抽象模型方面做了大量工作,这些抽象模型进行交互以便为应用程序提供允许共享中央处理单元(CPU)地计算资源的软件模型。然而这些抽象模型还没有强大到能够适用于管理图形处理单元(GPU)和主机微处理器中的计算资源的程度。
在这点上,最近几年来,图形处理器的功能变得非常强大。PC图形芯片中晶体管数量的增长速度远超过Moore定律所能预见的速度,即图形芯片中晶体管数量已经从1995年的大约200,000个增长到2001年的大约60,000,000个。这些芯片的计算能力也随着晶体管数量的增加而提高;也就是说,图形芯片不仅可以处理更多的数据,而且也可以为数据提供更加复杂的计算。结果,在今天,计算机系统中的图形芯片可以被看作是对主机微处理器的计算资源的补充。
图形芯片提供的软件模型略微不同于主机微处理器提供的软件模型。两个模型均涉及上下文,即一组精确描述处理器正进行的处理的数据。上下文可以包含数据寄存器或控制寄存器,数据寄存器包含当前正被执行的任何操作的中间结果,控制寄存器在处理器执行某些操作时改变其行为。例如在32位INTEL处理器上,EAX数据寄存器被用作累加器,以执行乘法运算,保存函数返回值,等等。浮点控制字(FPCW)是控制寄存器,控制浮点指令如何舍入不精确结果(单、双或扩展精度,到正或负极限,到零、或到最接近值;等等)。然而通常情况下图形处理器在控制寄存器中具有的状态远多于通用微处理器中的状态。图形处理器的高性能源于其流水线式、灵活且固定的功能体系结构。许多控制寄存器状态需要设置图形处理器执行的操作。例如,一组控制寄存器可以包含(a)基地址和当前充当输入的一或多个纹理贴图(texture map)的尺寸,(b)纹理寻址和过滤模式,在纹理值和插值颜色值之间执行的混和操作,(c)应用于碎片(fragment)的alpha和Z值以决定是否将其合并到颜色缓冲区中的测试,和(d)当在最终着色阶段把颜色碎片合并到颜色缓冲区中时使用的alpha混合操作。虽然图形处理器包含许多诸如控制其处理的迭代器的临时寄存器,然而通常不必在上下文切换期间保存那些寄存器,因为在需要保存那些寄存器的粒度上不允许进行上下文切换。在任何情况下,即使在上下文切换期间必须保存这些寄存器,软件应用通常也不能直接得到它们。易失寄存器状态对客户端软件的不透明性仅仅是图形处理器提供的软件模型和通用微处理器提供的软件模型之间的一个区别。
目前,对管理诸如图形处理器的协处理器的计算资源的尝试已经尽其可能。到目前为止,由于每次只有一个应用程序活跃,尚未对这些计算资源的细致管理提出更多的要求。在3D加速硬件最初被用于加速例如3D模拟和动画的商业工作站应用程序环境中,最终用户通常每次只操作一个应用程序。即使在指定时间有不止一个应用程序处于活跃状态,最终用户仍然在切换到另一个应用程序之前在当前应用程序中完成大量工作,并且应用程序之间的切换粒度大约为秒级或者更大。游戏应用程序,即第二类因图形硬件加速而根本受益的应用程序通常也是每次只运行一个。事实上,Windows中的DIRECTX应用编程接口(API)特别允许游戏应用程序获得对计算机系统中硬件资源,尤其是图形芯片的独占访问。
随着图形芯片功能的更加强大,自然期望增加那些要求从中得到大量计算资源的活跃应用程序的数量,并且使这些应用程序之间的切换粒度变得更加精细。在某些领域中,这种趋势已经很明显。例如,在2001年间,诸如硬件加速运动补偿(″mocomp″)和整数离散余弦变换(″IDCT″)的视频解码加速已经被加入多数图形芯片中。由于可以同时启动视频重放应用程序和运行其它应用程序,重放视频和运行任何其他向图形处理器要求计算资源的应用程序需要细致管理那些资源,以保证视频重放和其它应用程序均使最终用户得到高质量的体验。
其它增加对图形处理器计算资源的要求的潜在来源包含多个应用程序输出的合成,和诸如GDI(图形开发接口)或GDI+的2D图形API对硬件加速的改进利用。概括地说,有关计算系统中图形处理器的计算资源的高效和有效管理的需求只会随着图形处理器自身的能力、灵活性和速度的提高,以及同时使用图形处理器计算资源的应用程序的数量的提高而不断增加。
【发明内容】
基于上述考虑,本发明提供了管理计算系统中诸如图形处理器的协处理器的计算资源的系统和方法。所述系统和方法用于管理协处理器的计算资源,以利于在多任务环境中高效执行多个应用程序。通过允许所执行的多个线程并行组成命令缓冲区,提交那些命令缓冲区以便操作系统调度和分配,并且监视通知命令缓冲区完成的中断,系统允许多个应用程序高效共享系统中的可用计算资源。
在各种实施例中,本发明提供了控制具有主处理器的主机计算系统中协处理器的计算资源的方法,其中该方法包含通过由主处理器提交到协处理器的命令缓冲区控制计算系统的一或多个协处理器,根据命令缓冲区中的命令向主机计算系统回送数据,以及通过主机计算系统中包含的管理对象调度命令缓冲区的发送,其中主机计算系统上实现的多个应用程序可以同时得到协处理器的计算资源。
在相关和其它实施例中,本发明提供了计算设备和计算机可读介质,在所述计算机可读介质上存储多个用于控制具有主处理器的主机计算系统中协处理器的计算资源的计算机可执行模块,计算设备和计算机可执行模块均包含管理对象,所述管理对象通过由主处理器提交到协处理器的命令缓冲区控制计算系统的协处理器,并且调度命令缓冲区的发送。计算设备和计算机可执行模块还均包含根据命令缓冲区中的命令向主机计算系统回送数据,从而使主机计算系统上实现的多个应用程序可以同时得到协处理器的计算资源的装置。
下面描述本发明的其它特性和实施例。
【附图说明】
下面参照附图描述管理图形处理器的计算资源的系统和方法,其中:
附图1A的模块图示出了具有各种可以实现本发明的计算设备的示例性网络环境;
附图1B的模块图示出了可以实现本发明的示例非限制性计算设备;
图2图解了命令缓冲区在被应用程序用于向协处理器发送命令时的示例性生命周期;
图3A-3E图解了将运行时刻级命令转换成硬件专用命令的驱动程序部件的示例性实现;
图4图解了本发明的用户模式驱动程序DLL的示例性实现;
图5详细图解了当应用程序调用应用编程接口以执行图形操作时出现的示例性事件序列;
图6根据本发明的一个实施例图解了示例性的硬件可使用的典型命令缓冲区格式;而
图7根据本发明的一个实施例图解了示例性的中间典型命令缓冲区格式。
【具体实施方式】
综述
如背景技术部分所述,有许多当前已有和潜在的、增加对图形处理器计算资源的要求的来源。当不止一个这样的来源几乎同时要求访问图形处理器时,图形处理器不能轻松地满足所有这些来源的要求。于是,本发明提供各种管理多个应用程序的图形处理请求的调度和分配的方式,以便确保诸如图形处理单元的协处理器单元的计算资源被高效地分配给请求方应用程序。因此,本发明提供用于控制主机计算系统中协处理器的计算资源的方法和系统,其中通过由主处理器提交的命令缓冲区控制协处理器,通过主机计算系统中诸如操作系统的对象调度向协处理器的命令缓冲区发送,使得多个应用程序可以同时得到协处理器的计算资源。
术语表
下面是后面对本发明的详细描述中使用的术语和引用的各种术语的对应定义。
图形加速端口(AGP)是利于从主机微处理器向图形外设快速发送数据的高速总线。
命令缓冲区是被图形硬件使用的特定于硬件的绘图命令流,例如参见下面对令牌流的定义。
上下文是被处理器用来执行命令的硬件状态。这里,线程上下文是指主机微处理器的硬件状态,而硬件上下文是指图形硬件的状态。在可以执行指令流(主机上)或命令流(图形芯片上)之前加载上下文。
中央处理单元(CPU)包含主机微处理器。
设备驱动程序接口(DDI)是被操作系统用来与硬件驱动程序交互的标准化接口。
显示列表是一系列图形硬件命令,这些命令已经被记录,使得可以马上″重放″命令,其效率高于再次执行初始命令系列的效率。由于显示列表已经被转换成特定于硬件的形式,显示列表常常对应用程序非透明,即它们不能被编辑。
动态链接库是可执行代码单元,可以被链接到进程中,并且可以被多个进程同时共享。本文假定DLL的代码在用户模式下执行。
直接存储器访问(DMA)是允许外设直接读取或写入主机可访问存储器的硬件特性。
延迟过程调用(DPC)是被诸如Windows的操作系统调用的例程,通常响应中断而执行,但是以略微低于中断服务例程(参见下面的ISR)的优先权运行。通常情况下,中断服务例程应当完成解决中断所需的最小处理,并且将DPC排入队列以便完成响应中断所需的其它工作。
图形处理器是硬件外设,被用来加速诸如位块传送(BLT)的图形绘图命令,和诸如三角栅化的3D图形基本绘图进程。在这点上,图形处理器与主机微处理器的更加通用和欠灵活的资源形成反差。
主机微处理器是执行操作系统和/或在操作系统中运行的应用程序的处理器。系统中的主机微处理器与图形处理器或系统中的其它计算资源形成反差。
中断是允许外设将主机微处理器偏离其当前处理并且将控制转移到存储器中特殊位置的硬件特性。操作系统使用这个机制调用被称为中断服务例程(ISR)的驱动程序代码以响应中断。
中断服务例程(ISR)是通常在设备驱动程序中的函数,当驱动程序控制的硬件发出中断时被操作系统调用,例如参见DPC。
运行时(JIT)编译是将额外步骤引入从源代码到目标代码的转换的编译处理。在这点上,源代码被转换成可编译、独立于硬件、被发送到客户端计算机的中间语言,其中源代码在″运行时″被编译成可以在客户端上运行的目标代码。
内核模式是允许系统代码直接访问硬件资源的特权处理器模式。
进程是操作系统中的工作的逻辑分割。在Windows中,进程包括虚拟地址空间,可执行程序,执行的一或多个线程,用户资源定额的某部分,和操作系统已经分配给进程的线程的系统资源。
资源是可以授权多个线程非独占访问或授权单线程独占访问的同步原语。
同步原语是可用于同步多个线程对诸如临界段、互斥、信号灯或事件的共享资源的访问的对象。
线程是可执行实体,包括程序计数器、用户模式堆栈、内核模式堆栈和一组寄存器数值。
令牌流是独立于硬件的令牌的流,描述一系列绘图操作。令牌流可以被特定于硬件的软件构件,例如驱动程序转换成命令缓冲区或其它硬件命令系列。
用户模式是不允许代码直接访问硬件资源的主机微处理器模式。
示例性联网和分布式环境
本领域的普通技术人员可以理解,计算机、或其它客户端或服务器设备可以被用作计算机网络的一部分,或者被用在分布式计算环境中。在这点上,本发明涉及任何计算机系统,所述计算机系统具有任意数量的存储器或存储单元,以及在任意数量的存储单元或卷上出现的任意数量的应用程序和进程,所述应用程序和进程可以向协处理器资源发出请求。本发明适用于具有网络环境或分布式计算环境中采用的服务器计算机和客户端计算机、具有远程或本地存储的环境。本发明也可以被应用于独立的计算设备,所述计算设备具有编程语言功能,以及解释和执行能力,以便产生、接收和发送涉及远程或本地服务的信息。
分布计算利于通过计算设备和系统之间的直接交换共享计算机资源和服务。这些资源和服务包含信息交换,高速缓冲存储和文件的磁盘存储。分布计算利用了网络连接,允许客户端均衡其共同拥有的处理能力,以使整个企业受益。在这点上,各种设备可以具有能够请求通过本发明的技术管理的协处理资源的应用程序、对象或资源。
图1A提供了示例性联网或分布式计算环境的示意图。分布式计算环境包括计算对象10a、10b等等,以及计算对象或设备110a、110b、110c等等。这些对象可以包括程序、方法、数据存储、可编程逻辑等等。对象可以包括例如PDA、电视、MP3播放器、电视、个人计算机等等的相同或不同设备的部分。各个对象可以通过通信网络14与其它对象通信。网络本身可以包括为图1A的系统提供服务的其它计算对象和计算设备。根据本发明一个方面,各个对象10或110可以包含可能请求主机系统的协处理资源的应用程序。
在分布式计算体系结构中,通常被单纯用作客户端的计算机之间直接通信,并且可以充当客户端和服务器,其中假定无论被用作客户端还是服务器,其作用对于网络均是最高效的。这降低了服务器上的负载,并且允许所有客户端访问其它客户端上的可用资源,从而提高了整个网络的能力和效率。于是,根据本发明的协处理资源管理可以分布在客户端和服务器中间,从而能够以对于整个网络高效的方式管理专用协处理。
分布计算有助于企业更有效地跨越不同地理界限提供服务和能力。此外,分布计算可以将数据移动到更接近使用数据的地点,该地点充当网络高速缓存机构。分布计算还允许计算网络使用智能代理动态地一起工作。代理驻留在同层计算机上,并且前后传送各种信息。代理也可以启动代表其它同层系统的任务。例如,智能代理可用于划分网络上的任务的优先权,改变传输流,本地文件搜索,或确定诸如病毒的反常行为并且在其影响网络之前终止该行为。也可以考虑所有种类的其它服务。由于高度专用的协处理资源实际上可以物理位于一或多个位置上,对请求使用协处理资源的应用程序的管理在这种系统中具有很高的实用性。
也可以理解,诸如110c的对象可以被驻留在其它计算设备10或110上。于是,虽然描述的物理环境可以示出作为计算机的被连接设备,然而这种图解只是示例性的,可选地,物理环境可以被描述成包括各种数字设备,例如PDA、电视、MP3播放器等等,以及被描述成包括软件对象,例如接口、COM对象等等。
存在各种支持分布式计算环境的系统、部件和网络构造。例如,可以通过有线或无线系统,局域网或广域分布式网络将计算系统连接在一起。当前,许多网络被连接到互联网,互联网提供用于广域分布计算的基础设施并且包括许多不同网络。
在家庭网络环境中,存在至少4种不同的网络传送介质,这些网络传送介质均可以支持诸如供电线路、数据(无线和有线)、语音(例如电话)和娱乐媒体的独特协议。多数诸如照明开关的家用控制设备和电器可以使用供电线路进行连接。数据服务可以作为宽带(例如DSL或电缆调制解调器)业务进入家庭,并且在家里使用无线(例如HomeRF或802.11b)或有线(例如家用PNA、Cat5、甚至供电线路)连接访问数据服务。语音传输可以作为有线(例如Cat3)或无线(例如蜂窝电话)业务进入家庭,并且可以使用Cat3有线在家庭内部分布。娱乐媒体可以通过卫星或电缆进入家庭,并且通常使用同轴电缆在家庭中分布。IEEE1394和DVI作为媒体设备集簇的数字互连而出现。所有这些网络环境和其它可以充当协议标准的环境可以被互连以构成内部网,内部网通过互联网可以被连接到外部世界。概括地说,存在各种用于数据存储和传输的不同来源,因此,今后的计算设备会需要各种共享数据,例如图形芯片的数据处理所访问或使用的数据的方式。
互联网通常是指使用TCP/IP协议族的网络和网关的集合,并且是计算机网络领域中众所周知的。TCP/IP是″传送控制协议/接口程序″的缩写。互联网可以被看作是通过计算机执行的网络协议互连的地理上分布的远程计算机网络构成的系统,所述网络协议允许用户通过网络交互和共享信息。由于这种广泛分布的信息共享,诸如互联网的远程网络目前已经演变成开放系统,开发人员可以实质上没有限制地针对开放系统设计软件应用,以便执行专用操作或服务。
于是,网络基础设施允许主机具有诸如客户/服务器、端到端或混合体系结构的网络拓扑。″客户端″是一个类或组的成员,使用与其无关的其它类或组的服务。于是,在计算中,客户端是请求其它程序提供的服务的进程,即一组指令或任务。客户端进程在不必″知道″关于其它程序或服务本身的任何工作细节的情况下使用所请求的服务。在客户/服务器体系结构中,尤其是在网络系统中,客户端通常是访问其它计算机,例如服务器提供的共享网络资源的计算机。在图1A的例子中,计算机110a、110b等等可以被认为是客户端,而计算机10a、10b等等可以被认为是服务器,其中服务器10a、10b等等维护接着在客户端计算机110a、110b等等中复制的数据。
服务器通常是可通过诸如互联网的远程网络访问的远程计算机系统。客户端进程可以在第一计算机系统中活跃,而服务器进程可以在第二计算机系统中活跃,彼此通过通信介质进行通信,于是提供分布式功能,并且允许多个客户端利用服务器的信息收集能力。
客户端和服务器使用协议层提供的功能彼此通信。例如,超文本传送协议(HTTP)是用于环球网(WWW)或″Web″的公共协议。通常,诸如通用资源定位符(URL)或网际协议的计算机网络地址或网际协议(IP)地址被用来彼此标识服务器或客户端计算机。网络地址可以被称作通用资源定位符地址。例如,可以通过通信介质提供通信。尤其是,客户端和服务器可以通过用于高容量通信的TCP/IP连接彼此连接。
于是,图1A图解了示例性的、可以使用本发明的网络或分布式环境,其中服务器通过网络/总线与客户端计算机通信。更详细地,若干服务器10a、10b等等通过可以是LAN、WAN、内部网、互联网等等的通信网络/总线14,被互连到若干客户端或远程计算设备110a、110b、110c、110d、110e等等,例如便携计算机、手持计算机、薄客户端、网络设备,或者连接到根据本发明的其它设备,例如VCR、电视、烤箱、照明设备、加热器等等。于是,本发明适用于任何期望用于管理协处理器计算资源的计算设备。
在通信网络/总线14是互联网的网络环境中,服务器10可以是Web服务器,其中客户端110a、110b、110c、110d、110e等等通过若干已知协议,例如超文本传送协议(HTTP)中的任何协议与Web服务器通信。服务器10也可以充当客户端110,这是分布式计算环境的特点。根据需要,通信可以是有线或无线通信。客户端设备110可以通过通信网络/总线14通信,也可以不通信,并且可以具有与其相关的的独立通信。例如,对于电视或VCR,其控制可以有或没有联网特性。各个客户端计算机110和服务器计算机10可以配备各种应用程序模块或对象135,以及针对各种存储单元或对象的连接或访问,其中在所述存储单元或对象中可以存储文件,或者向其下载或转移部分文件。任何计算机10a、10b、110a、110b等等均可以负责数据库20或根据本发明的其它存储单元,例如用于存储图形数据i的数据库或存储器20的维护和更新。于是,本发明可以用于具有客户端计算机等等的计算机网络环境,客户端计算机110a、110b等等可以访问计算机网络/总线14和服务器计算机10a、10b等等并与其交互,服务器计算机10a、10b等等可以与客户端计算机110a、110b等等,以及其它设备111和数据库20交互。
示例性计算设备
图1B和下面的讨论对可以实现本发明的适当计算环境进行了概括描述。然而应当理解,所有种类的手持、便携和其它计算设备和计算对象均可以和本发明结合使用。虽然下面描述的是通用计算机,但这只是一个例子,可以通过具有网络/总线互操作性和交互的薄客户端实现本发明。于是,可以在具有联网驻留服务、包含非常少或最小客户端资源的环境中实现本发明,例如在诸如设备中对象的客户端设备仅仅充当网络/总线接口的网络环境中。本质上,可以存储或从其检索数据的任何位置均是用于本发明的协处理器资源管理的期望或适当的环境。
虽然不需要,然而可以通过操作系统实现本发明,以便被服务开发人员用于设备或对象,和/或包含在帮助管理计算资源的应用软件内部。可以在由一或多个诸如客户端工作站、服务器或其它设备的计算机执行的计算机可执行指令通用环境,例如程序模块中描述软件。通常,程序模块包含执行具体任务或实现特定抽象数据类型的例程、程序、对象、部件、数据结构等等。通常,在各种实施例中可以根据需要合并或分布程序模块的功能。此外,本领域的技术人员会理解,本发明可以用于其它计算机系统结构。其它众所周知的适用于本发明的计算系统、环境和/或结构包含但不限于个人计算机(PC)、自动出纳机、服务器计算机、手持或膝上型设备、多处理器系统、基于微处理器的系统、可编程用户电子设备、网络PC、仪器、照明设备、环境控制单元、小型机、大型计算机等等。本发明也可以用于分布式计算环境中,其中通过远程处理设备执行任务,并且通过通信网络/总线或其它数据传输介质链接远程处理设备。在分布式计算环境中,程序模块可以位于包含存储器存储设备的本地和远程计算机存储介质中,并且客户端节点可以充当服务器节点。
图1B图解了可以实现本发明的适当计算系统环境100的例子,虽然如上所述,计算系统环境100只是适当计算环境的一个例子,并且不对本发明的使用范围或功能产生任何限制。也不应当将计算环境100解释成对示例性操作环境100中图解的任何一个部件或其组合有任何依赖性,或对其有要求。
参照图1B,实现本发明的示例性系统包含具有计算机110的形式的通用计算设备。计算机110的部件可以包含但不限于处理单元120、系统存储器130和系统总线121,其中系统总线121将包含系统存储器的各种系统部件连接到处理单元120。系统总线121可以是若干种总线结构中的任意一个,包含使用各种总线体系结构中的任意总线体系结构的存储器总线或存储器控制器、外设总线、和局部总线。例如但并不限于此,这种体系结构包含工业标准结构(ISA)总线、微通道结构(MCA)总线、增强ISA(EISA)总线、视频电子标准协会(VESA)局部总线、和外设部件互连(PCI)总线(也被称为中间总线)。
计算机110通常包含各种计算机可读介质。计算机可读介质可以是能够被计算机110访问的任何可用介质,并且包含易失和非易失介质,可移动和非可移动介质。例如但并不限于此,计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包含通过任何方法或技术实现的易失和非易失,可移动和非可移动介质,用于存储诸如计算机可读指令、数据结构、程序模块或其它数据的信息。计算机存储介质包含但不限于RAM、ROM、EEPROM、快闪存储器或其它存储器技术、CDROM、数字化视频光盘(DVD)或其它光盘存储器、盒式磁带、磁带、磁盘存储器或其它磁存储设备、或任何其他可用于存储期望信息并且可以被计算机110访问的介质。通信介质通常包含计算机可读指令、数据结构、程序模块或诸如载波或其它传送机制的调制数据信号中的数据,并且包含任何信息传送介质。术语″调制数据信号″表示以对信号中的信息进行编码的方式设置或改变其特征中的一或多个特性的信号。例如但并不限于此,通信介质包含诸如有线网络或直接有线连接的有线介质,和诸如声波、RF、红外和其它无线介质的无线介质。上述介质的任何组合也应当被包含在计算机可读介质的范围内。
系统存储器130包含具有易失和/或非易失存储器形式的计算机存储介质,例如只读存储器(ROM)131和随机访问存储器(RAM)132。包含有助于在计算机110内部的单元之间传送信息(例如在启动期间)的基本例程的基本输入/输出系统133(BIOS)通常被存储在ROM131中。RAM132通常包含可被处理单元120立即访问和/或当前正被处理单元120操作的数据和/或程序模块。例如但并不限于此,图1B图解了操作系统134、应用程序135、其它程序模块136和程序数据137。
计算机110也可以包含其它可移动/非可移动,易失/非易失计算机存储介质。例如,图1B图解了读写非可移动、非易失磁介质的硬盘驱动器141,读写可移动、非易失磁盘152的磁盘驱动器151,读写可移动、非易失光盘156,例如CD ROM或其它光学介质的光盘驱动器155。其它可被用于示例性操作环境的可移动/非可移动、易失/非易失计算机存储介质包含但不限于磁带盒、快闪存储器卡、数字化视频光盘、数字视频磁带、固态RAM、固态ROM等等。硬盘驱动器141通常通过例如接口140的非可移动存储器接口连接到系统总线121,而磁盘驱动器151和光盘驱动器155通常通过诸如接口150的可移动存储器接口连接到系统总线121。
图1B描述和图解的驱动器及其相关计算机存储介质提供对计算机110的计算机可读指令、数据结构、程序模块和其它数据的存储。例如在图1B中,硬盘驱动器141被图解成存储操作系统144、应用程序145、其它程序模块146和程序数据147。注意,这些部件可以相同于或不同于操作系统134、应用程序135、其它程序模块136和程序数据137。这里为操作系统144、应用程序145、其它程序模块146和程序数据147指定不同的附图标记,以表明至少它们是不同的拷贝。用户可以通过诸如键盘162和定点设备161的输入设备向计算机110输入命令和信息,定点设备161通常被称作鼠标、轨迹球或触摸板。其它输入设备(未示出)可以包含话筒、操纵杆、游戏垫、圆盘卫星电视天线、扫描仪等等。这些和其它输入设备通常通过用户输入接口160连接到处理单元120,但是可以被诸如并行端口、游戏端口或通用串行总线(USB)的其它接口和总线结构连接,其中用户输入接口160连接到系统总线121。诸如北桥的图形接口182也可以被连接到系统总线121。北桥是与CPU或主机处理单元120通信的芯片组,并且假定负责AGP通信。一或多个图形处理单元(GPU)184可以与图形接口182通信。在这点上,GPU184通常包含诸如寄存器存储的片内存储器存储,并且GPU184与视频存储器186通信。更通常地,本发明可以结合任何协处理器使用,其中GPU184只是一个例子。监视器191或其它类型的显示设备也通过诸如视频接口190、可以与视频存储器186通信的接口连接到系统总线121。除监视器191之外,计算机也可以包含诸如扬声器197和打印机196、可以通过输出外设接口195连接的其它外部输出设备。
通过使用针对一或多个远程计算机,例如远程计算机180的逻辑连接,计算机110可以在联网或分布式网络环境中工作。远程计算机180可以是个人计算机、服务器、路由器、网络PC、同层设备或其它公共网络节点,并且通常包含针对计算机110描述的多个或所有单元,尽管图1B中只图解了存储器存储设备181。图1B中的逻辑连接包含局域网(LAN)171和广域网(WAN)173,但是也可以包含其它网络/总线。这样的网络环境在家庭、办公室、企业计算机网络、内部网和互联网中随处可见。
当用于LAN网络环境时,计算机110通过网络接口或适配器170连接到LAN171。当用于WAN网络环境时,计算机110通常包含调制解调器172或其它用于在例如互联网的广域网173上建立通信的装置。可以位于内部或外部的调制解调器172通过用户输入接口160或其它适当机构可以连接到系统总线121。在网络环境中,针对计算机110描述的程序模块或其部分可以被存储在远程存储器存储设备中。例如但并不限于此,图1B图解了驻留在存储器设备181上的远程应用程序185。应当理解,所述网络连接只是示例性的,可以使用其它在计算机之间建立通信链路的装置。
示例性分布计算框架或体系结构
随着个人计算和互联网的融合,已经和正在开发各种分布计算框架。为个人和企业用户等等提供用于应用程序和计算设备、可无缝地互操作和Web式的接口,使得计算活动越来越面向Web浏览器或网络。
例如,微软公司的.Net平台包含服务器、构件式服务(例如基于Web的数据存储)和可下载设备软件。通常,.Net平台提供(1)使整个范围内的计算设备一起工作,并且在所有计算设备上使用户信息自动更新和同步的能力,(2)通过大量使用XML而不是HTML得到提高的Web站点交互能力,(3)在线服务,从中央接入点为用户提供定制访问并传送产品和服务,以便管理各种诸如电子邮件的应用程序或诸如Office.Net的软件,(4)集中数据存储,能够提高信息访问的效率和方便程度,以及改进用户和设备中间的信息同步,(5)集成各种诸如电子邮件、传真和电话的通信介质的能力,(6)使开发人员建立可重用模块以提高生产率并减少编程错误数量的能力,和(7)许多其它跨平台集成特性。
虽然这里结合计算设备上驻留的软件描述了示例性实施例,然而也可以通过操作系统或协处理器和请求方对象之间的″中间人″对象实现本发明的一或多个部分,使得可以在所有.NET语言和服务,以及其它分布计算架构中执行、支持或访问图像处理服务。
计算系统中计算资源的管理
I.图形处理器编程
首先简要描述用于控制图形处理器的不同机制及其折衷。虽然结合图形处理器描述了本发明的各种实施例,然而本发明可以被应用于作为对主处理器操作的补充的协处理器。在提出不同机制之后,描述本发明的控制图形处理器的方法。以利于操作系统管理其计算资源的方式实现本发明的方法。
表格1列举出图形硬件接收命令的一些方式: 方法 机制#客户端 用户/内核 端口I/O(PIO) IN/OUT指令1 K 存储器映射 I/O(MMIO) 针对特殊存储器位置的读写1 K/U 直接存储器访问 (DMA) 从系统存储器直接读取N U 图形加速端口(AGP) 从特殊系统存储器直接读取N U
第一方法,即端口I/O或PIO涉及执行从外设请求信息的IN指令,和向外设发送信息的OUT指令。PIO非常低效,并且通常不能很好地伸缩适应系统中指定硬件部分的多个实例。通常,可以只在内核模式下,即允许直接操作硬件的微处理器模式下执行IN和OUT指令。如果用户模式线程遇到这种指令,则系统产生异常,在用户模式线程试图控制硬件的情况下,通常导致线程终止执行。
存储器映射I/O允许通过针对专用存储器位置进行读写来控制硬件。MMIO的一个优点在于,如果可以改变控制指定硬件部分的存储器位置,则硬件的多个实例可以驻留在单个系统中。所谓的可重定位MMIO是例如在PC上支持多个监视器的关键特性。类似于PIO,通常使用内核模式地址在内核模式中执行MMIO。然而某些系统将MMIO地址暴露给用户模式,所以不经切换到内核模式便可以直接对硬件编程。然而仍然必须实施互斥,并且非置信或带缺陷用户模式软件进行的虚假写入会导致硬件产生不可预测的行为。于是,多数MMIO实现需要通过内核模式访问存储器位置,但是某些MMIO实现允许对硬件进行用户模式访问。如果硬件在其寄存器遭到虚假写入时不健壮,则这种设计会面临不可预测的、灾难性故障的风险。
由于那些操作直接影响硬件的状态,所以每次只有一个线程可以执行PIO或MMIO。于是,当系统支持PIO和MMIO时,系统在使用PIO和/或MMIO向硬件发送指令的代码路径之间实施互斥,即保证任何时候只有一个线程对硬件进行编程。通常,这意味着在执行通过PIO或MMIO对硬件编程的代码之前,线程必须等待诸如临界段或互斥(互斥对象)的锁。获得和释放锁需要花费时间,即使其中不存在冲突也是如此。如果存在冲突,即如果多个线程同时试图获得指定的锁,则在许多线程必须长时间等待以获得锁的情况下,会降低总体性能。
直接存储器访问(DMA)是在计算机系统内部移动数据的通用方法,并且可用于图形处理器,盘驱动器、网络适配器和诸如USB和IEEE1394的外部总线的控制。DMA通常是指诸如数字摄像机或盘控制器的外设不经主处理器直接参与而读写存储器的能力。主机事先设置DMA传送,即设置这样的页面,该页面锁定例如数字摄像机要写入来自将要得到的图片的图像数据的存储器区域,并且向照相机指定该存储器位置。页面锁定导致虚拟存储器管理程序拒绝将所涉及的存储器位置写到磁盘中。一旦完成设置,照相机可以得到图片并且将图像数据写入存储器,接着通知主机DMA传送已经完成。对于图形处理器控制,一系列用于图形处理器的命令可以被写入存储器,并且接着通过DMA操作被传送到图形处理器。
DMA具有许多优于其它提交图形处理器命令的方法的优点。第一,它利于主机和图形处理器的并行执行。由于CPU执行的这些″其它操作″通常涉及产生更多用于图形处理器的命令,常常要维护多个DMA缓冲区和其间的″往返传递″,即在图形处理器读取和执行其中的一个时写入另一个。第二,DMA允许多个应用程序向存储器写入命令缓冲区,并且接着在其准备好执行时向图形处理器提交命令缓冲区的内容。图形处理器每次只能执行一个命令缓冲区,但是由于不同线程可以写入包含命令缓冲区的不同存储器区域,DMA利于同时构造许多命令缓冲区。第三,DMA经常导致更高效地利用系统中的总线资源。换言之,通过DMA可达到的带宽通常高于通过主机微处理器的直接参与可达到的带宽。
图形加速端口(AGP)是专门为充当从系统存储器向图形处理器传送数据的高带宽管道而设计的专用总线。为了这里的描述,AGP可以被认为是DMA的特例。
除了针对硬件传送信息和接收信息的机制之外,在我们的背景讨论中提到的另一个重要区别在于向主机微处理器通知图形处理器已经完成某任务,或者出现某种可被图形处理器看见的事件。任务的非限制性例子包含完成命令缓冲区的执行或完成特定命令。事件的非限制性例子包含显示设备的垂直折回,来自视频端口的数字化视频的半帧的完成,或显示设备中特定扫描线的折回。
一个被称为轮询的方法涉及重复探测硬件以确定事件是否出现或任务是否完成。轮询需要通过IN指令或MMIO读取来读取硬件寄存器,或者发送命令,该命令请求将应答写入特定存储器位置,并且接着由主机从该位置读取应答。所有轮询方法的共同特性在于,必须执行重复检查,直到任务已经完成或事件已经出现。通常,轮询比较浪费主机微处理器中的计算资源。
向主机微处理器通知完成的任务或外部事件的可选方法被称作中断。中断是一种硬件机制,该机制将主机微处理器偏离其正在进行的处理,并且将控制转移到存储器中的特殊位置。操作系统使用这个机制调用被称为中断服务例程的驱动程序代码以响应中断。
中断具有若干优于基于轮询的机制的优点。一个优点是,设置和响应中断的代价是固定的,而基于轮询的机制的代价根据执行的轮询的数量几乎线性地增加。结果,与基于轮询的模式相比,基于中断的模式通常消耗较少的总线带宽和较少的CPU周期。如果中断等待时间小于事件出现时刻和执行下一次轮询的时刻之间的时间,中断也可以导致更及时的通知。
基于上述背景,本发明提出一组假定,这些假定允许合理地管理图形处理器中的计算资源。本发明还指出某些硬件特性,这些硬件特性允许系统更加有效和/或可靠地进行这种管理。
根据本发明作出的第一个假定是主要使用基于DMA的输入。这个第一假定在于,大多数针对图形处理器的命令应当通过DMA机制提交。如上所述,基于DMA的命令缓冲区提交利于图形处理器最终使用主机微处理器上运行的多个应用程序产生的多个DMA缓冲区。可以通过诸如MMIO的方法向硬件发送频率较低的命令,例如启动DMA命令流的执行。但是应当通过DMA发送大部分针对图形芯片的高频率命令,例如载入图像数据,绘出诸如线条和三角的部分的命令,和改变硬件状态的命令。
第二个假定是,最好使用基于中断的通知。于是,根据本发明,中断被用于图形处理器关于事件的大多数通知,例如命令缓冲区的完成或部分完成,向主处理器可见的存储器写数据的DMA操作的完成,显示设备的垂直折回,或特定命令的完成。于是,主机会设置其需要了解的事件的中断通知,并且会以及时方式响应那些中断。
基于这些假定,我们可以从图形处理器推而广之,并且考虑具有2个处理器的系统:主CPU和通过从CPU发送命令缓冲区来控制的协处理器,其中协处理器可以向CPU回送数据,并且在各种事件出现时通过向CPU通知该事件来协同控制。本文中的例子通常假定协处理器是图形处理器(例如在描述可能的同步问题,以及系统如何可以被用来有效解决那些问题时),但是这些例子仅用于图解,并没有将本发明的范围限制到图形处理器。
根据上述针对图形处理系统中计算资源的假定,下面描述高效地共享使用协处理器中的计算资源的非限制性系统。
图2描述了命令缓冲区在被应用程序用于向诸如图形处理器的协处理器发送命令时的生命周期。当创建和初始化命令缓冲区时,缓冲区进入初始化状态201。接着,命令缓冲区可被希望向图形处理器发出命令的线程选择和写入。当线程选择命令缓冲区时,命令缓冲区中的存储器可用于该线程(或者将命令缓冲区中的存储器映射到该线程的地址空间),并且命令缓冲区进入接收状态202。本领域的普通技术人员可以理解,这种映射的细节可以改变。例如,可以使命令缓冲区存储器对于用户模式、内核模式或两个模式是可见的。另外,存在许多关于被写入接收命令缓冲区的可执行代码的性质的选项。在这点上,图3A-3E描述了若干这样的选项,即若干用于写入命令缓冲区的不同体系结构。
为了描述图3A-3E,应用程序是进程或进程中的线程,用于实现参与到系统中的某些特定图形应用程序。运行时刻例程(runtime)是操作系统中提供的、由应用程序使用的中间件。尤其是,运行时刻例程可以验证应用程序对应用编程接口(API)的使用,将易于使用的高级API调用转换成更加复杂、更易于转换成硬件命令的低级构造,等等。
驱动程序是特定于硬件的部件,驱动程序将运行时刻级命令转换成特定于硬件的命令。图3A-3E中描述的驱动程序部件是驱动程序中将运行时刻级命令转换成特定于硬件的命令的部分。驱动程序的某些执行除了这种转换之外的任务,例如中断处理和命令缓冲区分配任务的部分可能驻留在内核模式中,并且在图3A-3E中没有被涉及到。图3A-3E中描述的大部分目标代码可以在用户模式中运行,虽然如下所述,某些部分可以在内核模式中运行。命令缓冲区是包含命令的存储器片段,其中硬件通过某种DMA机制可以直接耗用所述命令。若干附图还示出了令牌流,令牌流是独立于硬件的运行时刻级原语流,所述原语流可以被驱动程序转换成特定于硬件的命令。
最终,一些附图示出了JIT(运行时)编译部件,所述编译部件可以将独立于硬件的中间语言转换成由主机微处理器执行的目标代码。在角部具有OBJ的框包含可以被微处理器直接执行的目标代码。在角部具有MSIL的框包含被JIT编译以便在微处理器上执行的中间代码。如果在客户端上可得到具有中间形式的应用程序和运行时刻例程,则如图3C到3E的实现应用程序的应用可执行程序324、334和345所示,JIT可以将应用程序和运行时刻例程转换成统一目标代码片段。
图3A示出了应用程序301、运行时刻例程302和驱动程序303,其中应用程序301、运行时刻例程302和驱动程序303均执行其相应的功能,调用下层目标代码直到驱动程序303将特定于硬件的命令写入命令缓冲区304。应用程序301可以是可执行进程或进程中的线程,而运行时刻例程302和驱动程序303可以均驻留在DLL上。如图3A所述,所有目标代码均可以驻留在用户模式中(虽然运行时刻例程302和/或驱动程序303中的某些或全部可以驻留在内核模式中)。如果运行时刻例程302确定在继续执行之前必须提交命令缓冲区304,或者驱动程序303确定命令缓冲区304空间耗尽,则为了继续执行,可以请求转换到内核模式以便提交命令缓冲区304并且检索另一个命令缓冲区304。
图3B示出了一种变型,其中运行时刻例程312向缓冲区313发出独立于硬件的命令流,接着该命令流被驱动程序314分析并且写入命令缓冲区315。应用程序311调用与运行时刻例程312相关的下层目标代码。图3B近似示出了DIRECTX软件构件的当前体系结构,其中运行时刻例程将应用程序活动转换成DrawPrimitives2(″DP2″)令牌。当提交DP2令牌流时,出现内核切换,并且驱动程序314将DP2令牌流转换成内核模式中特定于硬件的命令。图3B对于驱动程序314处于用户模式还是内核模式不作任何假定,在这点上,驱动程序部件314可以驻留在用户模式以及内核模式中。
图3C示出了一种变型,其中应用程序321和运行时刻例程322被JIT编译器323合成为统一目标代码片段。所得到的目标代码片段324接着与驱动程序325交互以便把特定于硬件的命令写入命令缓冲区326。
图3D示出了图3B描述的情况的JIT变型,其中由驱动程序336上层的软件334发出独立于硬件的令牌流335。驱动程序336接着针对命令缓冲区337将令牌流转换成特定于硬件的命令。就象在图3C中那样,JIT编译器333将应用程序331和运行时刻例程332合成为统一目标代码片段334。
图3E示出了一个系统,其中在客户端上可得到中间语言形式MSIL的应用程序341、运行时刻例程342和部分驱动程序343。JIT编译器344将这些部件合成为统一目标代码片段345,其中专门优化统一目标代码片段345以便在特定客户端计算机上运行,并且不仅考虑到主机微处理器,而且考虑到协处理器的硬件结构。
对于参照图2描述的命令缓冲区生命周期,无论使用何种方法将命令写入命令缓冲区,或者由于命令缓冲区已经填满,或者由于写入缓冲区的绘图命令被立刻执行,使得对接收命令缓冲区进行写入的线程最终均受制于命令缓冲区。此时,命令缓冲区进入等待状态203,并且命令缓冲区的内容不能被提交到硬件,直到所有被用来执行命令缓冲区的资源均可用。作为可以进入等待的一个例子,如果应用程序绘制一个表面,则必须在该表面可以被选择作为纹理之前完成绘图。
一旦满足了等待准则,命令缓冲区进入就绪状态204,其中调度程序考虑将其提交到协处理器。在决定应当向硬件提交哪个命令缓冲区方面,调度程序具有很大的灵活性。调度程序可以考虑命令缓冲区的优先权(如果有),请求方线程的优先权,系统的实时要求等等。一旦命令缓冲区已经被选择作为下一个要运行的命令缓冲区,该命令缓冲区进入后备状态205。在某些系统上,每个协处理器只有一个命令缓冲区可以处于系统中的后备状态205。
当可以向硬件提交处于后备状态205的命令缓冲区时,系统将协处理器上下文交换到命令缓冲区所需的上下文,并且接着向硬件提交命令缓冲区。这种操作必须得到驱动程序的某种介入,例如使用命令缓冲区的基地址和大小初始化DMA操作。命令缓冲区保持运行状态206,直到某种事件抢占命令缓冲区的执行,或者已经读取和执行了命令缓冲区的整个内容。
如果已经执行整个命令缓冲区,则命令缓冲区进入终止状态207,其中可以使系统重新初始化命令缓冲区,并且使命令缓冲区在初始化状态201可被另一个线程使用。
如果命令缓冲区被抢占,则假定硬件具有保存硬件上下文的能力,使得在出现抢占的情况下可以恢复命令缓冲区的执行。接着,命令缓冲区可以再循环进入就绪状态204,并且被重新提交到硬件以便从其被终止之处恢复执行。下面的描述涉及抢占式命令缓冲区执行。
对于上下文切换,如上所述的系统可以包含硬件加速或至少是借助驱动程序的上下文切换,其中驱动程序维护硬件上下文,并且上下文切换先天上可以得到硬件的支持。例如,上下文可以被高速缓存在本地视频存储器或其它高速存储器中。在这种情况下,操作系统请求驱动程序将指定上下文加载到硬件中。基于性能的原因,可以在单个DDI(设备驱动程序接口)中指定上下文切换和命令缓冲区分配。
可选地,操作系统可以维护典型概念的硬件上下文,并且构造命令缓冲区,其中命令缓冲区将硬件设置到对应于指定上下文的状态。在这种情况下,在从后备状态205切换到运行状态206期间加载上下文必须将这种构造的命令缓冲区分配给硬件。可选地,可以为可选上下文切换保留命令缓冲区的头。如果操作系统认为上下文切换不必要,例如由于硬件已经包含适当的上下文,系统可以将刚好超出上下文切换块的命令指定成命令缓冲区的基地址。无论操作系统在开始执行之前是否使用单独命令缓冲区、命令缓冲区头或其它机制向硬件加载上下文,由于驱动程序只知道其正在向硬件分配命令缓冲区,并且不知道它们是否正在加载硬件上下文或导致绘图命令被执行,因此降低了驱动程序的复杂度。然而,由于使用快速存储器对上下文切换提供的先天硬件支持具有优于基于命令缓冲区的上下文切换的性能优势,驱动程序复杂度的降低付出了潜在的性能代价。然而这种系统更加易于进行创新,例如在现有驱动程序上增加轻型(lightweight)上下文切换。
对于轻型上下文,硬件上下文包含许多可能不被某些类别的应用程序需要的状态。例如,如果协处理器是图形处理器,则简单的2D图形应用程序不需要现代图形芯片的完全多重纹理贴图(multitexturing)、顶点光源着色(vetex shading)和象素光源着色(pixelshading)状态。为了适应这些应用程序,系统可以定义一或多个轻型上下文类型,其中在开始执行命令缓冲区之前,这些上下文类型可以更加高效地被加载到硬件中。另外,系统可以有可能地记得不受轻型上下文的加载影响的重型上下文状态的部分,并且优化后续上下文切换以避免重新加载硬件中已经出现过的状态。这种优化可以由需要在驱动程序层次提供上下文切换的形式支持的系统来执行,也可以由使用命令缓冲区或其它机制人工加载硬件上下文的系统来执行。
对于中断处理,由于中断利于在协处理器硬件正在工作的同时保证主机微处理器的有用工作的性能,中断可以被用于高效管理协处理器的计算资源。当前描述的实施例详细说明了系统中某些涉及中断的应用程序,以及中断始终支持的特性。在所有情况下,中断为操作系统提供向客户端通知导致中断的事件的机会,无论是通过写入存储器,还是通过通知诸如事件的线程同步对象。
对于有关命令缓冲区完成的中断,当命令缓冲区完成执行时,系统得到通知,所以系统可以选择另一个命令缓冲区提交到硬件。在协处理器通知中断直到提交另一个命令缓冲区之间无论协处理器是否空闲,或者在协处理器开始执行先前排队的命令缓冲区(如下所述)的情况下,系统一定得到通知,因此可以选择另一个命令缓冲区以便提交(或最终提交)到硬件。由于中断通知命令缓冲区已经执行,系统可以释放命令缓冲区需要的所有资源,解锁需要那些资源的待执行命令缓冲区,并且也可以再生(recycle)命令缓冲区以便被另一个应用程序使用。
对于命令缓冲区中的通知中断命令,如果可以写入指示硬件在前面的命令完成执行时通知中断的命令,系统可以为客户端应用程序提供粒度精细、受应用程序控制的完成通知,范围包括从写入存储器片段到遇到中断命令时设置事件或其它线程同步对象。
对于图形处理器的有关出现VSYNC的中断,当出现VSYNC(显示设备垂直折回)时发生的中断允许系统中具有各种能力。
如果系统正在组成显示帧和进行翻页,VSYNC中断会通知需要组成显示帧的后备缓冲区(即为下一个VSYNC准备)。
系统可以使用VSYNC通知估测未来帧的呈现时间,并且使客户端可得到这种信息。对于视频,则允许组成对应于呈现时间的插值和/或去交织输出帧。对于受连续时域控制的时间动画,则允许按照对应于呈现的精确时间呈现动画。
系统可以使用VSYNC通知以允许客户端将其帧速率节制到显示器刷新频率,即在以85赫兹的频率刷新显示器时,以85赫兹的频率进行呈现。对于不高明(naive)的客户端应用程序,可以使呈现调用同步(使线程被阻塞,直到通知事件;通知有关VSYNC的事件)。更加复杂的客户端会具体等待事件,并且在完成其绘制和等待显示器刷新之间的时间内进行有用工作。
对于当显示器刷新到达指定扫描线时出现的中断,当显示器刷新达到指定扫描线时进行通知的中断允许实现定时传送的系统细致地控制预期的呈现时间。令T=0表示当前显示的基本内容的呈现时间,T=1表示在下一个VSYNC时、将被切换到并且被最终用户看见的后备缓冲区的呈现时间,T=2表示将在下一个VSYNC时组成的后备缓冲区的呈现时间,而T=3表示再下一个显示帧的呈现时间。当客户端请求绘图的呈现时间时,定时传送的不高明实现可以指定T=3,以保证在需要将结果组成到后备缓冲区之前,应用程序有足够时间完成其绘制。然而如果显示最近刚启动刷新,则可能有时间使客户端在T=2处进行绘图,并且仍然及时完成,以便参与VSYNC出现之后的后备缓冲区组成。当显示器刷新指定扫描线时进行通知的中断,允许定时传送子系统根据显示器是否将要完成刷新为客户端指定不同的呈现时间。例如,系统可以为客户端指定T=2以作为预期呈现时间,直到显示器被刷新一半;接着可以开始为客户端指定T=3以作为预期呈现时间。甚至可以根据系统负载调节导致这种行为变化的扫描线数量。
通过设置这种中断以便在显示设备刷新要更新的区域之后立即进行通知,可以实现对基本内容的无断裂更新。当通知中断时,可以请求图形处理器执行更新显示所需的绘图操作,并且不会观察到断裂,除非系统需要很多长的时间执行那些命令,以致当发生更新时显示器刷新已经到达更新区域。
对于同步,为了执行适当的同步,系统会跟踪被客户端应用程序操作的对象之间的相关性,并且保证在命令缓冲区分配期间那些相关性得到遵守。图2中的等待状态203表示这样的时机,即进行等待,直到完成命令缓冲区所依赖的操作。例如,如果应用程序对一个表面进行着色,并且接着选择该表面作为纹理,则必须在可以进行其它绘图之前完成着色。类似地,如果应用程序对一个表面进行绘图,并且接着请求以该表面为源表面的Blt,则在Blt可以开始之前必须完成绘图。同步要求的另一个例子是翻页:如果应用程序创建覆盖表面,在覆盖的后备缓冲区中绘图并且请求翻页,则随着绘图被作用到覆盖的前端缓冲区中,必须在观察到翻页或呈现内容之前完成绘图。
在如上所述调度命令缓冲区分配的系统中,可以适应所有这些同步要求。当应用程序向命令缓冲区写入命令时,系统可以跟踪该命令缓冲区的执行需要哪些资源。某种资源可以通过非独占的方式获得(例如调色板,要读取的表面,纹理图所来自的表面),而其它资源必须以独占方式获得(例如要写入的表面,或对其进行3D着色的表面)。系统可以有可能地影响线程同步原语,以便实施这种命令缓冲区的同步;例如WindowsNT中存在可以被任何数量的线程非独占地获得,或被单线程独占获得的线程同步原语。如果命令缓冲区具有关于需要获得的资源和是否需要独占访问的相关列表,则分配命令缓冲区的线程通过等待与命令缓冲区相关的同步对象,可以将命令缓冲区从等待状态切换到就绪状态。一旦线程获得所有需要的同步对象,命令缓冲区可以被提交到硬件。
系统必须检测这样的请求资源的情况,其中该资源取决于其能够变得可用之前已经执行的命令缓冲区中较早存在的命令。当这种情况发生时,线程必须提交命令缓冲区,并且开始组成另一个命令缓冲区。第二个命令缓冲区可以简单地指定资源,并且上述同步机制会适应相关性。
对于命令缓冲区的排队,由于图形硬件的高性能,使命令缓冲区完成和提交另一个命令缓冲区之间的等待时间最小是关键因素。否则,图形硬件会浪费宝贵的时间以等待提交另一个命令缓冲区。这个问题的一个可能的解决方案是在当前命令缓冲区完成执行之前使上下文切换和命令缓冲区分配排队。接着,假定硬件和驱动程序支持这种能力,当当前命令缓冲区已经完成时,硬件可以立即开始执行另一个命令缓冲区。于是,系统具有更多时间以准备另一个命令缓冲区的执行:如果在另一个命令缓冲区被排队之前图形硬件完成了新命令缓冲区的执行,则图形硬件只会进入空闲。
对于抢占式命令缓冲区执行,这里描述的系统为硬件提供对抢占的支持。各种事件均可以有可能地导致执行期间的命令缓冲区的抢占,范围包括从诸如VSYNC的外部事件到具有时间定量的硬件执行。为了实现这个特性,硬件和驱动程序必须允许保存硬件上下文,使得在其被放弃时可以恢复被抢占的命令缓冲区的执行;并且必须通知操作系统,使得操作系统可以将命令缓冲区回退到图2所述的就绪状态。实现这种抢占的一个原因是保证在VSYNC之后立即组成显示帧(保证当出现下一个VSYNC时显示帧已经就绪)。具有时间定量的硬件执行会导致在执行了某段设定的时间,例如2毫秒之后抢占命令缓冲区。如果命令缓冲区包含非常费时的命令,例如绘制较大的、带纹理贴图的、alpha混合的三角,硬件可能必须抢占其执行,以便允许其它命令缓冲区被考虑提交。
对于命令缓冲区异构性,虽然前面的讨论通常认为命令缓冲区是同构的,然而本发明的系统没有理由不能适用于具有对应硬件上下文的专用命令缓冲区。例如,系统可能希望在命令缓冲区层次上以不同方式进行2D/3D绘制和视频解码,在分配指定类型的命令缓冲区之前加载不同硬件上下文。
认为命令缓冲区是异构的思路能够与轻型上下文的思路形成最优配合,因为当在轻型上下文上操作时,只有可用命令的子集可用。
对于用于检测命令缓冲区溢出的保护页面,对命令缓冲区进行写入的用户模式代码可以跟踪命令缓冲区中留下的字节数量,并且检测写入指定命令所需的字节数量何时会超过可用字节数量。然而由于大量变量被用于需要写入这个缓冲区的命令,人工跟踪这个字节计数是一项繁重和易出错的编程任务。一个降低此任务的复杂度的方法是在刚好超出命令缓冲区终结处的部分分配保护页面,并且将该页面标记成不可写的。使缓冲区过载的存储器写入会导致异常。对命令缓冲区进行写入的用户模式代码可以用结构化异常处理块包围写指令,监视异常,并且在命令缓冲区溢出时向运行时刻例程返回错误。与在运行时刻例程和用户模式驱动程序之间传递字节计数的可选实现相比,针对用户模式驱动程序的接口会更加简单和高效。
对于不正确的命令缓冲区内容,在允许用户模式代码写入命令缓冲区的系统中,恶性写入可以在命令缓冲区被提交到硬件之前破坏命令缓冲区的内容。如果没有认真进行防范,这种恶化会使系统挂起或行为不定。根据底层的硬件设计,存在若干处理这种可能的方式。
如果硬件具有在读取和执行命令缓冲区时对其进行验证的能力,则可以在遇到非法命令时通知中断或尽早终止命令缓冲区。系统可以通过错误返回、异常或某些其它机制向客户端进程通知这种事件。
可选地,如果硬件在执行命令缓冲区时不能对其进行验证,则可以为系统提供这样的选项,其中如果系统在某个时段内没有响应,则复位硬件。
对于选入单线程的设备,一种降低系统中线程同步数量的方式是允许将设备选入线程,并且对于具有″当前设备″概念的线程,使得设备和线程之间存在一一对应。这个方案的优点在于,在不必获得临界段、互斥或其它确保互斥的同步原语的情况下,可以在设备的范围内保证互斥。偏离到设备范围外部的操作(例如在可以全局访问的表面上执行某种操作)仍然必须进行同步。通过允许将诸如表面的全局对象绑定到设备,这种操作甚至可以影响绑定到线程的设备的互斥性质。
实现线程的″当前设备″概念的系统仍然可以允许应用程序访问任意设备。允许这种访问的软件构造只须以某种额外的性能代价与其它线程分离和同步。
对于令牌流和独立于硬件的绘图命令的保持,某些应用程序具有在独立于硬件的存储器片段中高速缓存用于图形硬件、被称作″令牌流″的一系列命令的能力,可以通过允许应用程序分摊(amortize)组成缓冲区所需的处理量来提高性能。例如,一系列包含旋转的绘图命令可以被写入这种缓冲区中;因此,只通过改变缓冲区中的少数数值并重新提交令牌流,应用程序可以按照不同的旋转角度重绘画面。DIRECT3D执行缓冲区是实现这个思路的好例子。
在本发明中,令牌流充当应用程序和硬件之间的重要中间步骤。在某点上,绘图命令必须被转换成特定于硬件的命令,以便被硬件执行;但是在应用程序进行绘图调用时实时执行该转换(所谓的″立即模式″)不总是执行绘图的最高效方式。并且,由于转换成特定于硬件的命令的细节使得应用程序难以或不能编辑那些缓冲区,特定于硬件的缓冲区(在本文被称作″命令缓冲区″)对应用程序实质上是非透明的。因此,根据系统是否需要实现针对GPU的一系列命令的独立于硬件、有可能可编辑的描述,令牌流充当可以或不可以被系统实现的重要中间数据结构。
对于显示列表和保持的硬件相关绘图命令,在图形硬件领域存在以非透明于应用程序的方式高速缓存一系列绘图命令的先例,据称也可以更有效地执行绘图命令系列。这些高速缓存的绘图命令通常被称作″显示列表″。其思路在于,画面的静态单元(例如刚性对象)可以被″呈现″到显示列表中,并且当绘制画面时,应用程序每当进行显示器更新时会调用适当的显示列表,而不是执行绘图调用。实际上,显示列表的执行特性在不同实现中的差别很大,使得应用程序为了决定是否使用它们而必须作出繁多的关于底层实现的假设。
通过使用将DDI层次的命令转换成特定于硬件的命令的用户模式驱动程序接口,本文中描述的系统可以容易地暴露显示列表功能。如何构造显示列表的细节会有所不同:应用程序可以设置导致绘图命令被记录在显示列表中而不是被执行的模式(在OpenGL中,通过调用glNewList设置这个模式),或者应用程序可以构造令牌流并且接着请求将其转换成显示列表。在任何情况下,系统会请求用户模式驱动程序部件将命令的DDI对等命令转换成特定于硬件的命令,并且将其写入临时缓冲区中(由于在已经执行转换之前不知道特定于硬件的命令流的确切容量)。当终止记录时,或者在已经分析令牌流时,系统可以分配具有适当容量的命令缓冲区,并且将转换的硬件命令拷贝到命令缓冲区中,使得硬件可以容易地执行命令缓冲区。
由于已经针对底层硬件实现作出的假设,本发明中实现显示列表具有这样的优点,即硬件实现之间存在更加一致的执行特性。换言之,如果显示列表使一个硬件实现具有性能优势,则显示列表很可能在所有硬件实现上均是非常快速的。对于应用开发者而言,由于使用显示列表对于应用开发者是一种负担,并且应用开发者必须能够得知有关何时付出利用显示列表所需的额外投资的决策,这种一致性是巨大的优势。
对于执行多个命令缓冲区的图形硬件,可以修改系统以支持可以同时执行多个命令缓冲区的图形硬件。例如,图形硬件可以包含多个能够并行操作的离散图形处理器。虽然某些这样的硬件通过″扫描线交错″使用并行处理提高填充速率,然而也可以通过这种处理器同时执行不同的命令缓冲区。提供这种硬件体系结构需要允许多个命令缓冲区被设置到后备状态,并且使内核模式调度程序保证要执行的多个命令缓冲区除非在只读方式下否则不访问任何相同的资源(例如纹理贴图)。
对于虚拟化资源,这里描述的系统能够虚拟化资源,例如视频存储器表面、顶点和索引缓冲区、调色板和其它有限硬件资源。术语″虚拟化″是指这样的思路,其中应用程序具有的资源看上去多于系统能够提供的资源。例如,″虚拟存储器″允许应用程序分配的存储器多于系统中物理提供的存储器,并且操作系统针对本地大容量存储设备交换(swap)存储器,以便维持存储器是物理提供的存储器的假象。CPU具有允许操作系统监视存储器利用率的手段,使得当前不需要的物理存储器可以被″换出″到磁盘上,以便为需要的存储器留出空间。
在本发明中,通过跟踪指定命令缓冲区的执行所需的资源,并且保证在向硬件发出命令缓冲区时那些资源可用,可以通过类似方式虚拟化诸如视频存储器的GPU资源。可以通过类似于上述虚拟存储器的方式管理视频存储器,其中系统将系统存储器视作用于″换出″视频存储器表面的″大容量存储设备″。当选择执行需要已经换出到系统存储器的表面的命令缓冲区时,操作系统必须分配新的视频存储器表面(可以通过释放视频存储器表面或将其它表面从视频存储器换出到系统存储器来留出空间),并且将系统存储器内容拷贝到该表面。所得到的表面可能会位于不同于其初始位置的位置上,因此操作系统在将命令缓冲区分配给硬件之前必须跟踪对视频存储器表面的引用,并且″固定″命令缓冲区中的那些引用。
图4图解了上述发明的示例性用户模式驱动程序DLL实现。在图4中,应用程序401、运行时刻例程402和部分驱动程序404工作在用户模式,以便将绘图命令写入DMA存储器中的特定于硬件的命令缓冲区。在当代的PC系统中,这些写入通常是针对AGP存储器的非临时(non-temporal)写入;如此实现中所述,应用程序401驻留在EXE中,运行时刻例程402和用户模式驱动程序403驻留在动态链接到应用程序401的DLL中。如下所述,系统的用户模式部分的这些细节可以改变;具体地,应用程序401、应用程序401和运行时刻例程402,或应用程序401、运行时刻例程402和用户模式驱动程序403可以有可能地是得到管理的代码。
为了防止未经授权地替换用户模式驱动程序403,系统针对要加载的用户模式驱动程序DLL403查询内核驱动程序405(由于在安全方面内核代码是可信的)。
命令缓冲区调度程序404(″调度程序″)和内核驱动程序405一起工作在内核模式,以便向硬件406分配命令缓冲区(调度程序404决定应当分配哪个命令缓冲区,而内核驱动程序405指示硬件406按照调度程序的请求分配命令缓冲区)。该系统考虑到,驱动程序逻辑的组件会驻留在用户模式驱动程序DLL403中,而不是驻留在内核驱动程序405中。虽然用户模式驱动程序可以包含大量将DDI层次调用映射成特定于硬件的命令的代码(其操作复杂且易出错,尤其在编译顶点和/或着色程序时),然而内核驱动程序相对较小和简单,从而使系统健壮性最大。
图5说明了在应用程序进行API调用以执行图形操作时出现的事件序列。图5的模块图部件被加上阴影:用户模式部件具有中等阴影,内核模式部件阴影较少,而硬件具有深阴影。图5中没有将命令缓冲区具体描述成硬件部件;根据图4,用户模式驱动程序520将特定于硬件的命令写入设备的当前命令缓冲区,命令缓冲区调度程序(部分系统内核支持530)通过内核模式驱动程序550向硬件560分配命令缓冲区,而完成的命令缓冲区被再循环以便被系统中的应用程序使用。应当注意,多个应用程序500可以有可能共享可用命令缓冲区池,其中系统内核支持530仲裁对该资源的共享。
当应用程序500初始创建绘图上下文501时,系统内核支持530进行检查以确定是否可以创建新命令缓冲区531。如果是这样的话,创建532和初始化533新命令缓冲区,并且线程在应用程序500可以执行绘图调用502之前获得初始化的命令缓冲区534。如果在步骤531不能创建命令缓冲区,则应用程序500必须等待,直到初始化的命令缓冲区变得可用534。一旦应用程序500获得命令缓冲区,应用程序500、运行时刻例程510和用户模式驱动程序520进入3个部件之间的典型交互,这3个部件使得特定于硬件的命令被写入命令缓冲区。运行时刻例程510验证511应用程序500的绘图调用502;接着检查512确定是否需要刷新当前命令缓冲区。如果不需要,绘图命令被转换成简单和典型的DDI调用513,并且被传递到用户模式驱动程序520。驱动程序将DDI调用转换成特定于硬件的命令,并且试图将其写入命令缓冲区。如果刷新检查522确定命令缓冲区中没有空间,则必须向系统内核支持530提交命令缓冲区,并且在可以写入和继续执行命令之前必须从命令缓冲区获得新的命令缓冲区。如果运行时刻例程510或用户模式驱动程序520确定需要垢“刷新,则在步骤535将命令缓冲区加到等待排队中。该时刻,系统内核可以检查536是否可以立即提交命令缓冲区(通常由于没有命令缓冲区在运行)。如果不可以,则命令缓冲区停留在等待排队中,并且必须获得534新命令缓冲区。应当注意,这个进行等待、直到适当的初始化命令缓冲区可用并且将其分配给设备的功能模块,与应用程序500在可以开始绘图之前需要的操作相同。
箭头也被加上阴影。在应用程序500初始化和执行绘图命令,运行时刻例程510和用户模式驱动程序520将那些绘图命令转换成特定于硬件的命令并且将其写入命令缓冲区时,黑箭头表示应用程序500的″典型″线程执行。如果运行时刻例程510或用户模式驱动程序520确定需要刷新(即必须提交命令缓冲区),则由绿箭头指定的执行的线程如下所述:命令缓冲区被加到等待队列并且被提交(如果可以),接着获得新命令缓冲区以便可以继续执行。
中等阴影箭头表示当命令缓冲区在步骤535被加到等待队列之后命令缓冲区所得到的″典型″路径。如果可以立即分配命令缓冲区(检查536),则命令缓冲区被标记成就绪537,并且被选择分配540。否则,当当前运行的命令缓冲区完成执行时,等待命令缓冲区在普通事件过程中必须被标记成就绪。
当选择分配540就绪命令缓冲区时,系统内核支持530使内核驱动程序550将硬件上下文切换到适当的上下文551,并且为硬件分配命令缓冲区552。硬件接着读取和执行命令缓冲区561,直到它被抢占或命令缓冲区完成。如果命令缓冲区正常完成563,则硬件通知中断,而中断服务例程553执行。此时ISR可能希望保存硬件上下文554,虽然驱动程序可能希望将此操作延迟到上下文切换551,以防硬件请求连续执行在相同上下文上工作的2个命令缓冲区。在步骤554之后,内核系统支持530可以释放命令缓冲区538需要的资源,并且通知任何诸如事件的通知机制让有关客户端知道命令缓冲区已完成。在步骤538之后,内核系统支持具有2个不同的任务:它必须重新初始化重新可用的命令缓冲区并且将其加到初始化池533中,它必须解锁任何等待的命令缓冲区并且将它们移动到就绪队列539中。在步骤539之后,可以选择分配540另一个命令缓冲区。
如橙色箭头所示,处理抢占的情况略微不同普通命令缓冲区完成。由于被抢占的命令缓冲区不被完成,系统不准通知客户端其完成(步骤538)或解锁相关命令缓冲区(步骤539)。驱动程序保存部分执行的命令缓冲区的上下文554以便其可以在发生抢占时重新启动,通知任何需要知道关于抢占的情况的客户端541,并且选择分配540下一个就绪命令缓冲区。
出现可以导致抢占的情况的例子包含诸如VSYNC或显示器刷新到达具体位置(例如扫描线)的外部事件,或时间定量超时。另外,为了管理时间定量,操作系统可以使用一种通过调用内核驱动程序550抢占图形处理器的机制。这等同于硬件仲裁的时间定量超时,不同之处在于,决定何时抢占图形处理器的复杂度和责任取决于系统内核支持530而不是硬件560。假定系统已经预先设置对这种事件的响应,例如在刷新通过某个扫描线时执行一系列Blt命令(为了无断裂更新的目的)。
注意,前面提供的许多思路可以被应用于结合图4和5描述的系统。例如,如上所述,通过使内核驱动程序550分配上下文切换命令缓冲区,系统内核支持540可以有可能地承担上下文切换任务551。又例如,如上所述,通过区分上下文类型和可能的命令缓冲区类型,在这个系统中可以支持轻型上下文。又例如,可以略微修改步骤540(″选择分配就绪命令缓冲区″)以利用上述思路,其中一旦运行命令缓冲区完成,硬件开始执行预先选择的命令缓冲区。又例如,一个使运行时刻例程510和用户模式驱动程序520高效检测命令缓冲区溢出522的方式是,使系统内核支持530在各个命令缓冲区的终结处分配不可写保护页面,并且使用结构化异常处理检测何时出现写入保护页面的尝试。最终,通过在非法命令使硬件产生中断时通知异常,或者通过在硬件长时间没有响应时通过专门的内核驱动程序550入口点复位硬件,使系统在出现非法命令缓冲区时健壮的思路可以容易地合并到该系统中。
图6图解了示例性的硬件可使用的典型命令缓冲区格式,并且是本发明如上所述的具体实现。除了运行时刻例程602(部分操作系统)使用典型命令缓冲区格式将命令写入缓冲区之外,这个实现类似于结合图4描述的实现。在本领域存在这种格式的先例,例如DIRECT3D中使用的″DrawPrimitives2″令牌流。如果这个格式适于硬件的直接耗用,则除了硬件可以直接耗用运行时刻例程602的输出而不是需要用户模式驱动程序DLL403中的转换层之外,如结合图4描述的那样进行执行。
图7图解了中间(非硬件可用)典型命令缓冲区。图7描述了系统的另一个变型,其中运行时刻例程702产生具有已知格式的命令缓冲区703,并且接着调度该缓冲区。一旦被选择分配,内核模式驱动程序405必须读取缓冲区,并且将其转换成特定于硬件的命令。图7示出了那些被内核模式驱动程序写入DMA存储器707的命令,尽管在这种系统中可以使用任何控制硬件的机制。图7的系统与DIRECT3D驱动程序结构化的现有技术的类似之处在于,DrawPrimitives2令牌流被传递到内核模式驱动程序705。主要区别在于,图7的系统考虑对命令缓冲区进行OS仲裁的调度,而DIRECT3D目前没有正式调度GPU的时间。
对于线程/GPU上下文的联系,本领域的技术人员可以理解对CPU上执行的线程的定义:线程封装了必须通过操作系统上下文切换的易失CPU寄存器和其它CPU状态,以便允许多个任务同时工作。通过按照足够精细的粒度交换线程上下文以进出CPU,并且允许各个线程执行一定的时间(通常被称为″线程定量″),操作系统可以提供线程并行执行的假象。
上述系统类似地提供了对CPU线程上下文的GPU模拟。然而应当理解,如果GPU上下文与CPU线程上下文相关,使得只能通过该线程中运行的CPU代码操作GPU上下文,则存在某些益处。本领域存在CPU和GPU上下文之间的一一对应的先例(参见OpenGL API),其中CPU线程上下文只能具有一个与之相关的GPU上下文(″当前上下文″)。通过有关OpenGL加速器提供商提供的单片驱动程序协同这种系统中的GPU上下文的管理,其中很少不需要操作系统的参与,因此在OpenGL环境中由线程/GPU上下文联系得到的益处明显不同于这里描述的系统中的益处。
对于效率而言,将GPU上下文与单个CPU线程联系起来所得到的明显益处是,由于已知线程是唯一一个可以在GPU上下文上工作的线程,所以修改GPU状态不需要线程同步(例如获得旋转锁、临界段或互斥)。降低线程同步的数量使性能受益。例如,在出现图5描述的高频率事件(绘图调用502、验证511、刷新检查512、转换到DDI513、从DDI转换到硬件命令521、刷新检查522和命令写入523)期间不必获得线程同步原语。
下面的描述说明了现有线程同步原语的作用。本领域的技术人员可以理解,现代操作系统提供许多线程同步原语,例如旋转锁、临界段、互斥、事件、信号灯、资源(可以被多个线程用于共享访问,或被单线程用于独占访问)等等。这些线程同步原语通常允许线程执行到暂停执行,直到发生某种事件(例如外部事件、资源变得可用等等)。如果线程正等待某种这样的同步原语,则操作系统检测何时该原语得到″通知″,使得线程可以继续执行。上面列举的各种同步原语的语义有很好的文档支持。为了图解,我们会描述″互斥″原语,该原语被用来协同对共享资源的访问。每次只有一个线程可以获得″互斥″,并且在另一个线程可以获得″互斥″之前必须释放″互斥″。当互斥被释放时,不止一个线程可能正等待它,在这种情况下操作系统必须将互斥指定给单线程,并且解锁该线程,直到其接着释放互斥。将GPU上下文与CPU线程相关的益处独立于线程同步原语的语义和实现的细节(本领域的技术人员可以理解),因此我们不会在这里关注这些细节。
这里的基本观点在于,如果GPU上下文与系统中的一个CPU线程相关,则使用线程同步原语暂停该线程实质上使得该GPU上下文对于应用程序不可用,直到CPU线程被解锁。只要线程被暂停,由于只有暂停的线程可以请求GPU上下文执行绘图或其它操作,则不能请求GPU上下文执行绘图或其它操作。如果底层系统提供适当的低级手段(例如将待执行绘图命令刷新到对应GPU),则应用程序可以使用线程同步原语协同绘图和其它线程操作。
更加重要的是,存在许多应用程序,这些应用程序使操作系统暂停已经将GPU上下文选入其中的线程,以防止那些GPU被操作,直到所涉及的线程已经被解锁。例如,为了进行资源管理,可能需要为单个应用程序提供所有GPU资源(例如在Windows中,如果独占全屏幕的DIRECTX游戏得到应用程序焦点)。操作系统可以暂停其它希望用GPU绘图的线程,使得它们不浪费宝贵的时间以尝试绘图,而绘图所需的资源对于它们是不可用的。
对于集成CPU和GPU上下文切换,如果加强如上所述的GPU上下文/CPU上下文联系,使得CPU上下文只能具有一个相关的GPU上下文,则对于CPU和GPU之间存在密切联系的某些硬件体系结构(例如集成和/或UMA图形体系结构),可能具有另一个益处。在这种情况下,操作系统的线程上下文切换代码可以在加载CPU的上下文的同时加载相关GPU上下文。这种实现策略在某些系统中尤其有利,其中CPU代码不必向驻留在图5所述的外部存储器中的命令缓冲区写入GPU命令。由于只有线程的当前GPU上下文可以被其上下文位于CPU中的线程的上下文中执行的代码操作,因此与将那些命令写入缓冲区以便GPU以后耗用的方式相反,在加载CPU上下文的同时使对应于线程的GPU上下文的硬件寄存器对该线程可用的方式利于立即向GPU分配绘图命令。例如,在x86体系结构上,硬件寄存器可以被映射到端口I/O空间,因此IN/OUT指令可用来和GPU通信;或者可选地,它们可以作为存储器映射寄存器被暴露,使得针对特定存储器位置的读写会与GPU通信。这些设施必须伴随有针对提交到硬件的命令的严格验证,以防止带缺陷或恶意代码产生的虚假操作崩溃或破坏操作系统。图5中的用户模式驱动程序520接着会简单地在这些暴露给当前线程的硬件设施上执行操作,而不是向命令缓冲区写入命令。
这种方案有效地将图5中解决的多数或所有调度和等待问题合并到操作系统的线程调度机制中。例如,操作系统包含暂停直到指定资源可用之前不能执行的线程的设施(例如,在被换入之后变得可用的存储器片段);必须加强这些设施,使得具有当前GPU上下文的线程会暂停,直到继续执行所需的所有资源变得可用,其中包含该线程的当前GPU上下文所需的资源。就象操作系统中的虚拟存储器/页面调度功能那样,实现这种系统需要操作系统和底层硬件设施之间的紧密协同。虽然这种系统的不高明的实现会导致更加费时的线程上下文切换,然而在其上下文当前被加载的CPU线程没有最新GPU上下文的情况下,可以简单地实现优化,例如不上下文切换GPU。
结合图4-7描述的系统可以实现得到管理的代码。例如,2002年1月4日提交、在标题为″Title of Managed Drivers Application″、得到共同授权的待审美国专利申请10/039,035中描述了这样的系统和方法,所述系统和方法管理具有中间语言形式(独特的图形处理方式)的对象和图形系统。尤其是,图5的系统可以实现得到管理的代码,其中应用程序500、运行时刻例程510和/或用户模式驱动程序520的部分以中间语言形式传送,并且在客户端上被JIT编译。3个部件会以中间语言形式被分别传送到客户端。JIT编译器接着将它们合成为包含所有3个部件的部分的统一目标代码片段。这种体系结构的潜在优势是可以执行更优的目标代码;除了诸如针对客户端计算机上可用的微处理器的优化的优点之外,应用程序500的针对入口点的调用中的常数可以被传递到运行时刻例程510和用户模式驱动程序520,可能导致目标代码只向命令缓冲区写入少量常数字,而不是为达到相同结果而越过若干函数调用的边界。由于用户模式驱动程序520具体针对客户端上的图形硬件,所以应用程序500的中间语言形式仍然独立于硬件。
虽然通过为所有3个部件(应用程序500、运行时刻例程510和用户模式驱动程序520)产生得到管理的代码可以达到最大可能的性能改进,然而系统可以使应用程序500和运行时刻例程510得到管理,并且与分立的用户模式驱动程序520交互,甚至只使应用程序500得到管理,并且与分立的运行时刻例程510和用户模式驱动程序520交互。事实上,可以使这些子系统和平共处,其中假定运行时刻例程510和/或用户模式驱动程序520的中间语言和用户模式DLL形式均可用。
图6和7的系统也可以因后绑定的得到管理的代码而受益,如上所述。如果运行时刻例程502和602被管理,JIT可以执行优化,例如在运行时刻进行参数验证检查。在图6的系统中,JIT产生的统一目标代码片段会向可DMA的存储器写入典型命令缓冲区数据,以便最终提交到硬件。在图7的系统中,JIT产生的目标代码会向中间缓冲区发出数据,以便内核模式驱动程序分析和转换。
由于多个客户端应用程序可能希望向硬件发送命令,并且DMA是使应用程序以彼此之间的干扰或冲突最小的方式并行操作的简单方式,本文描述的大多数系统假定硬件具有DMA能力。本发明也可以被修改成在非DMA硬件上运行,其中使用不同模型(例如PIO或MMIO)对这种硬件进行编程。为了实现这种系统,驱动程序的用户模式部分可以将一组独立于硬件的令牌写入缓冲区,而不是写入可被硬件直接耗用的、特定于硬件的令牌流。当调度程序向内核驱动程序提交命令缓冲区时,内核驱动程序会将独立于硬件的令牌转换成特定于硬件的命令,并且通过硬件固有的控制机制发送它们。为了适应这种实现,系统必须为用户模式驱动程序的写入分配非DMA存储器,并且必须实现用于通知命令缓冲区完成的适当机制。为了解决分配非DMA存储器的问题,系统可以为内核驱动程序提供为其用户模式对等程序的写入分配命令缓冲区存储器的选项。为了解决通知命令缓冲区完成的问题,针对内核驱动程序的接口可以为驱动程序提供通过返回值通知调度程序硬件已经执行命令缓冲区的选项。
如上所述,虽然前面结合各种计算设备和网络体系结构描述了本发明的示例性实施例,然而本发明的基本构思可以被应用于任何期望管理协处理资源的计算设备或系统。于是,本发明的用于管理协处理器计算资源的技术可以被应用于各种应用和设备。例如,本发明的管理技术可以被应用于计算设备的操作系统,本发明可作为设备上的单独对象、另一个对象的一部分、来自服务器的可下载对象、设备或对象与网络之间的″中间人″、分布式对象等等。虽然示例性的编程语言、名称和例子在这里被选择代表各种选项,然而这些语言、名称和例子不被用来限制本发明的范围。
可以结合硬件、软件或其组合来实现这里描述的各种技术。于是,本发明的方法和装置,或其某些方面或部分,可以具有例如软盘、CD-ROM、硬盘驱动器或任何其他机器可读存储介质的有形介质中包含的程序代码(即指令)的形式,其中当程序代码被载入诸如计算机的机器并且被机器执行时,机器变成实现本发明的设备。对于可编程计算机上的程序代码的执行,计算设备通常包含处理器、处理器可读的存储介质(包含易失和非易失存储器和/或存储单元)、至少一个输入设备和至少一个输出设备。可以使用本发明的管理技术(例如通过使用数据处理API等等)的一或多个程序最好通过高级过程或面向对象编程语言实现,以便与计算机系统通信。然而必要时也可以通过汇编或机器语言实现程序。在所有情况下,语言可以是编译或解释语言,并且与硬件实现组合。
也可以通过用某种传输介质(例如通过电线或电缆、光纤、或任何其他传输形式)发送的程序代码实现的通信来实现本发明的方法和装置,其中当程序代码被具有示例性实施例中描述的资源管理能力的机器(例如EPROM、门阵列、可编程逻辑设备(PLD)、客户端计算机、录像机等等)或接收机器接收、载入和执行时,上述装置变成实现本发明的设备。当在通用处理器上实现时,程序代码与处理器组合以提供调用本发明的功能的独特设备。另外,与本发明结合使用的任何存储技术均可以是硬件和软件的组合。虽然结合具有各种附图的优选实施例描述了本发明,然而应当理解,在不偏离本发明的前提下,可以使用其它类似的实施例,或者可以对执行本发明的相同功能的上述实施例进行修改和增加。例如,虽然在诸如对等网络环境的网络环境中描述了本发明的示例性网络环境,然而本领域的技术人员会认识到,本发明不限于此,并且本申请中所描述的方法可以适用于任何诸如游戏控制台、手持计算机、便携计算机等等的计算设备或环境(无论是有线或无线),并且可以被应用于通过通信网络连接并且在网络上交互的任何数量的这种计算设备。此外应当强调,本发明考虑到包含手持设备操作系统和其它专用操作系统的各种计算机平台,尤其是随着无线网络设备数量的继续激增。此外,可以在多个处理芯片或器件之中或之上实现本发明,并且可以类似地在多个器件上实现存储。因此,本发明不应限于任何单独的实施例,而是应当根据所附权利要求书的广度和范围来解释。