顶点和片段程序的优化链接的制作方法

文档序号:6656363阅读:157来源:国知局
专利名称:顶点和片段程序的优化链接的制作方法
技术领域
本发明涉及计算机图形学领域。
背景技术
许多计算机图形图像是通过从给定视点用三维场景对光的相互作用进行数学建模来创建的。此过程(称为渲染)从给定视点来看产生场景的二维图像,且类似于拍摄真实世界场景的照片。
随着对于计算机图形且尤其是对于实时计算机图形的需求增加,具有适于加速渲染过程的图形处理子系统的计算机系统已变得普及。在这些计算机系统中,渲染过程在计算机的通用中央处理单元(CPU)与图形处理子系统之间被划分。通常CPU执行高级运算,例如确定给定场景中物体的位置、运动和碰撞。通过这些高级运算,CPU产生界定期望的经渲染图像(一个或多个)的一组渲染命令和数据。举例来说,渲染命令和数据可为场景界定场景几何形状、照明、着色、纹理化、运动和/或摄影参数。图形处理子系统通过所述组渲染命令和数据创建一个或一个以上经渲染图像。
许多图形处理子系统为高度可编程的,从而能够实施(尤其是)复杂的照明和着色算法。为了开发此可编程性,应用程序可包括一个或一个以上图形处理子系统程序,其由图形处理子系统执行且与由CPU执行的主程序并行执行。尽管不限于仅实施着色和照明算法,但这些图形处理子系统程序通常被称为着色程序或着色器。
图形处理子系统通常使用流处理模型,其中通过流处理单元的链来连续读取和操作输入元素。一个流处理单元的输出是对链中下一流处理单元的输入。通常,数据仅穿过流处理单元的链单向地向“下游”流动。流处理单元的实例包括处理二维或三维顶点的顶点处理器、将由若干组二维或三维顶点界定的几何图元处理成若干组像素或子像素(称为片段)的光栅化器处理器,和处理片段的片段处理器。链中可包括附加类型的流处理单元。举例来说,镶嵌处理器(tessellation processor)可接收高阶表面的描述并产生若干组由顶点界定并近似于或对应于所述高阶表面的几何图元。
链中流处理单元中的一些或全部可为可编程的,其中每一可编程流处理单元具有其自己的单独的着色程序,所述着色程序与在其它流处理单元上执行的着色程序并行地操作。复杂算法的实施方案通常取决于为每一流处理单元定制的单独着色程序,所述单独着色程序一起工作以实现期望的结果。在这些实施方案中,链中初始流处理单元的着色程序的输出可与链中后续流处理单元的着色程序的输入相连系。可用多种低级和高级编程语言编写着色程序,所述编程语言包括低级汇编语言、Cg语言、OpenGL着色语言(OpenGL Shading Language),和DirectX高级着色语言。
需要优化着色程序以改进渲染性能并允许应用程序完全开发图形处理子系统的能力。当用于不同流处理单元的着色程序链接在一起(在某些图形API术语中可称为连系)时,可能存在基于两个或两个以上着色程序的组合进行优化(称为着色器间的优化)的机会。
举例来说,第一着色程序可输出一值,所述值未被图形处理流中的第二链接着色程序用作输入。在此实例中,第一着色程序的用于计算未使用的输出的部分可被安全地省略,藉此减少第一着色程序的执行时间。在另一实例中,如果第一着色程序的输出为常数,那么可将所述常数的值传播到一链接到第一着色程序的第二着色程序的输入,从而减少第一着色程序的执行时间并潜在地允许第二着色程序内的附加优化。
另外,应用程序开发人员期望针对每一流处理单元编写较大的通用着色程序。每一通用着色程序允许应用程序从在需要时将由流处理单元执行的集合中选择一个或一个以上运算。应用程序可通过从每一流处理单元的着色程序中选择适当运算来在若干流处理单元上实施特定算法。使用具有针对每一流处理单元的可选择运算的较大通用着色程序,而不是使用每一者均实施单个操作的许多不同的较小着色程序,大大简化了应用程序开发。不幸的是,即使当将要仅执行着色程序的一小部分时,执行较大通用着色程序也会由于许多因素而较缓慢,所述因素包括将较大着色程序转移到图形处理子系统所需的时间和带宽。优化着色程序的链接也可将这种较大程序简化到其适配在未经优化时原始程序可能不满足的硬件资源限制内的程度。
现有的自动优化技术仅孤立地考虑每一着色程序。针对硬件着色编译器的现有优化技术不会分析被分配到不同流处理单元的链接的着色程序之间的关系以确定着色器间的优化。另外,这些现有优化不考虑流处理单元的链中的单向数据流,且因此错过许多其它的潜在优化。
因此需要基于链接的着色程序之间的关系来优化链接在一起的两个或两个以上着色程序。进一步需要优化较大通用着色程序,以使其有效地执行且不会不必要地将大量数据转移到图形处理子系统。还进一步需要能够在运行时间执行着色器间的优化,从而允许应用程序动态地选择着色程序的组合而不会降低性能。

