用于本地调试图形程序的系统、方法和计算机程序产品的制作方法
【专利摘要】提供经由采用单个图形处理单元的系统调试图形程序的系统、方法和计算机程序产品。方法包括以下步骤:将应用程序编程接口上下文的初始状态存储在存储器中,拦截与帧相关联的API命令流,将API命令流传送到实现API的软件层以渲染帧;以及响应于断点将图形处理单元上下文存储在存储器中。API上下文的初始状态与帧的开始相对应,并且API命令流由图形应用程序生成。
【专利说明】用于本地调试图形程序的系统、方法和计算机程序产品
[0001]相关申请的交叉引用
[0002]本申请要求于2012年11月26日提交的序列号为61/730,025的美国临时申请的权益,其全部内容通过援引的方式在本文中加以合并。
【技术领域】
[0003]本申请涉及软件设计,并且更具体地,涉及图形程序的调试。
【背景技术】
[0004]程序员如今已经习惯于能够经由在如今的集成开发环境(IDE)诸如Microsoft?Visual Studio中所实现的众多工具来创建和调试程序。程序员可以为由目标处理器执行的程序创建源代码、编译源代码以生成可执行文件、以及在目标处理器上运行可执行文件。IDE可以包括允许程序员使用断点执行程序、一次一个指令地单步调试程序、从断点到断点单步调试程序、以及在程序的执行期间在不同的点处查看存储器或寄存器的内容的工具。
[0005]典型地,目标处理器可以是中央处理单元(CPU),诸如Intel@x86家族的处理器或包括基于CPU核的RISC (精简指令集)的ARlfCortex家族的处理器。这样的处理器实现为有能力中断或抢占由处理器所执行的某代码的执行。该能力使得程序员能够经由还被用于实质上同时执行操作系统(0S)、IDE或其他软件的单个处理器来调试程序。然而,如今的常规图形处理单元(GPU)可能不能够以这样的方式操作。例如,常规的GPU可能不会为在GPU上执行的具体的进程使能抢占。也就是说,程序员不能停住GPU上程序的执行,而同时允许诸如生成用于在附接的监视器上显示的图形信息的其他操作继续执行。在没有这样能力的情况下,用于GPU的测试平台典型地限于具有经网路连接到客户端系统的GPU的远程系统或者具有多个GPU的本地系统,其中一个GPU专用于显示操作并且另一个GPU专用于测试操作。这样的系统设置和操作更复杂,需要额外的硬件和特殊配置。能够在的单个GPU系统上编码对于程序员是有用的,单个GPU系统在大多数台式计算机和笔记本电脑上大量可用。因此,需要解决与现有技术相关的该问题和/或其他问题。
【发明内容】
[0006]提供用于经由采用单个图形处理单元的系统来调试图形程序的系统、方法和计算机程序产品。方法包括以下步骤,将应用程序编程接口上下文的初始状态存储在存储器中,拦截与帧相关联的API命令流,将API命令流传送到实现API的软件层以渲染帧,以及响应于断点,将图形处理单元上下文存储在存储器中。API上下文的初始状态与帧的开始相对应,并且API命令流由图形应用程序生成。
【专利附图】
【附图说明】
[0007]图1示出了根据一个实施例的、用于利用具有单个图形处理单元的系统来调试图形程序的方法的流程图;[0008]图2示出了根据现有技术的、配置为调试图形程序的系统;
[0009]图3示出了根据一个实施例的、配置为调试图形程序的系统;
[0010]图4示出了根据一个实施例的并行处理单元;
[0011]图5示出了根据一个实施例的、图4的流多处理器;
[0012]图6是根据一个实施例的,由图4的并行处理单元所实现的图形处理管线的示意图;
[0013]图7A示出了根据一个实施例的、用于着色器程序的代码的一部分;
[0014]图7B示出了根据另一个实施例的、用于使用单个图形处理单元来调试着色器程序的系统;
[0015]图8A、8B和8C示出了根据另一个实施例的、用于采用单个图形处理单元来调试图形程序的方法的流程图;以及
[0016]图9示出了前面各种实施例的各种架构和/或功能性可以在其中实现的示例性系统。
【具体实施方式】
[0017]本公开描述了用于在具有单个GPU的系统上调试图形程序的机制。应用程序填充码(shim)配置为拦截由主机处理器执行的图形应用程序所生成的API命令。图形应用程序当被编译时配置为生成传送到实现API的软件层的API命令,软件层诸如驱动程序或运行时库(runtime library)。配置为针对软件层生成API命令的指令可以由配置为针对应用程序填充码生成API命令的指令所替代。指令可以由软件工具以二进制代码自动替代,或者通过将应用程序填充码链接到用于图形应用程序的源代码来手动替代。当执行图形应用程序时,API命令被路由到应用程序填充码而不是软件层。
[0018]应用程序填充码配置为跟踪与图形应用程序相关联的API上下文。可以通过创建和修改表示当前API上下文的状态模型来跟踪API上下文。应用程序填充码配置为基于从图形应用程序所接收的API命令来更新状态模型。在状态模式被更新之后,应用程序填充码可以转发API命令给软件层,如图形应用程序原本打算的。
[0019]应用程序填充码可以配置为实现重放机制,其允许调试工具实现一般只与常规(PU相关联的各种调试技术。重放机制包括以下步骤,在开始渲染图像数据的帧用于显示时存储API上下文的初始状态,将由图形应用程序为图像数据的帧所生成的API命令流存储在重放缓冲区中,以及开启重放循环以重复渲染图像数据的帧数次。重放循环的每次经过包括还原API上下文以和API上下文的初始状态相匹配,以及传送重放缓冲区中的API命令流到软件层。当在重放循环期间遇到断点时,在帧的渲染期间可以捕获GPU上下文的当前状态。使用上述的重放机制,调试工具可以允许程序员在采用单个GPU的系统上,在程序的断点处停止,一次一个指令地单步调试程序,一次一个断点地单步调试程序等,而不会使显示定格。
[0020]图1示出了根据一个实施例的、用于利用具有单个GPU的系统调试图形程序的方法100的流程图。在步骤102,将API上下文的初始状态存储在存储器中。API上下文的初始状态可以与表示在帧开始时的API上下文的状态模型中所包括的信息相对应。API上下文的初始状态被复制到存储器中的单独的数据结构中,以便重新设定在稍后的时间点的API上下文的状态。在步骤104,拦截由图形应用程序所生成的API命令流。API命令流可以存储在重放缓冲区中。在给定的时间点可以存在多个API上下文,并且每个API上下文可以与由图形应用程序所生成的一个或多个API命令流相关联。在一个实施例中,与API上下文相关联的两个或更多个API命令流存储在重放缓冲区。在本说明的上下文中,重放缓冲区是分配在存储器中的任何数据结构,并且配置为存储API命令的有序列表。在一个实施例中,重放缓冲区是链表。在另一个实施例中,重放缓冲区是FIFO。
[0021 ] 在步骤106,将API命令流传送到软件层。在一个实施例中,软件层可以是实现API的驱动程序,诸如实现OpenGL API的驱动程序。在另一个实施例中,软件层可以是实现API的运行时库,诸如实现Direct3D API的运行时库。在这样的实施例中,软件层可以链接到另一个驱动程序或者其他中间层。在步骤108,应用程序填充码确定是否已经到达断点。在本公开的上下文中,断点是由处理器执行的特殊指令,其使得执行停住并且潜在地使得错误处理程序或其他例程被执行。断点可以是特殊的指令或者与指示指令与程序中的断点相关联的另一个指令(例如指令前缀)相关联。在一个实施例中,断点可以(直接或间接通过错误处理程序)使得GPU传送指示断点已经到达并且GPU已经停住进一步指令的执行的消息到驱动程序。如果没有到达断点,那么方法800返回到步骤106,其中将附加的API命令传送到软件层。然而,返回到步骤108,响应于到达断点,方法800进行到步骤110,其中将GPU上下文的当前状态存储在存储器中。在步骤112,开启重放循环,其使得API上下文的初始状态被还原、API命令流被重新传送到软件层、以及将GPU上下文的另一个状态存储在存储器中。
[0022]现在将关于各可选架构和特征来阐述更多示例性的信息,根据用户的期望可以采用或不采用所述架构和特征来实现前述的框架。应该强烈注意下面的信息出于示例性的目的而阐述并且其不应该被认为是以任何方式进行限制。下面特征中的任何一个可以可选地合并,排斥或无需排斥所述的其他特征。
[0023]图2示出了根据现有技术的、配置为调试图形程序的系统。如图2所示,系统包括经由网络230耦连到目标平台250的客户端平台200。客户端平台200可以是例如台式计算机、笔记本电脑、平板电脑或配置为运行IDE或其他调试软件的任何其他系统。客户端平台200包括中央处理单元(CPU) 201、存储器204、GPU206、显示设备208和网络接口控制器(NIC)203。CPU201可以是x86类型处理器、RISC处理器、PowerPC处理器等。存储器204可以是易失性存储器,诸如动态随机存取存储器(DRAM)。虽然没有明确示出,客户端平台200可以包括非易失性存储设备,诸如硬盘驱动器(HDD)或其他类型的磁的或者光学存储系统。NIC203可以实现TCP/IP协议,用于通过网络230连接到一个或多个其他设备,网络230可以是例如局域网(LAN)、广域网(WAN)、互联网等。显不设备208可以是液晶显不(IXD)设备、有机发光二极管(OLED)显示设备、阴极射线管(CRT)显示设备等。
[0024]GPU206是实现包括图像处理管线的至少一部分的可编程、并行处理架构的处理器。图像处理管线配置为生成图像数据用于在显示设备208上显示,显示设备208可经由任何类型的通信链路连接到GPU206,诸如视频图形阵列(VGA)连接、高清晰度多媒体接口(HDMI)连接、显示端口(DP)连接等。虽然没有明确示出,GPU206可以连接到本地图形存储器,诸如同步动态随机存取存储器(SDRAM)等。GPU206可以配置为基于从由CPU201执行的驱动程序传送到GPU206的命令来生成图像数据的帧。图像数据的帧可以存储在本地图形存储器中的帧缓冲区中,并且转换为经由通信链路传送到显示设备208的视频信号。
[0025]目标平台250可以是例如另一个台式计算机,其连接到网络230并且包括第二CPU251、第二 GPU256、第二存储器 254 和第二 NIC253。CPU251、存储器 254 和 NIC253 与上述的CPU201、存储器204和NIC203类似。第二 GPU256可以称为目标设备。开发应用程序诸如IDE或其他类型的调试工具可以由客户端平台200执行。开发应用程序可以使得图形程序(即着色器)由GPU256执行,通过在客户端平台200上执行的开发应用程序实现例如断点、指令步进等调试机制。可以理解,目标平台250可以不包括附接于GPU256的显示设备,因为在调试期间GPU256可以停住,从而阻止GPU256生成显示信号用于显示设备。然而,程序员能够在客户端平台200的显示设备208上查看GPU256的状态,因为GPU206在调试期间不停住,因此能够生成显示信号用于显示设备208。
[0026]用于调试图形程序的该类型的远程系统可能足以满足某些情形,在这些情形中程序员利用设置在中央办公室并且经由局域网连接到一个或多个目标平台250的客户端平台200。然而,该系统需要增加了不必要的费用的附加的硬件并且设置复杂,需要程序员或者网络管理员配置目标平台250的各种IP地址并且相应地配置开发应用程序。很多时候程序员将只能够访问仅包括单个GPU的常规系统(诸如台式计算机或笔记本电脑),而程序员可能无法访问连接到网络的目标平台。
[0027]可以理解,可以构造将多个GPU合并到单个平台中的可替代系统,其中至少一个GI3U可以专用于生成图像数据用于显示,并且至少另一个GPU专用于调试操作。该类型的系统已经用于调试用于图形处理单元上的通用计算(GPGPU)的计算应用程序。然而,这样的系统需要用于专用于调试操作的GPU的单独的驱动程序,其阻止专用于调试操作的GPU处理图形程序。也就是说,常规操作系统诸如MiCix)SOft@WindOWS配置为将图像操作分配给配置为处理图形程序的任意可用GPU。因此,在没有潜在将操作系统显示由操作系统或其他应用程序所产生的图像数据的能力停滞的情况下,开发应用程序不能出于调试的目的而停住图形程序的操作。利用下述系统可以解除这样的问题。
[0028]图3示出了根据一个实施例的、配置为调试图形程序的系统。如图3所示,客户端平台300与客户端平台200类似之处在于,客户端平台300包括CPU301、存储器304、GPU306、显示设备308和NIC303。在一个实施例中,这些部件与客户端平台200的部件类似。存储器304可以包括操作系统(0S)331、驱动程序332、IDE333、图形应用程序334、一个或多个着色器程序335和影子状态存储器336。0S331可以是Microsoft@Windows、Linux?、Mac@0SX 等。IDE333 可以是 Microsoft@Visual Studio>NVIDIA@Nsight (Visual Studio 的扩展)、开源Eclipse Platform或者能够调试图形程序的任何其他类型的开发环境或调试软件。
[0029]驱动程序332配置为传送指令到GPU306以便在GPU306上执行任务。在一个实施例中,驱动程序332实现由OpenGL0规范所定义的API。API使得图形应用程序334能够生成发送到驱动程序332的独立于硬件的API命令,驱动程序332转而使得GPU306实施由API命令所指定的操作。在另一个实施例中,驱动程序332实现与实现Direct3D@API的运行时库相关联的API。API使得图形应用程序334能够生成发送到运行时库的独立于硬件的API命令,运行时库转而传送附加的API命令到驱动程序332,其使得GPU306执行由API命令所指定的操作。可以理解,由图形应用程序334所生成的API命令可以通过的一个或多个中间软件层,诸如应用程序填充码、库等,直接或者间接传送到驱动程序332。
[0030]图形应用程序334可以是配置为由CPU301执行以便生成传送到软件层的API命令的软件应用程序。图形应用程序334可以与一个或多个着色器程序335相关联,诸如配置为由GPU306的可编程程序单元执行的顶点着色器、几何着色器、或片段着色器(即像素着色器)。着色器是配置为由GPU执行用于变换几何基元或着色像素(即为一个或多个像素生成颜色分量值)的指令集的通用术语。每个着色器可以配置为接收一个或多个输入缓冲区(例如顶点缓冲区等)并且生成一个或多个输出缓冲区(例如三角面片(triangle patch)、颜色矢量等)。
[0031]如上所述,常规GPU不具有在执行期间停住但继续产生图像数据用于在显示设备上显示的能力。为了解决该问题,应用程序填充码配置为重放由图形应用程序所指定的操作,如此IDE333将显示GPU306的状态,好像GPU306在调试期间停住但GPU实际上允许继续执行,从而允许将GPU上下文从与图形应用程序相关联的API上下文切换到例如与生成图像数据用于在显示设备308上显示的操作系统331相关联的API上下文。
[0032]在一个实施例中,应用程序填充码配置为跟踪与图形应用程序334相关联的API上下文。应用程序填充码在特定的帧或一些帧开始时将API上下文的初始状态存储在存储器304中。程序员可以利用调试工具指示对哪个或哪些帧感兴趣。应用程序填充码将用于由图形应用程序334所生成的一个或多个帧的API命令流存储在存储器304中。应用程序填充码随后可以开启重放循环以重复执行API命令流,以便数次渲染图像数据的一个或多个帧。也就是说,重放循环的单次迭代执行API命令流以便渲染图像数据的一个或多个帧。在API命令流结束时,可以还原API上下文的初始状态,并且可以重放API命令流以按实质上相同的顺序重复操作和重新渲染图像数据的一个或多个帧。API命令可以包括加载特定的着色器程序的调用、指定包括多个几何基元(例如三角形)的入栈缓冲区的调用、绘制调用等。API命令流可以保存在存储器304的重放缓冲区中并且随后按用户的期望重放很多次以便实施调试操作。
[0033]该重放功能性可以由IDE333或者其他调试工具利用以便实现各种调试技术。例如,可以通过执行图形应用程序334并且在特定的帧期间开启重放循环来调试图形应用程序334和/或着色器程序335。断点(即特殊指令)可以包括在着色器程序335中某一行处,其使得GPU306停住与图形应用程序334相关联的任何进一步指令的执行。在一个实施例中,断点指令使得由GPU306执行错误处理程序。错误处理程序可以使得消息(例如经由驱动程序332)传送到应用程序填充码。在一个实施例中,应用程序填充码配置为复制GPU上下文的当前状态到影子状态存储器336中。一旦GPU上下文的当前状态已经存储在影子状态存储器336中,则可以允许GPU306继续着色器程序335和由API命令流所指定的任何其他指令的执行。通常,允许GPU306继续执行将阻止程序员检查GPU上下文的状态(即寄存器、相关联的存储器构造等),这是因为随着执行附加指令,GPU上下文将被更新。然而,在这种情况下,GPU上下文的状态存储在影子状态存储器336中并且不受允许程序继续或允许不同的上下文加载到GPU306的影响。因此,虽然GPU306已经继续其他任务,但程序员可以检查在影子状态存储器336中存储的信息。
[0034]在一个实施例中,GPU306包括以下结合图4和5描述的并行处理单元400。可以理解,其他实施例可以包括采用不同架构的GPU,并且以下所示的架构用于示例性目的。[0035]图4示出了根据一个实施例的、并行处理单元(PTO)400。虽然本文中并行处理器提供为PPU400的示范,应该强烈注意阐述这样的处理器仅用于示例性目的,并且出于相同目的可以采用任何处理器以对其进行补充和/或代替。在一个实施例中,PPU400配置为在两个或更多个流多处理器(SM) 450中并发执行多个线程。线程(即执行线程)是在特定的SM450中执行的指令集的实例化。下面结合图5详细描述的每个SM450可以包括但不限于一个或多个处理核、一个或多个加载/存储单元(LSU)、一级(LI)高速缓存、共享存储器等。
[0036]在一个实施例中,PPU400包括输入/输出(I/O)单元405,其配置为经系统总线402从中央处理单元(CPU)传送和接收通信(即命令、数据等)。I/O单元405可以实现外围部件互连快速(PCIe)接口用于经PCIe总线通信。在可替代实施例中,I/O单元405可以实现其他类型的已知总线接口。
[0037]PPU400还包括主机接口单元410,其解码命令并且传送命令到PPU400的任务管理单元415或如命令可能指定的其他单元(例如存储器接口 480)。主机接口单元410配置为在PPU400的各种逻辑单元之间路由通信。
[0038]在一个实施例中,经编码为命令流的程序由CPU写入缓冲区。缓冲区是可由CPU和PPU400两者访问(即读出/写入)的存储器中的区域,存储器例如存储器404或系统存储器。CPU将命令流写入缓冲区并且随后将指向命令流开始的指针传送到PPU400。主机接口单元410将指向一个或多个流的指针提供给任务管理单元(TMU) 415。TMU415选择一个或多个流并且配置为将所选择的流组织为挂起网格池。挂起网格池可以包括仍然未选择用于执行的新的网格和已经部分执行并已被暂缓的网格。
[0039]耦连在TMU415和SM450之间的工作分布单元420管理活动网格池,选择和分派活动网格用于由SM450执行。当挂起网格有资格执行时,即没有未解决数据依赖关系,挂起网格由TMU415转移到活动网格池。当活动网格的执行被依赖关系阻碍(block)时,活动网格被转移到挂起池。当网格的执行完成时,由工作分布单元420将网格从活动网格池移除。除了接收来自主机接口单元410和工作分布单元420的网格以外,TMU415还接收在网格的执行期间由SM450动态生成的网格。这些动态生成的网格加入到挂起网格池中的其他挂起网格。
[0040]在一个实施例中,CPU执行实现应用程序编程接口(API)的驱动程序内核,API使在CPU上执行的一个或多个应用程序能够调度用于在PPU440上执行的操作。应用程序可以包括使得驱动程序内核生成一个或多个用于执行的网格的指令(即API命令)。在一个实施例中,PPU400实现SMD(单指令、多数据)架构,其中网格中的每个线程块(即线程束(warp))由线程块中的不同的线程针对不同数据集并发执行。驱动程序内核定义包括k个相关线程的线程块,如此在相同线程块中的线程可以通过共享存储器交换数据。在一个实施例中,线程块包括32个相关线程,并且网格是执行相同流的一个或多个线程块的阵列,并且不同线程块可以通过全局存储器交换数据。
[0041]在一个实施例中,PPU400包括X个SM450 (X)0例如,PI3MOO可以包括15个各异的SM450。每个SM450都是多线程的并且配置为并发执行来自特定的线程块的多个线程(例如32个线程)。每个SM450经由交叉开关460 (或其他类型的互连网络)连接到二级(L2)高速缓存465。L2高速缓存456连接到一个或多个存储器接口 480。存储器接口 480实现用于高速数据转移的16、32、64、128位数据总线等。在一个实施例中,PI3MOO包括U个存储器接口 480 (U),其中每个存储器接口 480 (U)连接到对应的存储器设备404 (U)。例如,PPU400可以连接到多达6个存储器设备404,诸如图形双倍数据率、版本5、同步动态随机存取存储器(⑶DR5SDRAM)。
[0042]在一个实施例中,PPU400实现多级存储器层次。存储器404位于耦连到PPU400的SDRAM的片外。来自存储器404的数据可以被获取并且存储在L2高速缓存465中,L2高速缓存465位于片上并且在各SM450之间共享。在一个实施例中,每个SM450还实现LI高速缓存。LI高速缓存是专用于特定的SM450的私有存储器。每个LI高速缓存都耦连到共享L2高速缓存465。可以获取来自L2高速缓存465的数据并且存储在每个LI高速缓存中用于在SM450的功能单元中处理。
[0043]在一个实施例中PPU400包括图形处理单元(GPU)。PPU400配置为接收指定用于处理图形数据的着色器程序的命令。图形数据可以定义为诸如点、线、三角形、四边形、三角形条带等的基元的集合。典型地,基元包括指定(例如模型空间坐标系统中)基元的数个顶点以及与基元的每个顶点相关联的属性的数据。属性可以包括位置、颜色、表面法向量、纹理坐标等中的一个或多个。PPU400可以配置为处理图形基元以生成帧缓冲区(即用于显示器的每个像素的像素数据)。驱动程序内核实现图形处理管线,诸如由OpenGL API所定义的图形处理管线。
[0044]应用程序将用于场景的模型数据(即顶点和属性的合集)写入存储器。模型数据定义在显示器上可见的每个对象。随后应用程序对驱动程序内核进行API调用,其请求模型数据被渲染和显示。驱动程序内核读取模型数据并且将命令写入缓冲区以实施一个或多个操作来处理模型数据。命令可以编码不同的着色器程序,包括顶点着色器、外壳着色器、几何着色器、像素着色器等中的一个或多个。例如,TMU415可以配置一个或多个SM450以执行顶点着色器程序,其处理由模型数据所定义的数个顶点。在一个实施例中,TMU415可以配置不同的SM450并发地执行不同的着色器程序。例如,SM450的第一子集可以配置为执行顶点着色器程序,而SM450的第二子集可以配置为执行像素着色器程序。SM450的第一子集处理顶点数据以产生经处理的顶点数据并且将经处理的顶点数据写入L2高速缓存465和/或存储器404。在经处理的顶点数据被光栅化(即从三维数据变换为屏幕空间的二维数据)以产生片段数据之后,SM450的第二子集执行像素着色器以产生经处理的片段数据,其随后与其他经处理的片段数据混合并写入存储器404中的帧缓冲区。顶点着色器程序和像素着色器程序可以并发执行,以管线方式处理来自相同场景的不同数据直到所有用于场景的模型数据都已经渲染到帧缓冲区。随后,帧缓冲区的内容传送到显示控制器用于在显示设备上显示。
[0045]PPU400可以包括在台式计算机、笔记本电脑、平板电脑、智能手机(例如无线的、手持设备)、个人数字助理(PDA)、数码相机、手持电子设备等中。在一个实施例中,PPU400具体化在单个半导体衬底上。在另一个实施例中,PPU400和一个或多个其他逻辑单元诸如精简指令集(RISC) CPU、存储器管理单元(MMU)、数模转换器(DAC)等一起包括在片上系统(SoC)中。
[0046]在一个实施例中,PPU400可以包括在图形卡上,其包括诸如⑶DR5SDRAM的一个或多个存储器设备404。图形卡可以配置为与包括例如北桥芯片集和南桥芯片集的台式计算机的主板上的PCIe槽接口。在又一个实施例中,PPU400可以是包括在主板的芯片集(即北桥)中的集成图形处理单元(iGPU)。
[0047]图5示出了根据一个实施例的、图4的流多处理器450。如图5中所示,SM450包括指令高速缓存505、一个或多个调度器单元510、寄存器堆520、一个或多个处理核550、一个或多个双精度单元(DPU) 551、一个或多个特殊功能单元(SFU) 552、一个或多个加载/存储单元(LSU)553、互连网络580、共享存储器/LI高速缓存570和一个或多个纹理单元590。
[0048]如上所述,工作分布单元420分派用于在PPU400的一个或多个SM450上执行的活动网格。调度器单元510从工作分布单元420接收网格并且管理针对每个活动网格的一个或多个线程块的指令调度。调度器单元510调度线程用于在并行线程组中执行,其中每个组被称为线程束。在一个实施例中,每个线程束包括32个线程。调度器单元510可以管理多个不同的线程块,在每个时钟周期期间分配线程块到线程束用于执行,并且随后调度来自各功能单元(即核550、DPU551、SFU552和LSU553)上的多个不同的线程束的指令。
[0049]在一个实施例中,每个调度器单元510包括一个或多个指令分派单元515。每个分派单元515配置为传送指令到功能单元中的一个或多个。在图5所示的实施例中,调度器单元510包括两个分派单元515,其使得每个时钟周期期间来自相同线程束的两个不同的指令被分派。在可替代实施例中,每个调度器单元510可以包括单个分派单元515或者附加的分派单元515。
[0050]每个SM450包括寄存器堆520,其提供用于SM450的功能单元的寄存器的集合。在一个实施例中,寄存器堆520在每个功能单元之间划分,如此为每个功能单元分配寄存器堆520的专用部分。在另一个实施例中,寄存器堆520在正由SM450执行的不同线程束之间划分。寄存器堆520为连接到功能单元的数据路径的操作数提供临时存储。
[0051]每个SM450提供L个处理核550。在一个实施例中SM450包括大量(例如192个等)各异的处理核550。每个核550是全管线(fully-pipelined)的单精度处理单元,其包括浮点运算逻辑单元和整数运算逻辑单元。在一个实施例中,浮点运算逻辑单元实现IEEE754-2008标准用于浮点运算。每个SM450还包括实现双精度浮点运算的M个DPU551、实施特殊功能(例如像素混合操作等)的N个SFU552和实施共享存储器/LI高速缓存570与寄存器堆520之间的加载和存储操作的P个LSU553。在一个实施例中,SM450包括64个DPU55U32 个 SFU552 和 32 个 LSU553。
[0052]每个SM450包括互连网络580,其将每个功能单元连接到寄存器堆520和共享存储器/LI高速缓存570。在一个实施例中,互连网络580是可以配置为将任何功能单元连接到寄存器堆520中的寄存器或共享存储器/LI高速缓存570中的任何存储器位置的交叉开关。
[0053]在一个实施例中,SM450在GPU中实现。在这样的实施例中,SM450包括J个纹理单元590。纹理单元590配置为从存储器404加载纹理图(例如纹理元素的2D阵列)并采样纹理图以产生经采样的纹理值在着色器程序中使用。纹理单元590使用锥形纹理(mip-map)(即改变细节层级的纹理图)来实现诸如抗锯齿操作的纹理操作。在一个实施例中,SM450包括16个纹理单元590。
[0054]上述PPU400可以配置为实施比常规CPU快得多的高并行计算。并行计算在图形处理、数据压缩、计量生物学、流处理算法等方面具有优点。
[0055]图6是根据一个实施例的、由图4的PPU400实现的图形处理管线600的示意图。图形处理管线600是实现从3D几何数据生成2D计算机生成图像的处理步骤的抽象流程图。如已知的,通过将操作切分为多个级,管线架构可以更有效地实施长延迟操作,其中每个级的输出耦连到下一个连续级的输入。因此,图形处理管线接收输入数据601,输入数据601从图形处理管线600的一级传送到下一级以生成输出数据602。在一个实施例中,图形处理管线600可以表示由OpenGL API所定义的图形处理管线。
[0056]如图6所示,图形处理管线600包括其包括数个级的管线架构。级包括但不限于数据汇编级610、顶点着色级620、基元汇编级630、几何着色级640、视口缩放、剔除和裁剪(VSCC)级650、光栅化级660、片段着色级670和光栅操作级680。在一个实施例中,输入数据601包括配置处理单元以实现图形处理单元600的级的命令和将由级处理的几何基元(例如点、线、三角形、四边形、三角形条带或扇形等)。输出数据602可以包括复制到存储器中的帧缓冲区或其他类型的表面数据结构中的像素数据(即颜色数据)。
[0057]数据汇编级610接收输入数据601,其指定顶点数据用于高阶(high-order)表面、基元等。诸如通过从主机处理器接收包括指向存储器中的缓冲区的指针的命令并且从缓冲区读取顶点数据,数据汇编级610将顶点数据收集到临时存储或队列中。随后将顶点数据传送到顶点着色级620用于处理。
[0058]顶点着色级620通过为每个顶点实施一次操作集(即顶点着色器或程序)来处理顶点数据。顶点可以例如指定为与一个或多个顶点属性相关联的4-坐标矢量。顶点着色级620可以操纵诸如位置、颜色、纹理坐标等的特性。也就是说,顶点着色级620实施针对顶点坐标或者与顶点相关联的其他顶点属性的操作。这样的操作一般包括加亮(lighting)操作(即修改顶点的颜色属性)和变换操作(即修改顶点的坐标空间)。例如,可以使用对象坐标空间中的坐标来指定顶点,对象坐标空间通过将坐标与把坐标从对象坐标空间转变为世界坐标或规格化设备坐标(NCD)空间的矩阵相乘来进行变换。顶点着色级620生成经变换的顶点数据,其传送到基元汇编级630。
[0059]基元汇编级630收集由顶点着色级620输出的顶点,并且将顶点分组为几何基元用于由几何着色级640处理。例如,基元汇编级630可以配置为将每三个连贯的顶点分组为几何基元(即三角形)用于传送到几何着色级640。在一些实施例中,具体的顶点可以被重复用于连贯的几何基元(例如在三角形条带中的两个连贯的三角形可以共享两个顶点)。基元汇编级630传送几何基元(即相关联的顶点的合集)到几何着色级640。
[0060]几何着色级640通过针对几何基元实施操作集(即几何着色器或程序)来处理几何基元。曲面细分操作可以从每个几何基元生成一个或多个几何基元。也就是说,几何着色器可以将每个几何基元细分为更精细的网孔的两个或更多个几何基元,用于由图形处理管线600的其余部分处理。几何着色级640传送几何基元到视口 SCC级650。
[0061]视口 SCC级650实施几何基元的视口缩放、剔除和裁剪。每个被渲染的表面与抽象摄像位置相关联。摄像位置表示观看场景的观察者的位置并且定义将场景的对象包围的视体(viewing frustum)0视体可包括视平面、后平面和四个裁剪平面。完全处于视体之外的任何几何基元可以被剔除(即丢弃),因为该几何基元将不利于最终渲染的场景。部分在视体内并且部分在视体外的任何几何基元可以被裁剪(即变换成包围在视体内的新的几何基元)。此外,可以基于视体的深度来缩放每个几何基元。随后传送所有潜在可视的几何基元到光栅化级660。[0062]光栅化级660将3D几何基元转换为2D片段。光栅化级660可以配置为利用几何基元的顶点来设置各种属性可以根据其插值的一组平面方程。光栅化级660还为多个像素计算覆盖掩膜,其指示用于像素的一个或多个采样位置是否拦截几何基元。在一个实施例中,还可以实施z测试以确定几何基元是否被已经光栅化的其他几何基元所遮蔽。光栅化级660生成片段数据(即与每个覆盖像素的特定的采样位置相关联的经插值的顶点属性),其传送到片段着色级670。
[0063]片段着色级670通过针对每个片段实施操作集(即片段着色器或程序)来处理片段数据。片段着色级670可以诸如通过为片段实施加亮操作或使用经插值的纹理坐标采样纹理图,来生成用于片段的像素数据(即颜色值)。片段着色级670生成像素数据,其传送到光栅操作级680。
[0064]光栅操作级680可以针对像素数据实施各种操作,诸如实施阿尔法测试、模板测试以及将像素数据与对应于和像素相关联的其他片段的其他像素数据混合。当光栅操作级680已经完成处理像素数据时(即输出数据602),可以将像素数据写入渲染目标,诸如帧缓冲区、颜色缓冲区等。
[0065]可以理解,除了上述一个或多个级之外或者代替上述一个或多个级,图形处理管线600中可以包括一个或多个附加的级。抽象图形处理管线的各种实现可以实现不同的级。此外,在一些实施例中可以从图形处理管线中排除上述一个或多个级(诸如几何着色级640)。其他类型的图形处理管线可以视为包括在本公开的范围内。此外,图形处理管线600中的任何级可以由图形处理器中的一个或多个专用硬件单元诸如PPU400实现。图形处理管线600中的其他级可以由可编程硬件单元诸如PPU400的SM450实现。
[0066]与在GPU306上启动单个内核,开启数百或数千个线程的GPGPU程序不同,图形程序通过在GPU306上启动初始内核来实现,初始内核转而无需CPU301的干预而启动一个或多个后续的内核。例如,图形程序可以在GPU306上启动内核以在一个SM450(或多个SM450 )上实施顶点着色级620。随后该内核启动单独的内核以实施几何着色级640,其转而启动另一个内核以实施片段着色器670等。另外,图形处理管线600的一些其他级可以在诸如光栅器或者数据汇编器的固定的单元硬件上实现。可以理解,来自一个内核的结果在由后续的内核在SM450上处理之前,可以由一个或多个中间固定功能硬件单元处理。结果,GPGPU程序可以通过加载经保存的状态到SM450中的一个并且重新启动停住的内核来潜在地还原,与GPGPU程序不同,图形程序重新加载困难得多,这是因为很多固定功能单元没有虑及将被重新加载的经保存的状态。上述的重放机制解除了该问题。
[0067]图7A示出了根据一个实施例的、用于着色器程序700的代码的一部分。如图7A中所示,着色器程序700是以高级着色器语言诸如NVIDIA0Cg (用于图形的C)编程的顶点着色器。着色器程序700是开发用于渲染经曲面细分的几何体的代码的一部分。可以理解,着色器程序700的代码仅用于示例性目的,并且可以使用本文所述的技术调试任何着色器程序代码。
[0068]如上所述,数据汇编级610从图形应用程序334接收几何基元列表。API上下文配置为设定PPU400的状态以实现图形处理管线600的至少一部分。一旦API上下文被设置,则另一个API命令可以在PPU200上启动任务。任务可以包括配置为实现例如着色器程序的多个线程。多个线程中的每个线程表示着色器程序700的单个实例。随着顶点从数据汇编级610传送到顶点着色级620,调度器单元520分配顶点给可用线程。
[0069]图7B示出了根据另一个实施例的、用于使用单个GPU306调试着色器程序335的系统750。如图7B所示,系统750包括图形应用程序334、API拦截模块755、驱动程序332、GPU306和显示设备308。图形应用程序334、API拦截模块755和驱动程序332由CPU301执行。为了调试着色器程序335的源代码,源代码可以由编译器编译并存储在GPU306可访问的存储器中。图形应用程序334生成API命令流,其包括加载着色器程序335到PPU400的SM450上并且在SM450上启动数个线程的至少一个命令,每个线程是着色器程序335的实例。API拦截模块755配置为拦截由图形应用程序334所生成的API命令流。API拦截模块755通过管理状态模型来跟踪API上下文的状态,状态模型配置为对响应于API命令流而改变API上下文的状态进行仿真。API拦截模块755转发API命令流到驱动程序332。另外,在一些实施例中,可以转发API命令流到一个或多个中间软件层,诸如实施Drict3D@API的运行时库。驱动程序332随后将API命令转译为发送到GPU306的命令或指令以实施生成图像数据用于在显示设备308上显示的各种操作。
[0070]为了开始调试图形程序的源代码335,IDE333可以传送命令到API拦截模块755。在下一帧开始时,API拦截模块755可以存储API上下文的初始状态。随后,API拦截模块755将由图形应用程序334为一个或多个帧生成的API命令流存储在重放缓冲区中。一旦API命令流已经存储在重放缓冲区中,则API拦截模块755随后开启重放循环直到GPU306遇到断点。另外,断点是由IDE333插入到经编译的着色器程序335中的特殊指令。当断点由GPU306执行时,错误处理程序被执行,其使得API拦截模块755将GPU上下文的当前状态存储到影子状态存储器336。可以理解,存储GPU上下文的当前状态包括将与状态模型相关的信息,包括参数、寄存器值和共享存储器,复制到影子状态存储器336。在一个实施例中,GPU上下文包括与当前活动线程、寄存器值、本地存储器值、在全局存储器中存储的缓冲区等相关的信息。一旦GPU上下文的当前状态保存到影子状态存储器336中,则可以允许GPU306上的线程完成执行。GPU306随后可以自由处理不同的上下文。结果,允许显示设备308生成新的图像数据用于显示,使得不会因为显示设备308停止接收视频信号而使显示设备308定格在前面的帧或关闭。
[0071]返回图7A,API拦截模块755使能使用采用单个GPU306的系统来实现各种调试功能性。例如程序员可以使用IDE333来将断点插入到着色器程序335的源代码中。程序员可以选择源代码的具体的行并且使用由IDE333实现的命令来插入断点。一旦程序员已经指定断点,则程序员可以选择IDE333中的命令以编译和执行着色器程序335的源代码的当前版本。在一个实施例中,可以使用二进制补丁技术将断点插入着色器程序335的已经编译的版本中(即代替着色器程序中的指令以跳转到包括断点的指令集)。可以执行图形应用程序334,其生成传送到诸如驱动程序332的软件层的API命令流。API命令创建API上下文以便渲染视频数据的帧。API命令流使得经修改的着色器程序335由GPU306执行。
[0072]一旦到达第一断点,则在GPU306中执行错误处理程序并且错误处理程序的指令使得API拦截模块755将GPU上下文的状态保存到影子状态存储器336。随后,GPU306允许继续线程的执行直到帧已经被渲染。程序员随后可以使用由IDE333实现的图形用户接口(⑶I)来检验保存在影子状态存储器336中的GPU上下文的状态。一旦程序员已经检验GPU306的状态在第一断点处,则程序员可以重复该过程,在着色器程序335的源代码中设定不同的断点。
[0073]可以使用重放机制实现的另一个调试机制是指令步进。可以理解,步进到下一个指令或者下一个断点不像简单执行下一个挂起指令用于线程或线程组那样容易,这是因为GPU不能停住一段时间同时等待程序员指示程序应该继续执行,而又不定格在显示设备308上显示的图像。因此,可以利用由API拦截模块755使能的重放功能性来重复执行API命令流,允许GPU306继续执行的同时,在程序中的不同点处停住执行、在重放循环的每次迭代期间存储在不同点处的GPU上下文的当前状态以及显示GPU上下文的经存储的状态。
[0074]在一个实施例中,API拦截模块755配置为在重放循环的每次经过期间还原API上下文的初始状态。一旦API上下文的初始状态已经还原,则API拦截模块755可以传送存储在重放缓冲区中的API命令流到软件层,其使得GPU306渲染一个或多个帧。对于在断点之间的指令步进,API拦截模块755可以跟踪已经遇到的断点的列表。每个断点可以与着色器程序335中的特定的行数以及特定的API命令(例如第三绘制调用)相关联。断点还可以与其他状态诸如特定的基元(例如顶点、三角形、片段等)、特定的帧等相关联。随着GPU306执行断点,错误处理程序使得API拦截模块755评估造成错误的特定断点以及确定是否应该允许程序继续或者当前断点是否是应该显示给程序员的按顺序的下一个断点。下一个断点可以表示来自前面指令的单个步骤。
[0075]以这种方式,一个指令接一个指令地或者一个断点接一个断点地步进程序。然而,实际上每次处理重放循环都重新渲染整个帧(或者一些帧),在渲染过程中API拦截模块755仅尝试捕获在不同点处的GPU上下文的状态。实际上,在重放循环的每次经过期间由GPU306执行的真正顺序可以不同。也就是说,虽然API命令流具有不变的顺序,但GPU306的架构可以基于各种调度算法按不同的顺序调度特定线程的执行,如此,与重放循环的前面的迭代相比,在重放循环的不同迭代期间线程的执行顺序可以不是恰好相同的,但是用于感兴趣的特定线程的状态可以被准确还原。然而,通过继续步进指令并且在每一步期间监查GPU上下文的状态,与常规的调试工具类似,程序表现为顺序执行并且程序员可以识别源代码中潜在的漏洞。
[0076]可以理解,在某些架构中,特定的着色器程序335可以实质上以数百或数千个线程并行执行。因此,着色器程序335中的单个断点可以在一个时钟周期期间到达用于特定的线程组(即线程束),而相同断点可以在一个或多个附加时钟周期期间到达用于是相同着色器程序335的实例的不同线程组。例如,片段着色器可以针对图像中的每个像素执行一次或多次,其中1080p HD图像具有超过2百万个像素。GPU306在给定的时钟周期只能处理那些线程的一部分。因此,对于相关线程组,着色器程序335中的单个断点可以到达数次。在一个实施例中,API拦截模块755跟踪重放循环的当前经过已经遇到特定断点的次数。也就是说,API拦截模块755可以保持计算器,其指示在特定的调试会话期间断点已经被命中多少次。随后在重放循环的特定经过期间,API拦截模块755将跟踪特定断点已经触发错误处理程序多少次。如果在重放循环的该特定经过期间断点尚未遇到阈值次数,那么API拦截模块755允许GPU306继续执行。然而,如果在重放循环的该特定经过期间断点已经遇到阈值次数,那么API拦截模块755使得GPU上下文的当前状态存储到影子状态存储器336。该类型的操作提供着色器程序355的执行进展的假象,甚至在只存在包括在着色器程序335中的单个断点时。[0077]也就是说,在由数百或数千线程并行执行的着色器程序中的第一断点处停止,将总是会停止在帧开始附近的特定点处的渲染。通过在重放循环的每次迭代期间自动跳过数个断点以前进到帧的渲染中的不同的点来提供进展的假象。
[0078]图8A、8B和8C示出了根据另一个实施例的、用于采用单个GPU306调试图形程序的方法800的流程图。在步骤802,API拦截模块755监视由图形应用程序334所生成的API命令流。在一个实施例中,API拦截模块755是应用程序填充码,其配置为拦截由图形应用程序334所生成的API命令并且管理表示与图形应用程序334相关联的API上下文的状态模型。在步骤804,API拦截模块755确定是否捕获下一个帧。在一个实施例中,API拦截模块755可以配置为从IDE333接收命令,其使得API拦截模块755捕获用于下个帧的API命令流。在另一个实施例中,API拦截模块755可以配置为当第一断点在着色器程序中设定时自动捕获帧,并且配置为当从着色器程序335移除所有断点时不自动捕获帧。如果API拦截模块755尚未接收到捕获下一个帧的指令,那么API拦截模块755继续监控由图形应用程序334所生成的API命令流。然而,如果API拦截模块755已经接收到捕获下一个帧的指令,那么在步骤806,API拦截模块755捕获API上下文的初始状态。在一个实施例中,API拦截模块755在存储器304中创建在下一个帧开始时的状态模型的复制。
[0079]在步骤808,API拦截模块755将用于当前帧的API命令流存储在重放缓冲区中。重放缓冲区是存储器304中的数据结构,其维护用于至少一个帧的API命令的有序列表。在步骤810,API拦截模块755可以暂停图形应用程序334的执行。可以理解,在如今的现代操作系统中某些进程可以停住。在步骤812,API拦截模块755开启重放循环。重放循环的每个经过将会把API的上下文重新设定为在步骤806所捕获的API上下文的初始状态,并且重新传送存储在重放缓冲区中的API命令流到软件层以一次或多次重新渲染帧。
[0080]在步骤814,API拦截模块755将API上下文的状态重新设定为API上下文的初始状态。在一个实施例中,API拦截模块755可以配置为生成表示保存在存储器304中的API上下文的初始状态的新的API上下文。可以通过发出包括与API上下文的初始状态相关的参数的新的API命令来生成新的API上下文。在另一个实施例中,API拦截模块755配置为生成修改当前API上下文的API命令,以便重新设定API上下文的初始状态。可以理解,API拦截模块755还可以配置为基于API上下文的初始状态来重新设定存储器304中的对象(例如缓冲区、纹理等)的状态。
[0081]在步骤816,API拦截模块755将API命令从存储在重放缓冲区中的API命令流传送到软件层。另外,软件层可以是实现API的驱动程序或运行时库。在步骤818,API拦截模块755确定是否已经到达断点。在一个实施例中,当到达断点时,GPU306执行错误处理程序,其使得消息传送到驱动程序332。驱动程序332可以通知API拦截模块755,断点已经使得GPU306停住图形程序的执行以及API拦截模块755可以实施与断点相关的各种操作。如果尚未到达断点,那么方法800返回步骤816,其中将重放缓冲区中的下一个API命令传送到软件层。然而,如果断点已经到达,那么在步骤820,API拦截模块755确定是否继续执行。在一个实施例中,API拦截模块755确定触发错误处理程序的特定断点是否应该使得API拦截模块755将GPU上下文的当前状态存储到影子状态存储器336。例如,如果之前已经到达断点并且API拦截模块755配置为通过等待直到稍后的线程触发断点来提供进展的假象,那么API拦截模块755允许GPU继续执行并且方法返回到步骤818以等待下一个断点。然而,如果应该停止执行,那么在步骤822,将GPU上下文存储到影子状态存储器336。一旦GPU上下文存储到影子状态存储器336,则在步骤824,可以恢复GPU并且允许其继续执行。
[0082]在步骤826,API拦截模块755传送重放缓冲区中的下一个API命令到软件层。在步骤828,API拦截模块755确定是否已经到达帧结束。API命令流中的特定API命令可以指示已经到达帧结束。如果尚未到达帧结束,那么方法800返回步骤826,并且传送另一个API命令到软件层。然而,如果已经到达帧结束,那么在步骤830,API拦截模块755确定是否采用重放循环的另一经过来继续。API拦截模块755可以等待来自调试工具的命令,其指示程序员想实施另一经过并且监查程序中的不同点处的GPU上下文。如果API拦截模块755确定应该进行重放循环的另一经过,那么方法800返回到步骤814,其中还原API上下文的初始状态。然而,如果API拦截模块755确定应该终止重放循环,那么在步骤832,API拦截模块755清理重放循环。在一个实施例中,API拦截模块755可以释放用于影子状态存储器336的存储器、API的初始状态等。在步骤832之后,方法800终止。
[0083]图9示出了前面各种实施例的各种架构和/或功能性可以在其中实现的示例性系统900。如图所示,提供系统900,其包括连接到通信总线902的至少一个中央处理器901。可以使用任何适合的协议实现通信总线902,诸如PCI (外围部件互连)、PC1-Express, AGP(加速图形端口)、超传输或者任何其他总线或点到点通信协议。系统900还包括主存储器904。控制逻辑(软件)和数据存储在主存储器904中,其采取随机存取存储器(RAM)的形式。
[0084]系统900还包括输入设备912、图形处理器906和显示器908,即常规的CRT(阴极射线管)、IXD (液晶显示)、LED (发光二极管)、等离子显示器等。可以从输入设备912接收用户输入,例如键盘、鼠标、触摸板、麦克风等。在一个实施例中,图形处理器906可以包括多个着色器模块、光栅化模块等。前述模块的每个甚至可以布置在单个半导体平台以形成图形处理单元(GPU)。
[0085]在本说明中,单个半导体平台可以指唯一的单一基于半导体的集成电路或芯片。应该注意,术语单个半导体平台还可以指具有增强的连通性的多芯片模块,其仿真片上操作并且通过利用常规中央处理单元(CPU)和总线实现方案取得实质性改善。各种模块还可以根据用户的期望单独摆放或者摆放在半导体平台的各种组合中。
[0086]系统900还可以包括二级存储910。二级存储910包括例如硬盘驱动器和/或可移动存储驱动器,其表示软盘驱动器、磁带驱动器、光盘驱动器、数字通用光盘(DVD)驱动器、记录设备、通用串行总线(USB)闪存。可移动存储驱动器以已知的方式从可移动存储单元读取和/或写入可移动存储单元。
[0087]计算机程序或者计算机控制逻辑算法可以存储在主存储器904和/或二级存储910中。这样的计算机程序当被执行时使得系统900能够实施各自功能。存储器904、存储910和/或任何其他存储是计算机可读介质的可能的示例。
[0088]在一个实施例中,前面各种图的架构和/或功能性可以以下内容的环境中实现:中央处理器901、图形处理器906、能够具有中央处理器901和图形处理器906 二者的至少部分能力的集成电路(未示出)、芯片集(即设计为作为用于实施相关功能的单元而工作和销售的集成电路等)和/或任何其他用于此的集成电路。
[0089]另外,前面各种图的架构和/或功能性可以在以下内容的环境中实现:通用计算机系统、电路板系统、专用于娱乐目的的游戏控制台系统、特定于应用程序的系统和/或任何其他期望的系统。例如,系统900可以采取台式计算机、笔记本电脑、服务器、工作站、游戏控制台、嵌入式系统和/或其他任何类型的逻辑的形式。另外系统900可以采取各种其他设备形式,包括但不限于个人数字助理设备(PDA)、移动电话设备、电视等。
[0090]此外,虽然没有示出,系统900为通信的目的可以耦连到网络(例如电信网络、局域网(LAN)、无线网络、诸如互联网的广域网(WAN)、对等网络、有线网络等)。
[0091]虽然以上已经描述了各实施例,但是应该理解它们通过仅示例而非限制的方式加以呈现。因此,优选实施例的宽度和范围不应该被上述示例性实施例中的任何一个所限制,而应该仅根据下面的权利要求及其等同物所定义。
【权利要求】
1.一种方法,包括: 将应用程序编程接口(API)上下文的初始状态存储在存储器中,其中所述API上下文的所述初始状态与帧的开始相对应; 拦截与所述帧相关联的API命令流,其中所述API命令流由图形应用程序生成; 将所述API命令流传送到实现所述API的软件层以渲染所述帧;以及 响应于断点,将图形处理单元(GPU)上下文存储在所述存储器中。
2.根据权利要求1所述的方法,进一步包括执行重放循环,包括: 生成一个或多个API命令以将所述API上下文还原到所述初始状态; 重新传送所述API命令流到所述软件层以重新渲染所述帧;以及 响应于另一个断点,将另一个GPU上下文存储在所述存储器中。
3.根据权利要求2所述的方法,其中所述重放循环响应于从集成开发环境(IDE)所接收的命令而重复。
4.根据权利要求1所述的方法,其中所述软件层是驱动程序。
5.根据权利要求4所述的方法,其中所述驱动程序实现OpenGL0API。
6.根据权利要求1所述的方法,其中所述软件层是运行时库。
7.根据权利要求6所述的方法,其中所述运行时库实现DireCt3D@API。
8.根据权利要求1所述的方法,进一步包括跟踪所述API上下文的状态。
9.根据权利要求8所述的方法,其中跟踪所述API上下文的状态包括: 开启与所述图形应用程序相关联的状态模型;以及 针对由所述图形应用程序所生成的每个API命令,基于所述API命令更新所述状态模型。
10.根据权利要求1所述的方法,其中所述API命令流由应用程序填充码拦截。
11.根据权利要求1所述的方法,进一步包括: 响应于断点,确定是否基于所述断点继续执行;以及 如果应该继续执行,那么传送API命令到所述软件层以恢复执行,或者 如果不应该继续执行,那么将所述GPU上下文存储在所述存储器中。
12.根据权利要求11所述的方法,其中确定是否基于所述断点继续执行包括,将与所述断点相关联的计数器和与所述重放循环的迭代数目相关联的阈值相比较。
13.根据权利要求1所述的方法,其中所述API上下文的所述初始状态表示在所述帧开头的与所述API上下文相关联的图形处理单元的状态。
14.一种存储指令的非短暂性计算机可读存储介质,当所述指令由处理器执行时,使得所述处理器实施以下步骤: 将应用程序编程接口(API)上下文的初始状态存储在存储器中,其中所述API上下文的所述初始状态与帧的开始相对应; 拦截与所述帧相关联的API命令流,其中所述API命令流由图形应用程序生成; 将所述API命令流传送到实现所述API的软件层以渲染所述帧;以及 响应于断点,将图形处理单元(GPU)上下文存储在所述存储器中。
15.根据权利要求14所述的非短暂性计算机可读存储介质,其中所述软件层是驱动程序。
16.根据权利要求14所述的非短暂性计算机可读存储介质,其中所述步骤进一步包括通过以下步骤跟踪所述API上下文的状态: 开启与所述图形应用程序相关联的状态模型;以及 针对由所述图形应用程序所生成的每个API命令,基于所述API命令更新所述状态模型。
17.—种系统,包括: 图形处理单元(GPU); 存储器,配置为存储应用程序填充码,所述应用程序填充码配置为: 将应用程序编程接口(API)上下文的初始状态存储在存储器中,其中所述API上下文的所述初始状态与帧的开始相对应; 拦截与所述帧相关联的API命令流,其中所述API命令流由图形应用程序生成; 将所述API命令流传送到实现所述API的软件层以渲染所述帧;以及 响应于断点,将GPU上下文存储在所述存储器中。
18.根据权利 要求17所述的系统,其中所述图形应用程序与配置为由所述GPU执行的一个或多个着色器程序相关联。
19.根据权利要求17所述的系统,其中所述软件层包括实现OpenGLAPI的驱动程序。
20.根据权利要求17所述的系统,所述应用程序填充码进一步配置为通过以下步骤跟踪所述API上下文的状态: 开启与所述图形应用程序相关联的状态模型;以及 针对由所述图形应用程序所生成的每个API命令,基于所述API命令更新所述状态模型。
【文档编号】G06F9/46GK103838669SQ201310611924
【公开日】2014年6月4日 申请日期:2013年11月26日 优先权日:2012年11月26日
【发明者】杰弗里·T·希尔, 托马斯·H·克莱因 申请人:辉达公司