发明内容
本发明的一实施例是一种用于基于在流处理程序之间交换的数据来优化两个或两个以上流处理程序的系统。所述系统交替地处理每一流处理程序以识别并去除失效程序代码,藉此改进执行性能。通过传播作为来自其它流处理程序的输入而接收到的常数且通过分析第一流处理程序并确定第二流处理程序的未被所述第一流处理程序使用的输出来识别失效程序代码。所述系统可执行此优化的多次重复,因为先前的重复引入了用作对流处理程序的输入的附加常数。在流处理程序的优化之后,将经优化的流处理程序编译为适于由流处理系统执行的格式。
本发明的一实施例是一种优化适于由流处理系统执行的流处理程序的方法。所述流处理系统包括第一和第二可编程流处理单元。所述第二流处理单元与所述第一流处理单元连接,使得第一流处理单元的输出适于作为第二流处理单元的输入。
所述方法包括接收适于由第一流处理单元执行的第一流处理程序。所述第一流处理程序包括输出参数。所述方法还接收适于由第二流处理单元执行的第二流处理程序。所述第二流处理程序包括对应于第一流处理程序的输出参数的输入参数。基于第二流处理程序的输入参数与第一流处理程序的输出参数之间的对应来优化第一和第二流处理程序。
在一实施例中,优化第一和第二流处理程序包括从第一流处理程序中消除适于计算未被第二流处理程序使用的附加输出参数的失效程序代码。在另一实施例中,优化第一和第二流处理程序包括响应于第一流处理程序的输出参数是常数的确定来传播用于第二流处理程序的输入参数的常数值,和从第二流处理程序中消除由于传播常数值而被致使为冗余的失效程序代码。
在又一实施例中,优化第一和第二流处理程序包括响应于第一流处理程序的输出参数是统一值的确定来传播用于第二流处理程序的输入参数的统一值,和从第二流处理程序中消除由于传播统一值而被致使为冗余的失效程序代码。统一值是着色语言中的专门术语,其指的是虽然在处理图形图元流期间不允许变化但可在批量的所述串流数据之间改变值的常数。在很大程度上,可将统一值视为如同用于优化目的的常数值,例如常数合并(在编译时将具有常数项的表达式缩减为较简单的常数表达式)。然而,如果编译器基于知道统一值的值来作出优化决定(例如决定批量的结果),那么在新的统一值将改变较早的优化决定时有必要进行再优化。
流处理系统的一实施例驻存在图形处理子系统内。在此实施例中,可编程流处理单元可为可编程顶点处理器、可编程镶嵌处理器,或可编程片段处理器。


将参看附图描述本发明,附图中图1是适于实践本发明实施例的计算机系统的方框图;图2说明适于实施本发明实施例的图形处理子系统的流处理单元的示范性链;图3说明根据本发明实施例优化一对链接的着色程序的方法;图4A和4B说明一对示范性链接的着色程序的未经优化的形式;图5A和5B说明根据本发明实施例在优化方法的第一次重复之后的一对示范性链接的着色程序;图6A和6B说明根据本发明实施例在优化方法的第二次重复之后的一对示范性链接的着色程序;和图7说明适于实施本发明实施例的着色语言结构。
附图中,使用相似参考标号表示相同组件。
具体实施例方式
图1是适于实践本发明实施例的计算机系统100的方框图,计算机系统100例如可为个人计算机、视频游戏控制台、个人数字助理或其它数字装置。计算机系统100包括中央处理单元(CPU)105,其用于运行软件应用程序并视需要而运行-操作系统。在一实施例中,CPU 105实际上是并行操作的若干单独的中央处理单元。存储器110存储应用程序和数据供CPU 105使用。存储装置115为应用程序和数据提供非易失性存储,且可包括固定磁盘驱动器、活动磁盘驱动器、快闪存储器装置和CD-ROM、DVD-ROM,或其它光学存储装置。用户输入装置120将来自一个或一个以上用户的用户输入传送到计算机系统100,且可包括键盘、鼠标、操纵杆、触摸屏和/或麦克风。网络接口125允许计算机系统100经由电子通信网络与其它计算机系统通信,且可包括在局域网和广域网(例如因特网)上的有线或无线通信。计算机系统100的组件(包括CPU 105、存储器110、数据存储装置115、用户输入装置120和网络接口125)经由一个或一个以上数据总线160而连接。数据总线的实例包括ISA、PCI、AGP、PCI、PCI-X(也称为3GIO)和超传输(HyperTransport)数据总线。
图形子系统130进一步与数据总线160和计算机系统100的组件连接。图形子系统130包括图形处理单元(GPU)135和图形存储器。图形存储器包括显示存储器140(例如,帧缓冲器),其用于存储一输出图像的每一像素的像素数据。可直接从CPU 105将像素数据提供到显示存储器140。或者,CPU 105向GPU 135提供界定期望的输出图像的数据和/或命令,GPU 135从这些数据和/或命令中产生一个或一个以上输出图像的像素数据。界定期望的输出图像的数据和/或命令存储在附加存储器145中。在一实施例中,GPU135从界定一场景的几何形状、照明、着色、纹理化、运动和/或摄影参数的渲染命令和数据来产生用于输出图像的像素数据。
在另一实施例中,显示存储器140和/或附加存储器145是存储器110的一部分,且与CPU 105共享。或者,显示存储器140和/或附加存储器145是一个或一个以上为专用于图形子系统130而提供的单独的存储器。图形子系统130周期性地输出用于一图像的像素数据,所述图像来自显示存储器140且显示在显示装置150上。显示装置150是能够响应于来自计算机系统100的信号而显示视觉信息的任何装置,包括CRT、LCD、等离子和OLED显示器。计算机系统100可向显示装置150提供模拟或数字信号。
在又一实施例中,图形处理子系统130包括一个或一个以上类似于GPU 135的附加GPU 155。在另外又一实施例中,图形处理子系统130包括图形协处理器165。图形处理协处理器165和附加GPU 155适于与GPU 135并行地操作。类似于GPU 135,附加GPU155从渲染命令来产生用于输出图像的像素数据。附加GPU 155可联合GPU 135而操作,以同时产生用于一输出图像的不同部分的像素数据,或同时产生用于不同输出图像的像素数据。在一实施例中,图形协处理器165执行针对GPU 135和/或附加GPU 155的有关渲染的任务,例如几何形状变换、着色器计算和背面剔除(backface culling)操作。
附加GPU 155可与GPU 135位于同一电路板上并与GPU 135共享与数据总线160的连接,或者可位于单独地与数据总线160连接的附加电路板上。附加GPU 155也可与GPU 135集成在同一模块或芯片封装中。附加GPU 155可具有其自己的显示存储器和附加存储器(类似于显示存储器140和附加存储器145),或可与GPU 135共享存储器140和145。在一实施例中,图形协处理器165与计算机系统芯片组(未图示)集成,例如与用于控制数据总线160的北桥(Northbridge)或南桥(Southbridge)芯片集成。
图2说明适于实施本发明实施例的图形处理子系统的流处理单元的示范性链200。流处理单元的链200使用流处理模型,其中由流处理单元的链200连续读取并操作输入元素。链200的每个流处理单元均可对链中的前一个流处理单元的输出进行操作。如下文详细论述,所述流处理单元中的某些或全部可为可编程的。可编程流处理单元读取一输入元素,使用所述输入元素执行程序,并将结果输出到链中的下一个流处理单元。每一流处理单元可具有其自己的独立地操作或与另一流处理单元程序结合操作的单独程序。
输入流205包括用于界定期望的经渲染图像(一个或多个)的渲染命令和数据,包括针对一场景的几何形状、照明、着色、纹理化、运动和/或摄影参数。顶点处理器210从输入流205读取每一渲染命令和任何相关联的数据。渲染数据可包括一个或一个以上未变换的顶点。顶点处理器210对每一未变换的顶点执行顶点程序(也被称为顶点着色器)以产生变换的顶点。顶点处理器210是可编程的,且渲染应用程序可规定待用于任何给定组的顶点的顶点程序。在一简单的实施例中,顶点程序将顶点从三维世界坐标系统变换到二维屏幕坐标系统。可使用更复杂的顶点程序来实施多种视觉效应,包括照明和着色、程序的几何图形和动画操作。
变换的顶点从顶点处理器210传到光栅化级(rasterization stage)215。光栅化级215将一个或一个以上顶点聚集成一几何图元,例如点、线、三角形或四边形。接着光栅化级215将每一几何图元转换成一个或一个以上像素片断。像素片断提供状态以更新一组将可能显示在经渲染图像中的一个或一个以上像素,所述像素由所述像素片断“覆盖”。每一像素片断均具有相关联的输入参数,例如屏幕位置、纹理坐标、颜色值和法向量。
接着像素片断从光栅化级215传到片断处理器220。片断处理器220使用与每一像素片断相关联的信息来确定将可能显示的每一像素的输出颜色值。类似于顶点处理器210,片断处理器是可编程的。对每一像素片断执行像素片断程序(也被称为像素着色器)来确定用于像素的输出颜色值。尽管像素片断独立于顶点程序而操作,但像素片断程序可依赖于由前一个流处理单元产生或通过前一个流处理单元的信息,包括由顶点程序产生的信息。渲染应用程序可规定待用于任何给定组的像素片断的像素片断程序。可使用像素片断程序来实施多种视觉效应,包括照明和着色效应、反射、纹理映射和程序纹理产生。另外,可采用顶点程序与像素片断程序用于例如通用计算、图像处理和信号处理的非视觉目的。
接着将所述组像素输出到光栅操作与存储级225。光栅操作级225将所述组像素与经渲染图像集成。像素可为具有先前写入到经渲染图像的像素的经混合或遮罩的像素。可使用深度缓冲器、alpha缓冲器和模板缓冲器来确定每一传入的像素对经渲染图像的作用(如果存在)。接着将每一传入的像素与任何先前存储的像素值的组合输出到帧缓冲器作为经渲染图像的一部分。
尽管在图2的实例中未图示,但在流处理单元的链200中可包括附加类型的流处理单元。举例来说,镶嵌处理器(tessellation processor)可接收高阶表面的描述并产生若干组几何图元,所述几何图元由顶点界定且接近或对应于所述高阶表面。接着可在下游由流处理单元处理所述若干组几何图元及其相关顶点,所述流处理单元例如为如上文讨论的顶点处理器、光栅化器和片断处理器。
图3说明根据本发明实施例的用于优化一对链接的着色程序的方法300。在步骤303处,对两个链接的着色程序的优化开始。在一实施例中,应用程序将两个着色程序传送到运行时间模块,所述运行时间模块将每一着色程序编译成中间数据格式以便进行优化。在又一实施例中,可用不同的编程语言来表达每一着色程序,且运行时间模块可采用适于每一着色程序语言的编译器来产生呈所需中间数据格式的一个版本的着色程序。在一替代实施例中,运行时间模块的全部或一部分与装置驱动程序集成。
对于方法300,应用程序可显式地规定两个着色程序是(例如)通过经由API调用与运行时间模块通信而链接的或“连系的”。或者,运行时间模块可隐式地确定两个着色程序是否是连系的。举例来说,运行时间模块可对将由图形处理子系统的各个流处理单元执行的着色程序进行分析,以确定第一着色程序的任何输出是否用作对第二着色程序的输入。
将方法300划分为两个阶段,下游阶段305和上游阶段320。如下文详细讨论,方法300重复下游阶段305到上游阶段320,直到完全找到两个着色程序中全部的着色器间的优化。下游阶段305优化将在流处理单元的链中另一链接的着色程序的“下游”执行的着色程序。相反,方法300的上游阶段320优化将在流处理单元的链中“下游”着色程序的“上游”执行的着色程序。举例来说,在图2说明的流处理单元的示范性链200中,由片断处理器220执行的片断着色程序将被视为处在由顶点处理器210执行的顶点程序的“下游”。在此实例中,如果顶点着色程序与片断着色程序是链接的,那么方法300的下游阶段305将优化片断着色程序,且方法300的上游阶段320将优化顶点着色程序。
方法300的下游阶段305以步骤307开始,其中下游着色程序的入口函数。下游着色程序的入口函数是流处理单元开始执行下游着色程序的地方。入口函数的输入和输出参数也被识别。
在步骤309处,方法300基于下游着色程序输出来确定有用代码。在一实施例中,步骤309使用数据流分析以从下游着色程序的输出向后到下游着色程序的入口函数来跟踪程序执行。将确定下游着色程序输出所涉及的下游着色程序的部分指定为有用代码。为了确保优化不影响下游着色程序的输出,数据流分析在指定有用代码方面必须是保守的。如果两个或两个以上交替的执行分支可用于确定下游着色程序输出,那么必须将所有这些执行分支指定为有用代码。数据流依赖性分析也必须正确地说明循环结构和程序调用。
在步骤311处,执行常数传播(constant propagation)。常数传播识别任何作为常数的程序参数,并将这些程序参数的值传播通过下游着色程序,以预先计算附加程序参数值或预先选择执行分支(如果可能)。举例来说,如果从一个或一个以上程序参数计算下游着色程序,且步骤311确定这些程序参数中的一个或一个以上程序参数具有常数值,那么可预先计算下游着色程序输出的中间值或最终值(有时被称为导出常数或统一值)。在另一实例中,如果使用一个或一个以上程序参数来选择下游着色程序的执行分支,且步骤311确定这些程序参数中的一个或一个以上程序参数具有已知的常数值,那么可预先选择适当的执行分支以供执行。
方法300的步骤313识别并消除失效代码。失效代码是下游着色程序的在确定下游着色程序输出时未涉及的部分,即下游着色程序的在步骤309中未被指定为有用代码的部分。失效代码还包括下游着色程序的由步骤311的常数传播使其变为冗余的部分。这包括(例如)下游着色程序的用于计算已用步骤311中预先计算的常数替换的程序参数的部分。另外,失效代码可包括(例如)下游着色程序的在步骤311中未被预先选择用于执行的交替的执行分支。接着步骤313从下游着色程序中去除失效代码,藉此改进性能并减小下游着色程序的大小。
步骤315从下游着色程序的剩余部分中确定下游着色程序的影响下游着色程序输出的输入。如下文讨论,稍后在步骤325中使用这组下游程序输入。
步骤333、335和337在逻辑上是独立的,因此可以任意次序执行或并行地执行。
在步骤315结束时和下游阶段305重复时,上游阶段320的重复以步骤323开始以优化上游着色程序。步骤323确定上游着色程序的入口函数。上游着色程序的入口函数是流处理单元开始执行上游着色程序的地方。入口函数的输入和输出参数也被识别。
方法300的步骤325基于上游着色程序输出子集来确定有用代码。上游着色程序输出子集是对应于在步骤315中识别的下游程序输入集合的上游着色程序输出的全部或一部分。在一实施例中,步骤325使用数据流分析以从上游着色程序输出子集向后到上游着色程序的入口函数来跟踪程序执行。将在确定上游着色程序输出子集时所涉及的上游着色程序的部分指定为有用代码。在计算上游着色程序输出子集时未使用的上游着色程序的部分(包括在计算并非所述上游着色程序输出子集的一部分的其它上游着色程序输出时使用的上游着色程序的部分)不被指定为有用代码。为了确保优化不影响上游着色程序的输出,数据流分析在指定有用代码方面必须是保守的。如果两个或两个以上交替的执行分支可用于确定上游着色程序输出子集,那么必须将所有这些执行分支指定为有用代码。数据流依赖性分析也必须正确地说明循环结构和程序调用。
在步骤327,执行常数传播。常数传播识别任何作为常数的程序参数,并将这些程序参数的值传播通过上游着色程序,以预先计算附加程序参数值或预先选择执行分支(如果可能)。作为一实例,如果从一个或一个以上由步骤327确定为具有常数值的程序参数计算上游着色程序输出,那么步骤327的常数传播可预先计算上游着色程序输出的中间值或最终值。作为另一实例,如果步骤327确定一个或一个以上用于选择适当的执行分支的程序参数是常数,那么,那么步骤327可预先选择若干交替的程序分支中的一者以供执行。
方法300的步骤329识别并消除上游程序中的失效代码。类似于上文所讨论,失效代码是上游着色程序的在确定上游着色程序输出子集时未涉及的部分。这包括上游着色程序的在步骤325中未被指定为有用代码的部分。失效代码还包括上游着色程序的由步骤327的常数传播使其变为冗余的部分,例如上游着色程序的用于计算已用预先计算的常数替换的程序参数的部分,和上游着色程序的未被预先选择用于执行的交替的执行分支。步骤329从上游着色程序中去除失效代码,藉此改进执行性能并减小上游着色程序的大小。
步骤331确定是否需要进一步重复下游阶段305和上游阶段320以优化上游和下游着色程序。步骤331确定上游着色程序输出的子集中的任一者是否为先前没有被步骤311分析为下游着色程序的具有常数值的输入的常数。如果上游着色程序输出的子集中的任一者是先前未被步骤311分析的常数,那么方法300继续进行步骤317。
步骤317将步骤331中识别的上游程序输出的子集中的具有常数值的输出与相应的下游着色程序输入进行匹配。接着将这些下游着色程序输入指定为具有常数值的下游着色程序输入。方法300的下游阶段305接着重复,以步骤311开始。在步骤311的第二次以及随后的重复中,用步骤317中指定的具有常数值的下游着色程序输入来执行常数传播。步骤311将可能导致下游着色程序的附加部分变为冗余,例如用于计算具有常数值的下游程序输出或中间值和用于未使用的执行分支的代码。接着步骤315消除下游着色程序的这些附加冗余部分,藉此进一步改进执行性能并减小下游着色程序的程序大小。
从下游着色程序中消除失效代码可能减少下游着色程序输出的数目,这进而减少了所使用的下游着色程序输入的数目。下游着色程序输入的数目减少可使得某些相应的上游着色程序输出变得不必要,且因此使得上游着色程序本身的又一些部分变得不必要,因此允许进一步优化上游着色程序。
为此,在步骤311和313的附加重复之后,步骤315从下游着色程序的剩余部分中确定下游着色程序的影响下游着色程序输出的输入。在步骤315之后,执行方法300的上游阶段320的附加重复,其中在步骤315中识别的下游程序输入的子集用作步骤325中上游程序输出的子集。执行方法300的上游阶段320的附加重复以进一步优化上游着色程序。使用在步骤315的最近重复中识别的下游程序输入的子集来重复步骤323、325、327和328。这可能导致上游着色程序的附加冗余代码的识别和消除。因此,进一步改进了上游着色程序的执行性能,同时进一步减小了上游着色程序的大小。
如上文讨论,步骤331确定是否需要进一步重复下游阶段305和上游阶段320以优化上游和下游着色程序。如果上游着色程序输出的子集中的任一者是先前未被步骤311分析的常数,那么方法300继续进行步骤317和下游阶段305与上游阶段320的附加重复。否则,方法300进行到步骤333。
步骤333将经优化的下游着色程序从其中间数据格式转换成能够由流处理单元执行的可执行格式。在一实施例中,所述可执行格式是为流处理单元的特定硬件结构定制的汇编语言或机器语言代码的形式。步骤333也可执行对下游着色程序的附加优化,例如循环展开(loop unrolling)。与上文讨论的优化不同,这些附加优化是基于流处理单元的硬件结构,而不是下游着色程序与上游着色程序之间的关系。
类似地,步骤335将经优化的上游着色程序从其中间数据格式转换成能够由流处理单元执行的可执行格式。在一实施例中,所述可执行格式是为流处理单元的特定硬件结构定制的汇编语言或机器语言代码的形式。步骤335也可执行对下游着色程序的附加优化,例如循环展开。与上文讨论的优化不同,这些附加优化是基于流处理单元的硬件结构,而不是下游着色程序与上游着色程序之间的关系。
步骤337确定影响经优化的上游着色程序的输出的上游着色程序输入。如果在确定经优化的上游着色程序的输出时存在未使用的上游着色程序输入,那么步骤337消除用于从存储器中获取这些输入的代码。这种进一步的优化防止浪费存储器带宽来获取未使用的输入值。接着步骤339将经优化的上游和下游着色程序传送到其各自的流处理单元以供执行。
在又一实施例中,可扩展方法300以按顺序优化任意数目的链接的着色程序。这个实施例从待优化的链接的着色程序集合中选择一对两个链接的着色程序。对于所述对选定的链接的着色程序,这个实施例执行上文讨论的步骤303到331,可能导致一对简化的程序。这个实施例接着从待优化的链接的着色程序集合中选择另一对链接的着色程序,并针对新选择的所述对链接的着色程序再次重复步骤303到331。针对若干对链接的着色程序的所有可能组合进一步重复步骤303到331,直到不可能进行进一步优化为止。此时,可针对所有着色程序按顺序执行步骤333、335和337中的硬件代码产生和输入消除。应注意,这个实施例中的所述若干对链接的着色程序不一定是互斥的。举例来说,可用两个或两个以上下游着色程序链接成单个上游着色程序,或者第一对链接的着色程序中的下游着色程序可为第二对链接的着色程序中的上游着色程序。
在又一实施例中,方法300可优化链接的着色程序以获得统一值。统一值是着色语言中的专门术语,其指的是在处理给定数据流期间保持为常数但在所述串流数据的批量之间可能改变值的值。可用与上文讨论的针对常数值的优化类似的方式执行优化统一值。举例来说,除了常数值之外,还可如所描述对统一值执行步骤311、317、327和331。然而,如果由于统一值传播而识别和消除了失效代码,那么当统一值的改变导致链接的着色程序的不同部分变为失效代码时,必须再优化链接的着色程序。
方法300的操作在图4到6中说明,其展示方法300对示范性上游和下游着色程序的效果。表1和2分别说明用OpenGL着色语言编写的但也可用另一语言编写的链接的片段着色程序与顶点着色程序的未经优化的源代码。表1的片段着色程序界定许多程序变量,包括五个统一标量变量、四个变化的标量变量和一个变化的向量变量。类似地,表2的顶点着色程序界定三个统一标量变量和三个变化的标量变量。在此实例中,片段着色程序与顶点着色程序两者均包括变化的变量“varying1”、“varying2”和“varying3”。当这两个着色程序链接在一起时,当执行下游片段着色程序时在上游顶点着色程序中确定的这些共同变量的值被转入。表1和2中统一变量之后的注释指示在优化期间假定的这些统一值的值。


表1-示范性片段着色程序

表2-示范性顶点着色程序图4A、4B、5A、5B、6A和6B使用数据流格式来说明一对示范性链接的着色程序的优化。所述数据流格式展示着色程序输出与用于计算这些输出的输入变量和运算之间的关联。图4A和4B说明表1和2的一对示范性链接的着色程序的未经优化的形式。
图4A说明表1的示范性片段着色程序的一部分的数据流图400。数据流图400展示用统一变量407、409、411、413、431和433与变化的变量415、417、419、420和421的组合来形成输出变量405。数据流图400还包括基于统一变量与变化的变量两者的条件分支语句425和427,以及完全从统一变量导出的表达式,例如表达式430、432和434。
类似于图4A,图4B说明表2的示范性顶点着色程序的数据流图450。数据流图450展示示范性顶点着色程序的输出变量455、457、459、461、463和465及其与输入变量的关系。如上文讨论,当表1和2的示范性着色程序链接在一起时,输出变量“varying1”455、“varying2”457和“varying3”459和“varying4”461对应于在图4A中为了清楚起见而省略的片段着色程序输入变量“varying1”415、“varying2”417和“varying3”419和“varying4”420。应注意在此实例中,顶点着色程序的某些输出变量没有被链接的片段着色程序使用,例如“varying5”463;然而这些输出变量可能会被与示范性顶点着色程序链接的其它下游着色程序使用。另外,数据流图450展示输入属性470、472和474。与其它变量不同,属性是与由着色程序处理的每一数据项(例如,顶点)相关联的参数。
在通过步骤305到步骤331的第一重复来处理示范性链接的着色程序之后,示范性着色程序的复杂性大体上减小。表3和4说明在步骤307到331的第一重复之后所述对示范性链接的着色程序的源代码。图5A和5B说明呈数据流格式的这些示范性链接的着色程序。


表3-第一次优化重复之后的示范性片段着色程序

表4-第一次优化重复之后的示范性顶点着色程序图5A说明数据流图500,其对应于表3的经优化的片段着色程序。比较数据流图400与500,可以看到在步骤307到331的第一重复之后,由于条件分支425语句对统一变量407的值的依赖性,因此已将条件分支425语句消除,对于一批量数据来说,所述统一变量407是常数。另外,可用等于432的导出的统一变量505来替换统一变量411和413。在此实例中,用等于表达式434的值的导出的统一值507替换包括统一变量409的表达式434。导出的统一值505和507的使用使图形处理子系统不会对表达式432和434的值进行重复冗余计算。如果对于另一批量数据来说统一变量407、409、411或413改变了值,那么必须再优化此示范性着色程序。
图5B说明数据流图550,其对应于表4的经优化的顶点着色程序。比较数据流图450与550,可以看到在步骤307到331的第一重复之后,输出461被消除,因为示范性链接的片段着色程序不使用此输出。因此,可废除用于计算输出461的所有运算。而且,因为属性472仅用于计算输出461,所以也废除属性472;因此在程序执行期间,图形处理子系统甚至将不会获取属性472,从而节省了存储器带宽。另外,用等于数据流图450中表达式485的值的导出的统一变量555替换未经优化的着色程序中的统一变量480和482。
将图5A和5B的经优化的着色程序与其在图4A和4B中的未经优化的版本进行比较,可以看到步骤307到331的第一重复极大地简化了链接的着色程序。如上文讨论,步骤331确定上游着色程序输出中的任一者是否为常数或先前未考虑的统一值。在此实例中,图5B的顶点着色程序的第一优化重复确定输出455和457均为统一值,所述统一值对于给定批量的数据来说是常数。变化的输出变量“varying1”455等于导出的统一值555。类似地,输出变量“varying2”457等于统一值560。因此,可通过使用对应于顶点着色程序输出455和457的片段着色程序输入415和417作为常数来重复步骤307到331以进一步优化所述对链接的着色程序。
表5和6说明在步骤307到331的第二次重复之后所述对示范性链接的着色程序的源代码。类似地,图6A和6B说明优化的第二重复之后呈数据流格式的此对示范性链接的着色程序。

表5-第二次优化重复之后的示范性片段着色程序

表6-第二次优化重复之后的示范性顶点着色程序图6A的数据流图600是图4A的图400中所示的片段着色程序的经优化版本。比较这两个图,可以看到现已消除条件分支427。这是用视为常数的变化的输入变量415和417来估计条件分支427的结果,所述输入变量415和417是在示范性顶点着色程序的优化的先前重复中确定的。另外,已用导出的统一值替换片段着色程序中的所有原始的统一值,从而消除了冗余的计算。
图6B的数据流图650展示第二次优化重复的结果。将此图与相应的未经优化的图450进行比较,可以看到已消除变化的输出变量455和457。因为这两个输出变量均将统一值输出到链接的下游着色程序,所以可在上游顶点着色程序中消除这些值并用链接的下游着色程序中的常数来替换。
在此实例中,在步骤307到331的第二次重复之后,没有新的常数或统一输出位于上游着色程序中。因此,在步骤331之后,方法300继续进行到步骤333以进行进一步优化和代码产生。进一步优化可包括用单个有效指令代替若干指令。举例来说,可用单个的乘法与累加指令替换其后为加法指令的乘法指令。可执行附加优化以利用图形处理子系统的管线式硬件。举例来说,指令可交叉存取以便更好地进行调度。表7和8说明步骤339之后所述对示范性链接的着色程序。

表7-附加优化之后的示范性片段着色程序

表8-附加优化之后的示范性顶点着色程序表7的片段着色程序对应于表1的未经优化的示范性片段着色程序。比较这两个表中的程序代码,可以看到方法300将片段着色程序从大约十二行高级着色语言代码减少为仅两个汇编语言指令。类似地,表2中的示范性顶点着色程序从其原始形式的约十个指令优化为表8中的仅六个指令。
图7说明适于实施本发明实施例的着色语言结构700。着色语言结构包括应用程序705。在一实施例中,应用程序705适于命令图形处理子系统740渲染一个或一个以上三维对象。应用程序705载入界定将要渲染的对象的对象数据710,包括几何形状、照明和纹理化的数据。应用程序705还从上游着色程序715和下游着色程序720载入源代码。在一实施例中,上游着色程序715和下游着色程序720分别可为顶点着色程序和片段着色程序。
为了使用上游着色程序715和下游着色程序720来渲染对象,应用程序705将着色程序发送到API驱动程序725。另外,应用程序705将命令发送到API驱动程序725以引导API驱动程序将上游着色程序715和下游着色程序720链接在一起,并编译和优化链接的着色程序。在一实施例中是API驱动程序725的一部分的流处理语言编译器730执行着色程序的编译和优化。在一替代实施例中,流处理语言编译器730是与API驱动程序725或应用程序705动态连系的外部模块或库。
接着应用程序705将对象数据710连同指示应渲染对象数据710的命令一起发送到API驱动程序725。因此,API驱动程序725将对象数据710和经编译和优化版本的链接的着色程序715和720发送到图形处理子系统740。图形处理子系统740执行链接的着色程序以处理对象数据710并渲染对象。
本发明提供一种系统,其用于基于流处理程序之间的关系来优化流处理程序。尽管已参照用于计算机图形应用程序的流处理系统讨论了本发明,但本发明适用于具有两个或两个以上可编程流处理单元的任何流处理系统,包括音频应用程序和通信应用程序。已参照本发明的特定实例和实施例讨论了本发明;然而,这些只是对本发明的说明而不是限制。因此,本发明的范围将仅仅由权利要求书确定。
权利要求
1.一种用于优化适于由一流处理系统执行的流处理程序的方法,其中所述流处理系统包括一第一和一第二可编程流处理单元,其中所述第二流处理单元与所述第一流处理单元连接,使得所述第一流处理单元的输出适于作为所述第二流处理单元的输入,所述方法包含接收一适于由一第一流处理单元执行的第一流处理程序,其中所述第一流处理程序包括一输出参数;接收一适于由一第二流处理单元执行的第二流处理程序,其中所述第二流处理程序包括一对应于所述第一流处理程序的所述输出参数的输入参数;和基于所述第二流处理程序的所述输入参数与所述第一流处理程序的所述输出参数之间的对应来优化所述第一和第二流处理程序。
2.根据权利要求1所述的方法,其中优化所述第一和第二流处理程序包括从所述第一流处理程序中消除适于计算一未被所述第二流处理程序使用的附加输出参数的失效程序代码。
3.根据权利要求1所述的方法,其中优化所述第一和第二流处理程序包括响应于所述第一流处理程序的所述输出参数是一常数的一确定来传播用于所述第二流处理程序的所述输入参数的一常数值;和从所述第二流处理程序中消除由于传播一常数值而成为冗余的失效程序代码。
4.根据权利要求1所述的方法,其中优化所述第一和第二流处理程序包括响应于所述第一流处理程序的所述输出参数是一统一值的一确定来传播用于所述第二流处理程序的所述输入参数的一统一值;和从所述第二流处理程序中消除由于传播一统一值而成为冗余的失效程序代码。
5.根据权利要求1所述的方法,其中所述流处理系统驻存在一图形处理子系统内。
6.根据权利要求5所述的方法,其中所述第一可编程流处理单元是一可编程顶点处理器。
7.根据权利要求5所述的方法,其中所述第二可编程流处理单元是一可编程顶点处理器。
8.根据权利要求5所述的方法,其中所述第一可编程流处理单元是一可编程镶嵌处理器。
9.根据权利要求5所述的方法,其中所述第二可编程流处理单元是一可编程片段处理器。
10.根据权利要求1所述的方法,其中所述流处理程序中的至少一者是用OpenGL着色语言编写的。
11.根据权利要求1所述的方法,其中所述流处理程序中的至少一者是用Cg语言编写的。
12.根据权利要求1所述的方法,其中所述流处理程序中的至少一者是用DirectX高级着色语言编写的。
13.根据权利要求1所述的方法,其中优化所述第一和第二流处理程序包括交替地优化所述第二流处理程序和所述第一流处理程序直到基于所述第二流处理程序的所述输入参数与所述第一流处理程序的所述输出参数之间的所述对应而优化所述第一和第二流处理程序两者为止的复数次重复。
14.根据权利要求1所述的方法,其进一步包含将所述经优化的第一和第二流处理程序编译成适于由所述流处理系统执行的格式。
15.一种信息存储媒介,其包括一组适于引导一信息处理装置执行一组步骤的处理器指令,其中所述信息处理装置包括一流处理系统,所述流处理系统包括一第一和一第二可编程流处理单元,其中所述第二流处理单元与所述第一流处理单元连接,使得所述第一流处理单元的输出适于作为所述第二流处理单元的输入,其中所述组步骤包含接收一适于由一第一流处理单元执行的第一流处理程序,其中所述第一流处理程序包括一输出参数;接收一适于由一第二流处理单元执行的第二流处理程序,其中所述第二流处理程序包括一对应于所述第一流处理程序的所述输出参数的输入参数;和基于所述第二流处理程序的所述输入参数与所述第一流处理程序的所述输出参数之间的对应来优化所述第一和第二流处理程序;其中优化所述第一和第二流处理程序包括交替地优化所述第二流处理程序和所述第一流处理程序直到基于所述第二流处理程序的所述输入参数与所述第一流处理程序的所述输出参数之间的所述对应而优化所述第一和第二流处理程序两者为止的复数次重复。
16.根据权利要求15所述的信息存储媒介,其中优化所述第一和第二流处理程序包括从所述第一流处理程序中消除适于计算一未被所述第二流处理程序使用的附加输出参数的失效程序代码。
17.根据权利要求15所述的信息存储媒介,其中优化所述第一和第二流处理程序包括响应于所述第一流处理程序的所述输出参数是一常数的一确定来传播用于所述第二流处理程序的所述输入参数的一常数值;和从所述第二流处理程序中消除由于传播一常数值而成为冗余的失效程序代码。
18.根据权利要求15所述的信息存储媒介,其中优化所述第一和第二流处理程序包括响应于所述第一流处理程序的所述输出参数是一统一值的一确定来传播用于所述第二流处理程序的所述输入参数的一统一值;和从所述第二流处理程序中消除由于传播一统一值而成为冗余的失效程序代码。
19.根据权利要求15所述的信息存储媒介,其中所述可编程流处理单元中的一者是一可编程顶点处理器。
20.根据权利要求15所述的信息存储媒介,其中所述流处理程序中的至少一者是用OpenGL着色语言编写的。
21.一种适于渲染一图像的系统,所述系统包含一图形处理子系统,其包括一第一和一第二可编程流处理单元,其中所述第二流处理单元与所述第一流处理单元连接,使得所述第一流处理单元的输出适于作为所述第二流处理单元的输入;一API驱动程序,其适于从一渲染应用程序接收一组渲染命令和数据,其中所述组渲染命令和数据包括一第一流处理程序和一第二流处理程序,且所述API驱动程序适于将所述第一和第二流处理程序分派到一流处理语言编译器单元;其中所述流处理语言编译器单元适于接收所述适于由所述第一流处理单元执行的第一流处理程序,其中所述第一流处理程序包括一输出参数;接收所述适于由所述第二流处理单元执行的第二流处理程序,其中所述第二流处理程序包括一对应于所述第一流处理程序的所述输出参数的输入参数;和基于所述第二流处理程序的所述输入参数与所述第一流处理程序的所述输出参数之间的对应来优化所述第一和第二流处理程序;其中优化所述第一和第二流处理程序包括交替地优化所述第二流处理程序和所述第一流处理程序直到基于所述第二流处理程序的所述输入参数与所述第一流处理程序的所述输出参数之间的所述对应而优化所述第一和第二流处理程序两者为止的复数次重复。
22.根据权利要求21所述的系统,其中所述API驱动程序进一步适于从所述流处理语言编译器单元接收所述经优化的第一和第二流处理程序,使所述组渲染命令和数据以及所述经优化的第一和第二流处理程序与所述图形处理子系统通信,和指示所述图形处理子系统通过分别用所述第一和第二流处理单元执行所述经优化的第一和第二流处理程序来处理所述组渲染命令和数据的至少一部分。
23.根据权利要求21所述的系统,其中所述流处理语言编译器单元进一步适于将所述经优化的第一和第二流处理程序编译成适于由所述流处理系统执行的格式。
24.根据权利要求21所述的系统,其中所述图形处理子系统包括一图形处理单元。
25.根据权利要求21所述的系统,其中所述图形处理子系统包括一适于存储所述组渲染命令和数据的至少一部分的图形存储器。
全文摘要
一系统基于在流处理程序之间交换的数据来优化两个或两个以上流处理程序。所述系统交替地处理每一流处理程序以识别并去除失效程序代码,藉此改进执行性能。通过传播作为来自其它流处理程序的输入而接收到的常数且通过分析一第一流处理程序并确定一第二流处理程序的未被所述第一流处理程序使用的输出来识别失效程序代码。所述系统可执行此优化的多次重复,因为先前的重复引入了用作一流处理程序的输入的附加常数。在所述流处理程序的优化之后,将所述经优化的流处理程序编译为一适于由一流处理系统执行的格式。
文档编号G06T15/00GK1997964SQ200580022672
公开日2007年7月11日 申请日期2005年6月30日 优先权日2004年7月2日
发明者马克·J·基尔加德, 克里斯托弗·T·多德, 列夫·莱巴雷迪安 申请人:辉达公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1