用于处理数据的方法和设备转让专利

申请号 : CN201780028332.2

文献号 : CN109154886B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陈林R·哈默斯托内刘佳吉张弛红A·E·格鲁贝尔杜云

申请人 : 高通股份有限公司

摘要 :

一种用于处理图形处理单元GPU中的数据的方法包含接收实例的实例识别符和着色器程序,所述着色器程序包括前同步码代码块和主要着色器代码块;在波创建处将所述实例识别符指配给通用寄存器;为实例统一体分配常数存储器内的地址空间;以及确定所述前同步码代码块尚未执行且波是将执行的所述实例的第一波;基于确定所述前同步码代码块尚未执行且所述波是将执行的所述第一波,执行所述前同步码代码块以将所述多个实例统一体存储在所述常数存储器中;以及至少部分地基于执行所述前同步码代码块,使用存储在常数存储器中的所述多个实例常数中的至少一个执行所述多个波中的所述波。

权利要求 :

1.一种操作图形处理单元GPU的方法,所述方法包括:通过所述GPU从着色器编译器接收实例的实例识别符和着色器程序,所述着色器程序包括前同步码代码块和主要着色器代码块,所述前同步码代码块可执行以将多个实例统一体存储在常数存储器中;

通过所述GPU在多个波中的波的创建处将所述实例识别符指配给通用寄存器;

通过所述GPU为所述多个实例统一体分配所述常数存储器内的地址空间;

通过所述GPU确定所述前同步码代码块尚未执行且所述波是将执行的所述实例的第一波;

至少部分地基于确定所述前同步码代码块尚未执行且所述波是将执行的所述第一波,通过所述GPU执行所述前同步码代码块以将所述多个实例统一体存储在所述常数存储器中;和至少部分地基于执行所述前同步码代码块,通过所述GPU使用存储在所述常数存储器中的所述多个实例统一体中的至少一个执行所述多个波中的所述波的所述主要着色器代码块。

2.根据权利要求1所述的方法,其另外包括:

通过所述GPU在所述多个波中的第二波的创建处将所述实例识别符指配给所述通用寄存器。

3.根据权利要求2所述的方法,其另外包括:

通过所述GPU确定所述第二波不是所述第一波;

至少部分地基于确定所述第二波不是所述第一波以及确定所述前同步码块尚未执行,在执行所述第二波的所述主要着色器代码块之前等待所述前同步码块完成执行。

4.根据权利要求2所述的方法,其另外包括:

通过所述GPU确定所述第二波不是所述第一波;

至少部分地基于确定所述第二波不是所述第一波以及确定所述前同步码块已经执行,通过所述GPU使用存储在所述常数存储器中的实例统一体执行所述多个波中的所述第二波的所述主要着色器代码块。

5.根据权利要求1所述的方法,其中所述常数存储器包括环绕式环形缓冲器,且将所述实例统一体存储在所述常数存储器中包括将所述实例统一体存储在所述环绕式环形缓冲器中。

6.根据权利要求5所述的方法,其另外包括将所述环绕式环形缓冲器中的实例偏移存储在统一通用寄存器中,所述实例偏移被配置成将所述多个实例统一体定位在所述实例的所述常数存储器中。

7.根据权利要求1所述的方法,其中通过所述GPU执行所述前同步码代码块以将所述多个实例统一体存储在所述常数存储器中另外包括:基于所述实例识别符和所述实例中的编号统一体,确定统一缓冲对象中的所述多个实例统一体中的实例统一体的源地址;

确定所述常数存储器中的所述多个实例统一体中的所述实例统一体的目的地地址;

至少部分地基于所述确定的源地址和所述确定的目的地地址,存储所述多个实例统一体中的所述实例统一体。

8.根据权利要求1所述的方法,其中通过所述GPU确定所述前同步码代码块尚未执行是基于旗标的值为假。

9.根据权利要求1所述的方法,其中执行所述前同步码代码块包括:执行被配置成划定所述前同步码代码块的起始的per_instance_preamble_start指令;和执行被配置成划定所述前同步码代码块的结尾的per_instance_preamble_end指令。

10.一种用于处理数据的装置,所述装置包括:

图形处理单元GPU,所述GPU包括常数存储器和着色器核心,所述着色器核心包括控制单元、多个处理元件和通用寄存器GPR,其中所述控制单元被配置成:从着色器编译器接收实例的实例识别符和着色器程序,所述着色器程序包括前同步码代码块和主要着色器代码块,所述前同步码代码块可执行以将多个实例统一体存储在所述常数存储器中;

在多个波中的波的创建处将所述实例识别符指配给所述GPR;

为所述多个实例统一体分配所述常数存储器内的地址空间;

确定所述前同步码代码块尚未执行且所述波是将执行的所述实例的第一波;

至少部分地基于确定所述前同步码代码块尚未执行且所述波是将执行的所述第一波,命令所述多个处理元件中的至少一个执行所述前同步码代码块以将所述多个实例统一体存储在所述常数存储器中;和至少部分地基于所述前同步码代码块的所述执行,命令所述多个处理元件中的至少一个使用存储在所述常数存储器中的所述多个实例统一体中的至少一个执行所述多个波中的所述波的所述主要着色器代码块。

11.根据权利要求10所述的装置,其中所述控制单元进一步被配置成:在所述多个波中的第二波的创建处将所述实例识别符指配给所述通用寄存器。

12.根据权利要求11所述的装置,其中所述控制单元进一步被配置成:确定所述第二波不是所述第一波;

至少部分地基于确定所述第二波不是所述第一波以及确定所述前同步码块尚未执行,在执行所述第二波的所述主要着色器代码块之前等待所述前同步码块完成执行。

13.根据权利要求11所述的装置,其中所述控制单元进一步被配置成:确定所述第二波不是所述第一波;

至少部分地基于确定所述第二波不是所述第一波以及确定所述前同步码块已经执行,使用存储在所述常数存储器中的实例统一体执行所述多个波中的所述第二波的所述主要着色器代码块。

14.根据权利要求10所述的装置,其中所述常数存储器包括环绕式环形缓冲器,且将所述实例统一体存储在所述常数存储器中包括将所述实例统一体存储在所述环绕式环形缓冲器中。

15.根据权利要求14所述的装置,其中:

所述着色器核心另外包括统一通用寄存器,且

所述控制单元进一步被配置成将实例偏移存储在所述环绕式环形缓冲器中,所述实例偏移被配置成将所述多个实例统一体定位在所述实例的所述常数存储器中。

16.根据权利要求10所述的装置,其中所述控制单元被配置成执行所述前同步码代码块以将所述多个实例统一体存储在所述常数存储器中另外包括所述控制单元被配置成:基于所述实例识别符和所述实例中的编号统一体,确定统一缓冲对象中的所述多个实例统一体中的实例统一体的源地址;

确定所述常数存储器中的所述多个实例统一体中的所述实例统一体的目的地地址;

至少部分地基于所述确定的源地址和所述确定的目的地地址,存储所述多个实例统一体中的所述实例统一体。

17.根据权利要求10所述的装置,其中所述控制单元被配置成确定所述前同步码代码块尚未执行是基于旗标的值为假。

18.根据权利要求10所述的装置,其中所述前同步码代码块的执行包括:执行被配置成划定所述前同步码代码块的起始的per_instance_preamble_start指令;和执行被配置成划定所述前同步码代码块的结尾的per_instance_preamble_end指令。

19.一种被配置成操作图形处理单元GPU的设备,所述设备包括:用于从着色器编译器接收实例的实例识别符和着色器程序的装置,所述着色器程序包括前同步码代码块和主要着色器代码块,所述前同步码代码块可执行以将多个实例统一体存储在常数存储器中;

用于在多个波中的波的创建处将所述实例识别符指配给通用寄存器的装置;

用于为所述多个实例统一体分配所述常数存储器内的地址空间的装置;

用于确定所述前同步码代码块尚未执行且所述波是将执行的所述实例的第一波的装置;

用于至少部分地基于确定所述前同步码代码块尚未执行且所述波是将执行的所述第一波,执行所述前同步码代码块以将所述多个实例统一体存储在所述常数存储器中的装置;和用于至少部分地基于所述执行所述前同步码代码块,使用存储在所述常数存储器中的所述多个实例统一体中的至少一个执行所述多个波中的所述波的所述主要着色器代码块的装置。

20.根据权利要求19所述的设备,其另外包括:

用于在所述多个波中的第二波的创建处将所述实例识别符指配给所述通用寄存器的装置。

21.根据权利要求20所述的设备,其另外包括:

用于确定所述第二波不是所述第一波的装置;

用于至少部分地基于确定所述第二波不是所述第一波以及确定所述前同步码块尚未执行,在执行所述第二波的所述主要着色器代码块之前等待所述前同步码块完成执行的装置。

22.根据权利要求20所述的设备,其另外包括:

用于确定所述第二波不是所述第一波的装置;

用于至少部分地基于确定所述第二波不是所述第一波以及确定所述前同步码块已经执行,使用存储在所述常数存储器中的实例统一体执行所述多个波中的所述第二波的所述主要着色器代码块的装置。

23.根据权利要求19所述的设备,其中所述常数存储器包括环绕式环形缓冲器,且将所述实例统一体存储在所述常数存储器中包括将所述实例统一体存储在所述环绕式环形缓冲器中。

24.根据权利要求19所述的设备,其中所述用于执行所述前同步码代码块以将所述多个实例统一体存储在所述常数存储器中的装置包括:用于基于所述实例识别符和所述实例中的编号统一体,确定统一缓冲对象中的所述多个实例统一体中的实例统一体的源地址的装置;

用于确定所述常数存储器中的所述多个实例统一体中的所述实例统一体的目的地地址的装置;

用于至少部分地基于所述确定的源地址和所述确定的目的地地址,存储所述多个实例统一体中的所述实例统一体的装置。

25.一种包含存储在上面的指令的非暂时性计算机可读存储媒体,所述指令在被执行时致使至少一个处理器:从着色器编译器接收实例的实例识别符和着色器程序,所述着色器程序包括前同步码代码块和主要着色器代码块,所述前同步码代码块可执行以将多个实例统一体存储在常数存储器中;

在多个波中的波的创建处将所述实例识别符指配给通用寄存器GPR;

为所述多个实例统一体分配所述常数存储器内的地址空间;

确定所述前同步码代码块尚未执行且所述波是将执行的所述实例的第一波;

至少部分地基于确定所述前同步码代码块尚未执行且所述波是将执行的所述第一波,命令多个处理元件中的至少一个执行所述前同步码代码块以将所述多个实例统一体存储在所述常数存储器中;和至少部分地基于所述前同步码代码块的所述执行,命令所述多个处理元件中的至少一个使用存储在所述常数存储器中的所述多个实例统一体中的至少一个执行所述多个波中的所述波的所述主要着色器代码块。

26.根据权利要求25所述的非暂时性计算机可读存储媒体,其中所述指令在被执行时进一步致使至少一个处理器:在所述多个波中的第二波的创建处将所述实例识别符指配给所述通用寄存器。

27.根据权利要求26所述的非暂时性计算机可读存储媒体,其中所述指令在被执行时进一步致使至少一个处理器:确定所述第二波不是所述第一波;

至少部分地基于确定所述第二波不是所述第一波以及确定所述前同步码块尚未执行,在执行所述第二波的所述主要着色器代码块之前等待所述前同步码块完成执行。

28.根据权利要求26所述的非暂时性计算机可读存储媒体,其中所述指令在被执行时进一步致使至少一个处理器:确定所述第二波不是所述第一波;

至少部分地基于确定所述第二波不是所述第一波以及确定所述前同步码块已经执行,使用存储在所述常数存储器中的实例统一体执行所述多个波中的所述第二波的所述主要着色器代码块。

29.根据权利要求25所述的非暂时性计算机可读存储媒体,其中所述指令在被执行时致使至少一个处理器执行所述前同步码代码块以将所述多个实例统一体存储在所述常数存储器中包括指令在被执行时致使至少一个处理器:基于所述实例识别符和所述实例中的编号统一体,确定统一缓冲对象中的所述多个实例统一体中的实例统一体的源地址;

确定所述常数存储器中的所述多个实例统一体中的所述实例统一体的目的地地址;

至少部分地基于所述确定的源地址和所述确定的目的地地址,存储所述多个实例统一体中的所述实例统一体。

30.根据权利要求25所述的非暂时性计算机可读存储媒体,其中所述指令在被执行时致使至少一个处理器确定所述前同步码代码块尚未执行是基于旗标的值为假。

说明书 :

用于处理数据的方法和设备

技术领域

[0001] 本发明涉及数据处理,且更明确地说,涉及用于图形处理的每实例前同步码的产生和执行。

背景技术

[0002] 单指令多数据(SIMD)处理系统为包含对多个数据段执行相同指令的多个处理元件的一种类型的并行计算系统。SIMD系统可为独立计算机或计算系统的子系统。举例来说,一或多个SIMD执行单元可用于图形处理单元(GPU)中以实施支持可编程着色的可编程着色单元。SIMD处理系统允许程序的多个执行线程以并行方式对多个处理元件进行同步执行,由此增加需要对多个数据段执行相同集合的操作的程序的处理量。在特定SIMD处理元件上执行的特定指令被称作线程或纤程。线程组可被称作波(wave)或线程束(warp)。
[0003] 处理单元例如GPU包含处理元件和存储数据以供指令执行的通用寄存器(GPR)和统一(uniform)GPR(uGPR)。在一些实例中,处理元件执行用于处理一个数据项的指令,并且相应的处理元件在GPR中存储所述数据项或者来自处理的所述项的所得数据。数据项可以是发生处理的基本单位。举例来说,在图形处理中,图元的顶点是项的一个实例,并且像素是项的另一实例。存在与每一顶点和像素相关联的图形数据(例如,坐标、色彩值等)。
[0004] 处理元件的处理器核心内可存在多个处理元件,从而允许指令的并行执行(例如,多个处理元件在同一时间执行相同指令)。着色器是可使用并行处理环境(例如,着色器处理器)并且已用以在图形处理管线的各个阶段对二维和三维模型执行图形渲染技术的计算机程序。着色器的实例包含:像素(或片段)着色器,其用以计算像素(或片段)的色彩和其它属性;顶点着色器,其用以控制位置、移动、照明和色彩,或顶点;几何着色器,其用以产生图形图元;曲面细分(tessellation)相关着色器(例如,当将顶点数据的补片(patch)细分成较小图元时使用的外壳着色器和/或域着色器,以及用于计算其它信息例如非图形数据的计算着色器)。

发明内容

[0005] 一般来说,本发明描述使用每实例前同步码增加存储器效率的技术。特定来说,本发明描述借此着色器系统可为实例分配常数RAM的区段的技术。在波创建时间,可在标量GPR中分配实例偏移。着色器系统接着经由例如环绕式环形缓冲器为实例专用信息(例如,位置信息、纹理信息)分配常数RAM的区段。所有实例共同的信息可存储在常数RAM的独立区域中。这可允许图形处理单元(GPU)多次重复使用从存储器加载的数据(例如,共同信息),并且仅加载每实例着色器信息。这可减小增加片上RAM的量的需要,减小存储器流量,增加性能,并且由于可存在总线上的流量减小而减少电力消耗。
[0006] 在本发明的一个实例中,一种操作图形处理单元(GPU)的方法,所述方法包括:通过所述GPU从着色器编译器接收实例的实例识别符和着色器程序,所述着色器程序包括前同步码代码块和主要着色器代码块,所述前同步码代码块可执行以将多个实例统一体存储在常数存储器中;通过所述GPU在多个波中的波的创建处将所述实例识别符指配给通用寄存器;通过所述GPU为所述多个实例统一体分配所述常数存储器内的地址空间;通过所述GPU确定所述前同步码代码块尚未执行且所述波是将执行的所述实例的第一波;至少部分地基于确定所述前同步码代码块尚未执行且所述波是将执行的所述第一波,通过所述GPU执行所述前同步码代码块以将所述多个实例统一体存储在所述常数存储器中;和至少部分地基于执行所述前同步码代码块,通过所述GPU使用存储在所述常数存储器中的所述多个实例常数中的至少一个执行所述多个波中的所述波的所述主要着色器代码块。
[0007] 在另一实例中,一种用于处理数据的装置,所述装置包括:图形处理单元(GPU),所述GPU包括常数存储器和着色器核心,所述着色器核心包括控制单元、多个处理元件和通用寄存器(GPR),其中所述控制单元被配置成:从着色器编译器接收实例的实例识别符和着色器程序,所述着色器程序包括前同步码代码块和主要着色器代码块,所述前同步码代码块可执行以将多个实例统一体存储在所述常数存储器中;在多个波中的波的创建处将所述实例识别符指配给所述GPR;为所述多个实例统一体分配所述常数存储器内的地址空间;确定所述前同步码代码块尚未执行且所述波是将执行的所述实例的第一波;至少部分地基于确定所述前同步码代码块尚未执行且所述波是将执行的所述第一波,命令所述多个处理元件中的至少一个执行所述前同步码代码块以将所述多个实例统一体存储在所述常数存储器中;和至少部分地基于所述前同步码代码块的所述执行,命令所述多个处理元件中的至少一个使用存储在所述常数存储器中的所述多个实例常数中的至少一个执行所述多个波中的所述波的所述主要着色器代码块。
[0008] 在另一实例中,一种被配置成操作图形处理单元(GPU)的设备,所述设备包括:用于从着色器编译器接收实例的实例识别符和着色器程序的装置,所述着色器程序包括前同步码代码块和主要着色器代码块,所述前同步码代码块可执行以将多个实例统一体存储在常数存储器中;用于在多个波中的波的创建处将所述实例识别符指配给通用寄存器的装置;用于为所述多个实例统一体分配所述常数存储器内的地址空间的装置;用于确定所述前同步码代码块尚未执行且所述波是将执行的所述实例的第一波的装置;用于至少部分地基于确定所述前同步码代码块尚未执行且所述波是将执行的所述第一波,执行所述前同步码代码块以将所述多个实例统一体存储在所述常数存储器中的装置;和用于至少部分地基于所述执行所述前同步码代码块,使用存储在所述常数存储器中的所述多个实例常数中的至少一个执行所述多个波中的所述波的所述主要着色器代码块的装置。
[0009] 在另一实例中,一种包含存储在其上的指令的非暂时性计算机可读存储媒体,所述指令在被执行时致使至少一个处理器:从着色器编译器接收实例的实例识别符和着色器程序,所述着色器程序包括前同步码代码块和主要着色器代码块,所述前同步码代码块可执行以将多个实例统一体存储在常数存储器中;在多个波中的波的创建处将所述实例识别符指配给通用寄存器(GPR);为所述多个实例统一体分配所述常数存储器内的地址空间;确定所述前同步码代码块尚未执行且所述波是将执行的所述实例的第一波;至少部分地基于确定所述前同步码代码块尚未执行且所述波是将执行的所述第一波,命令多个处理元件中的至少一个执行所述前同步码代码块以将所述多个实例统一体存储在所述常数存储器中;和至少部分地基于所述前同步码代码块的所述执行,命令所述多个处理元件中的至少一个使用存储在所述常数存储器中的所述多个实例常数中的至少一个执行所述多个波中的所述波的所述主要着色器代码块。
[0010] 在附图和以下描述中阐明一或多个实例的细节。其它特征、目标和优点将从所述描述、图式以及权利要求书而显而易见。

附图说明

[0011] 图1是说明根据本发明中所描述的一个或多个实例技术的用于处理数据的实例装置的框图。
[0012] 图2是更详细地说明图1中所说明的装置的组件的框图。
[0013] 图3是说明指令集的实例的概念图。
[0014] 图4是图1的GPU的实例着色器核心的更详细框图。
[0015] 图5是说明处理GPU中的数据的实例技术的流程图。

具体实施方式

[0016] 例如图形处理单元(GPU)的被配置成并行地(例如,在同一时间或基本上在同一时间)执行多个操作的并行处理单元包含执行一或多个程序的指令的一或多个处理器核心(例如,GPU的着色器核心)。为易于描述,本发明中描述的技术是相对于被配置成执行图形处理应用程序和/或通用GPU(GPGPU)应用程序的GPU进行描述。然而,本发明中描述的技术可以扩展到未必是GPU或GPGPU的并行处理单元,以及非并行处理单元(例如,未具体配置成用于并行处理的并行处理单元)。
[0017] 可用单指令多数据(SIMD)结构来设计GPU。在SIMD结构中,着色器核心(或更一般来说,SIMD处理核心)包含多个SIMD处理元件,其中每一SIMD处理元件执行相同程序但在不同数据上的指令。在特定SIMD处理元件上执行的特定指令被称作线程或纤程。并行地执行的线程组可以被称作波或线程束。一起执行波的所有处理元件可以被称作向量处理单元,其中向量的每一分道(例如,处理元件)执行一个线程。每一SIMD处理元件可以被认为是执行不同线程,这是因为用于给定线程的数据可能是不同的;然而,在一个处理元件上执行的线程是与在其它处理元件上执行的指令相同的程序的相同指令。以此方式,SIMD结构允许GPU并行(例如,在同一时间)执行多个任务。
[0018] 着色器(或着色器程序)是可使用并行处理环境的计算机程序(例如,着色器处理器)。着色器程序中的实例命令可包含绘制命令和调度命令。绘制命令是指由通往与图形处理单元(例如,GPU)交互的图形应用程序接口(API)的处理单元(例如,CPU)执行以绘制(例如渲染)对象以供在显示装置上显示的命令系列中的一或多个。调度命令是指由通往与图形处理单元(GPU)交互的图形API的处理单元(例如,CPU)执行以执行非显示操作的命令系列中的一或多个。图形API也可以具有着色器实例专用绘制命令。这些着色器实例专用绘制命令可反映非实例绘制命令,预期可允许处理器做出单个绘制调用并且使GPU处理用于例如网格实例的每一实例的命令。实例是待渲染模型或对象的单次发生。实例化是可通过单个渲染调用立即绘制多个对象(例如,同一网格的多个副本)的技术。实例化的使用可每当渲染对象时保存CPU到GPU通信。绘制或调度命令的元素可执行关联着色器中的冗余操作。特定来说,GPU可执行批处理命令,例如绘制调用和调度。命令可指示GPU使用一或多个着色器处理例如工作项、像素和顶点等元素。着色器接着可调用所述元素。同一着色器可调用命令的相同类型的元素。着色器的操作可针对相同类型的所有元素产生相同结果。可单次识别和执行此类操作而不需要冗余执行用于每一元素的相同代码段。
[0019] 游戏和基准可创建一场景中的某些元素的多个副本。这些元素可以由单段几何形状(例如,网格)和特定于应用程序的属性集合表示。实例化渲染多次绘制相同几何形状,其中每一实例的属性用以控制元素在何处以及如何呈现。举例来说,经常使用几何实例化渲染树、草和建筑物,且GFXBench 3.0图形基准使用渲染作为实例化绘制调用的光的曼哈顿(Manhattan)测试。
[0020] 需要大统一缓冲对象(UBO)支持多个实例化绘制调用。通常,UBO可大于片上(例如,GPU上)常数存储装置,其必需将来自片上常数存储装置的数据移动到其它通常较慢存储器。这可致使存储器流量增加、性能降低以及功率消耗增加。
[0021] 本发明描述借此定为目标的每实例统一体(uniform)在着色器运行时间加载到常数RAM的方法、技术和装置。统一体是充当可由着色器程序的在CPU上运行的GPU驱动器传送的可传送到在GPU上运行的着色器程序的参数的数据类型。统一体可能不将值从着色器程序的一个执行到特定渲染调用内的下一个进行改变。因此,统一体可在着色器内为隐式地常数的。在本发明的一个实例中,当执行(例如实例化绘制调用的)绘制命令时,着色器编译器/GPU驱动器将实例识别符(ID)传送到着色器处理器(也称为着色器核心)。CPU(经由着色器编译器和/或GPU驱动器)可发送到关于实例的GPU状态信息(包含例如常数的存储器要求)。着色器处理器可使用实例ID将常数(也称为统一体和实例常数)定位在供实例的像素(或顶点)使用的系统存储器中的统一缓冲对象(UBO)中(例如,计算所述常数的地址)。UBO是用以存储用于着色器程序的统一体数据并且可用以在不同程序之间共享统一体的缓冲对象(即,存储由GPU分配的无格式存储器阵列的对象)。CPU可产生供在着色器处理器上执行的着色器代码。产生的代码可包含每实例着色器前同步码和主要着色器代码。每实例着色器前同步码可使得着色器处理器能够为供不同线程群组(也称为波或线程束)用以执行主要着色器代码的实例常数分配存储器。每实例着色器前同步码可在执行实例的任何波之前执行一次。每实例着色器前同步码可每实例执行一次。实例化绘制可具有多个实例,因此每实例前同步码可在绘制调用执行期间多次执行。然而,虽然实例可具有多个波,但每实例前同步码可每实例仅调用一次。每实例前同步码可用于绘制调用的每一着色器类型。举例来说,顶点着色器和片段着色器可各自具有独立的在特定实例上的每实例着色器前同步码执行。
[0022] 主要着色器代码可经由存取含有实例常数的位置(例如,存储器地址)的uGPR来存取实例常数。所述位置可包含在环绕式环形缓冲器中的位置。环绕式环形缓冲器可位于常数RAM中。所述位置可包含在执行任何波之前分配的实例专用存储器偏移。在后续波执行处,可重新设置uGPR。可通过当前实例偏移重新加载uGPR。这可允许后续波存取实例常数的存储器位置而不必重新加载每一数据段(如在每一波后重新设置UGPR)。
[0023] 在后续波执行期间,执行着色器程序的着色器可跳过(经由例如分支操作)着色器前同步码。所述跳过可在检查旗标是否设置为标示每实例着色器前同步码先前已经完成执行之后发生。所述跳过也可以在检查当前波是否是实例的第一波(其将在后续波执行中失败)之后发生。因为统一体可每实例仅加载一次(到例如常数RAM中的环绕式环形缓冲器中)并且对实例的多个像素(或顶点)重复使用所述统一体,所以多次重复使用(并且不重新加载)来自UBO的数据可增加系统的性能并且降低功耗。
[0024] 图1是说明根据本发明中所描述的每实例前同步码的一个或多个实例技术的用于处理数据的实例装置的框图。图1说明装置10,其实例包含但不限于例如媒体播放器等视频装置、机顶盒、例如移动电话等无线通信装置、个人数字助理(PDA)、台式计算机、手提式计算机、游戏控制台、视频会议单元、平板计算装置等等。
[0025] 在图1的实例中,装置10包含处理器12、GPU 14和系统存储器16。在例如其中装置10是移动装置的实例的一些实例中,处理器12和GPU 14可形成为集成电路(IC)。举例来说,IC可以被认为是芯片封装内的处理芯片,例如片上系统(SoC)。在例如其中装置10是台式计算机或手提式计算机的实例的一些实例中,处理器12和GPU 14可容纳于不同集成电路(例如,不同芯片封装)中。然而,在装置10是移动装置的实例中,处理器12和GPU 14或许有可能容纳于不同集成电路中。
[0026] 处理器12和GPU 14的实例包含但不限于一或多个数字信号处理器(DSP)、通用微处理器、专用集成电路(ASIC)、现场可编程逻辑阵列(FPGA)或其它等效的集成或离散逻辑电路。处理器12可为装置10的CPU。在一些实例中,GPU 14可以是专用硬件,其包含集成和/或离散逻辑电路,所述集成和/或离散逻辑电路向GPU 14提供适用于图形处理的大规模并行处理能力(例如,SIMD处理器)。在一些情况下,GPU 14还可包含通用处理能力,且在实施通用处理任务(即,非图形相关任务)时可被称为通用GPU(GPGPU)。
[0027] 出于说明的目的,用GPU 14描述本发明中描述的技术。然而,本发明中描述的技术不受如此限制。本发明中所描述的技术可扩展到其它类型的并行处理单元(例如,提供大规模并行处理能力的处理单元,即使未用于图形处理)。并且,本发明中描述的技术可以扩展到未被具体配置成用于并行处理的处理单元。
[0028] 处理器12可执行各种类型的应用程序。应用程序的实例包含操作系统、网络浏览器、电子邮件应用程序、电子数据表、视频游戏或产生用于显示的可视对象的其它应用程序。系统存储器16可以存储用于执行一或多个应用程序的指令。在处理器12上执行应用程序使得处理器12产生用于有待显示的图像内容的图形数据。处理器12可向GPU 14传输图像内容的图形数据以供进一步处理。
[0029] 作为实例,在处理器12上执行应用程序致使处理器12产生图元的顶点的网格的实例化绘制,其中相应顶点处的图元的互连形成图形对象。在此实例中,处理器12产生的图形数据是用于顶点的实例网格的属性的属性数据。举例来说,在处理器12上执行的应用程序可产生用于顶点的实例网格中的每一个的色彩值、不透明度值、坐标等,其全部是顶点的属性的实例。通过使用每实例着色器前同步码,这些属性可在每实例着色器前同步码执行处单次加载到GPU 14上的常数RAM。所述属性可供着色器在后续波中使用而无需重新加载所有值。替代地,实例偏移可在每一波处重新加载到GPU 14上的统一通用寄存器中。此实例偏移可允许GPU 14定位和使用后续波中的属性。
[0030] 处理器12(经由例如驱动器)可将所述属性经由UBO传送到GPU 14。从系统存储器16经由UBO传送到GPU 14的属性可包含来自多个实例的属性。系统存储器16中的UBO可大于在GPU 14上分配的空间的量。实例识别符可从处理器12经由硬件状态变量传送到GPU 14。
处理器12(经由例如编译器)可编写每实例着色器前同步码以当在GPU 14上被执行时,加载来自UBO的属性并将所述属性存储到常数RAM的区段。在一个实例中,常数RAM的区段可实施为环绕式环形缓冲器。在第二实例中,常数RAM的区段可实施为链表。因为系统存储器16中的UBO可大于GPU 14上的经分配存储器的量,所以仅当前实例专用统一体可复制到驻留于GPU 14上的存储器中。可在UBO中经由从处理器12传送到GPU 14的实例识别符识别实例专用统一体。
[0031] 一般来说,本发明的技术可扩展到属性数据之外的数据类型(例如,计数器),并且所述技术不应被视为限于属性数据或限于例如色彩值、不透明度值、坐标等属性数据的实例。
[0032] 在一些非图形相关实例中,处理器12可以产生更适合于通过GPU 14处理的数据。此类数据无需用于图形或显示目的。举例来说,处理器12可输出需要通过GPU 14对其执行矩阵操作的数据,并且GPU 14又可执行矩阵操作。此类操作可要求使用着色器的多个波。数据可存储在常数RAM中并且经由GPR中的指针进行检索。在GPR得以重新设置之后,可在每一波之后刷新GPR中的指针。这可允许此数据被持续存取而不需要在波之间重新加载所述数据。
[0033] 一般来说,处理器12可以将处理任务分担给GPU 14,例如需要大规模并行操作的任务。作为一个实例,图形处理需要大规模并行操作,且处理器12可以将此类图形处理任务分担给GPU 14。然而,例如矩阵操作的其它操作也可以得益于GPU 14的并行处理能力。在这些实例中,处理器12可以充分利用GPU 14的并行处理能力以使GPU 14执行非图形相关操作。
[0034] 处理器12可根据特定应用程序处理接口(API)与GPU 14通信。此类API的实例包含的 API、克罗诺斯(Khronos)组织的 或OpenGL 以及OpenCLTM;然而,本发明的各方面不限于DirectX、OpenGL或OpenCL API,且可扩展到其它类型的API。此外,本发明中描述的技术不需要根据API起作用,且处理器12和GPU 14可利用任何通信技术。
[0035] 装置10还可包含显示器18、用户接口20和收发器模块22。为清楚起见,装置10可包含图1中未示出的额外模块或单元。举例来说,装置10可以包含扬声器和麦克风(两者在图1中均未示出),以在装置10为移动无线电话的实例中实现电话通信。此外,装置10中所示出的各种模块和单元可并不在装置10的每一实例中都是必要的。举例来说,在装置10是台式计算机的实例中,用户界面20和显示器18可在装置10外部。作为另一实例,在显示器18为移动装置的触敏或压敏显示器的实例中,用户接口20可以是显示器18的一部分。
[0036] 显示器18可包括液晶显示器(LCD)、阴极射线管(CRT)显示器、等离子显示器、触敏显示器、压敏显示器或另一类型的显示装置。用户接口20的实例包含但不限于轨迹球、鼠标、键盘和其它类型的输入装置。用户接口20也可为触摸屏且可并入作为显示器18的一部分。收发器模块22可包含电路以允许装置10与另一装置或网络之间的无线或有线通信。收发器模块22可包含调制器、解调器、放大器以及其它用于有线或无线通信的此类电路。
[0037] 系统存储器16可以是装置10的存储器。系统存储器16可包括一或多个计算机可读存储媒体。系统存储器16的实例包含但不限于随机存取存储器(RAM)、电可擦除可编程只读存储器(EEPROM)、快闪存储器,或可用于携载或存储呈指令和/或数据结构形式的所要程序代码且可由计算机或处理器存取的其它媒体。
[0038] 在一些方面中,系统存储器16可包含致使处理器12和/或GPU 14执行在本发明中归于处理器12和GPU 14的功能的指令。因此,系统存储器16可为上面存储有指令的计算机可读存储媒体,所述指令在被执行时致使一或多个处理器(例如,处理器12和GPU 14)执行各种功能。
[0039] 在一些实例中,系统存储器16可为非暂时性存储媒体。术语“非暂时性”可指示存储媒体未体现于载波或传播信号中。然而,术语“非暂时性”不应解释为意味着系统存储器16是非可移动的或其内容为静态的。作为一个实例,可从装置10移除系统存储器16,且将所述系统存储器移动到另一装置。作为另一实例,大体类似于系统存储器16的存储器可插入到装置10中。在某些实例中,非暂时性存储媒体可存储可随时间改变(例如,在RAM中)的数据。
[0040] 举例来说,如在本发明中的其它地方更详细地描述,系统存储器16可以存储用于在处理器12上执行的执行本发明中所描述的一或多个实例的技术的编译器的代码。系统存储器16也可以存储用于在GPU 14的着色器核心(也称为着色器处理器或核心)上执行的着色器程序(例如,顶点着色器、像素或片段着色器、曲面细分相关着色器、计算着色器等)的代码。
[0041] 术语图形项在本发明中用以指代GPU 14执行并行处理的基本单位。GPU 14可以并行(例如,在同一时间)处理多个图形项。举例来说,顶点着色器可以处理顶点,且GPU 14可以并行执行顶点着色器的多个实例以在同一时间处理多个顶点。类似地,像素或片段着色器可以处理显示器的像素,且GPU 14可以并行执行像素着色器的多个实例以在同一时间处理显示器的多个像素。顶点和像素是图形项的实例。对于非图形相关应用程序,术语“工作项”可指GPU 14执行处理的最小单位。
[0042] 图2是更详细地说明图1中所说明的装置的组件的框图。如图2中所说明,GPU 14包含着色器核心24、固定功能管线30和GPU存储器42,所述着色器核心包含通用寄存器(GPR)26、统一GPR(uGPR)27和常数存储器44。GPR 26可包含单个GPR、GPR文件和/或GPR库。uGPR 
27可包含单个uGPR、uGPR文件和/或uGPR库。GPR 26可存储单一线程/纤程可存取的数据。
uGPR 27可存储可由单个波/线程束中的所有线程/纤程存取的数据。着色器核心24和固定功能管线30可一起形成用以执行图形或非图形相关功能的处理管线。处理管线执行由在GPU 14上执行的软件或固件定义的功能,并且由经硬接线以执行特定功能的固定功能单元执行功能。GPU 14的此类固定功能管线30可包含纹理管线、曲面细分级、落在视见立体角外部的裁剪,以及照明。
[0043] 在GPU 14上执行的软件和/或固件可以被称作着色器程序(或简单称作着色器),且所述着色器程序可在GPU 14的着色器核心24上执行。虽然仅说明一个着色器核心24,但在一些实例中,GPU 14可包含两个或更多个类似于着色器核心24的着色器核心。固定功能管线30包含固定功能单元。着色器核心24和固定功能管线30可自彼此发射和接收数据。举例来说,处理管线可包含在着色器核心24上执行的着色器程序,所述着色器核心从固定功能管线30的一个固定功能单元接收数据,并且向固定功能管线30的另一固定功能单元输出经处理数据。
[0044] 着色器程序为用户和/或开发人员提供功能灵活性,这是因为用户可设计着色器程序以按任何可设想方式执行所要任务。然而,固定功能单元针对固定功能单元执行任务的方式而经硬接线。因此,固定功能单元可不提供显著功能灵活性。
[0045] 着色器程序的实例包含顶点着色器程序32、片段着色器程序34和计算着色器程序36。顶点着色器程序32和片段着色器程序34可为用于图形相关任务的着色器程序,且计算着色器程序36可为用于非图形相关任务的着色器程序。存在为了简洁起见未描述的着色器程序的额外实例,例如几何着色器和曲面细分相关着色器。
[0046] 在处理器12上执行的图形驱动器40可被配置成实施应用程序编程接口(API);不过图形驱动器40不需要受限于根据特定API被配置。在此类实例中,着色器程序(例如,顶点着色器程序32、片段着色器程序34和计算着色器程序36)可根据图形驱动器40所支持的API被配置。在其中装置10是移动装置的一实例中,图形驱动器40可根据OpenGL ES API被配置。OpenGL ES API具体被设计成用于移动装置。在装置10为非移动装置的实例中,图形驱动器40可以根据OpenGL API被配置。其它实例API包含微软公司的API的DirectX系列。虽然未说明,但系统存储器16可存储用于图形驱动器40的代码,处理器12从系统存储器16检索所述代码以用于执行。在虚线框中说明图形驱动器40以指示在此实例中,图形驱动器40是在硬件(例如,处理器12)上执行的软件。
[0047] 图形驱动器40可被配置成允许处理器12和GPU 14与彼此通信。举例来说,当处理器12将图形或非图形处理任务分担给GPU 14时,处理器12经由图形驱动器40将此类处理任务分担给GPU 14。
[0048] 作为一实例,处理器12可以执行产生图形数据的游戏应用程序,并且处理器12可以将这个图形数据的处理卸载到GPU 14。在这个实例中,处理器12可以在系统存储器16中存储图形数据,并且图形驱动器40可以指令GPU 14何时检索图形数据,在系统存储器16中从哪里检索图形数据,以及何时处理图形数据。并且,游戏应用程序可要求GPU 14执行一或多个着色器程序。举例来说,游戏应用程序可要求着色器核心24执行顶点着色器程序32和片段着色器程序34以产生待(例如,在图1的显示器18上)显示的图像。图形驱动器40可指令GPU 14何时执行着色器程序,并且指令GPU 14从何处检索着色器程序所需的图形数据。以此方式,图形驱动器40可以在处理器12与GPU 14之间形成链接。
[0049] 在一些实例中,系统存储器16可存储用于顶点着色器程序32、片段着色器程序34和计算着色器程序36中的一或多个的源代码。在这些实例中,在处理器12上执行的编译器38可编译这些着色器程序的源代码,以创建GPU 14的着色器核心24在运行时间(例如,在这些着色器程序需要在着色器核心24上执行的时间)期间可执行的对象或中间代码。在一些实例中,编译器38可以预编译着色器程序,并且在系统存储器16中存储着色器程序的对象或中间代码。
[0050] 系统存储器16也可以将一或多个统一值存储在统一缓冲对象(UBO)46中。UBO 46可存储用于一或多个实例的统一体数据。这些值可从系统存储器16传送到GPU 14上的存储器(例如,常数存储器44和/或GPU存储器42)。
[0051] 根据本发明的技术,处理器12上运行的编译器38(或在另一实例中,图形驱动器40)可将着色器构建到包含“主要”着色器组件和“每实例前同步码”着色器组件的多个组件中。编译器38可接收从在处理器12上执行的程序编译到例如“主要”着色器组件中的代码。
编译器38也可以使用关于实例的状态的信息(例如,实例识别符、用于实例的统一体的数目、供实例统一体使用的存储器的大小)写入每实例着色器前同步码。每实例着色器前同步码可当由GPU 14(或着色器核心24)执行时将实例统一体加载到常数存储器44中。在另一实例中,实例统一体可加载到GPU存储器42中。
[0052] 编译器38可使用例如每实例前同步码起始的指令标记每实例着色器前同步码的,并且使用前同步码结束指令标记每实例着色器前同步码的结尾。
[0053] 图形驱动器40或编译器38可初始化GPU 14上的状态寄存器(特定来说,驱动器编程的状态寄存器)、通用寄存器26或uGPR 27。在一个实例中,图形驱动器40可用关于以下的数据初始化GPU 14上的一或多个状态寄存器:(i)用于特定实例的常数RAM中的统一体的数目或实例专用统一体所需的存储器的占用面积、或大小(例如以千字节为单位),和/或(ii)可放入分配的常数RAM中的实例的波的最大数目。图形驱动器40也可以将实例的存储器偏移(例如,地址)存储在GPR 26或uGPR 27中的常数RAM中。
[0054] 还可由图形驱动器40或编译器38初始化着色器核心24专用硬件状态。在一个实例中,这些状态(存储在状态寄存器中)可包含(i)常数存储器44(或GPU存储器42)中的环绕式环形缓冲器的实例偏移,(ii)常数存储器44(或GPU存储器42)中的当前实例的实例偏移(例如,地址),(iii)每一波(高达最大数目个波)的用于标示所述特定波是否是将执行的实例的第一波的旗标,和(iv)标示每实例着色器前同步码已完成执行的旗标。
[0055] 着色器核心24可被配置成执行实例的着色器代码。着色器核心24可存取GPR 26、uGPR 27、常数存储器44和/或状态寄存器中所含的数据。GPR 26、uGPR 27、常数存储器44和/或状态寄存器可含有来自上文所论述的图形驱动器40或编译器38的状态信息。着色器核心24也可以存取情境(例如硬件状态)信息。上下文信息可含有从上文所论述的图形驱动器40或编译器38检索的数据。
[0056] 当图形驱动器40初始化新实例时,新实例事件可在启动实例的任何波之前从高级定序器(HLSQ)传送到着色器核心24,其可将像素发送到着色器核心24。HLSQ可将新实例事件传送到着色器核心24。新实例事件可初始化着色器核心24的状态变量。初始化状态变量可包含初始化以下中的一或多个:标示每实例着色器前同步码已完成执行的旗标为假;到环绕式环形缓冲器的实例头的值(例如,地址)的当前实例偏移;使环绕式环形缓冲器的实例头的值(例如,地址)递增将由加载单元加载到常数存储器44中的统一体的数目。在实例头的递增的值将变得大于分配给实例的常数RAM的大小(例如,环绕式环形缓冲器的大小)的情况下,实例头可设置为0(即,对应于环绕式环形缓冲器的开始的地址偏移)。
[0057] 当着色器核心24准备好执行特定实例的波时,着色器核心24确定所述波是否是实例的第一波。着色器核心可通过存取对应于当前波的第一波旗标来做出所述确定。如果所述波是实例的第一波,那么着色器核心24确定是否执行每实例着色器前同步码。着色器核心24可使用标示前同步码已(或尚未)执行的旗标做出此类确定。
[0058] 在一些实例中,着色器核心24上的标量处理器(例如,单个算术逻辑单元(ALU))可执行着色器前同步码。在其它实例中,着色器核心24的并行处理元件(有时称作向量处理器)可执行着色器前同步码。
[0059] 当着色器核心24确定每实例着色器前同步码尚未执行时,由着色器核心24内的并行处理元件(向量处理器)或着色器核心24内的标量处理器执行每实例着色器前同步码。着色器核心24对每实例着色器前同步码的执行可包含将所有或基本上所有统一体从UBO 46加载到常数存储器44(或在另一实例中,GPU存储器42)中。在每实例着色器前同步码的执行完成处,标示前同步码已(或尚未)执行的旗标设置为标示前同步码已经执行的状态。一旦旗标设置为标示每实例着色器前同步码已执行的标示旗标,着色器核心24便可指示(经由例如“唤醒”指令)所有波等待每实例着色器前同步码的执行以开始(或继续)执行主要着色器指令。
[0060] 当着色器核心24确定每实例着色器前同步码已经执行时,可(经由例如程序计数器的分支指令)跳过每实例着色器前同步码指令,且着色器核心24执行主要着色器代码部分。在执行主要着色器代码部分时,着色器核心24可经由存储在GPR 26或uGPR 27中的实例偏移存取统一体。实例偏移可为环绕式环形缓冲器内的偏移地址。着色器核心24可执行着色器代码以经由来源于实例偏移(存储在例如GPR 26中)的地址和特定统一体的统一偏移值,从常数RAM(例如,常数存储器44或GPU存储器42)读取值。
[0061] 环绕式环形缓冲器可保存多个实例的统一体。每一实例可在环形缓冲器中具有偏移。可使用两个索引检索特定统一体:实例偏移和统一索引。实例偏移可存储在uGPR 27中并且可用以检索环形缓冲器中的实例的偏移,且统一索引可用以找出实例的从所述偏移起始的统一段内部的特定统一体。所述偏移可存储在uGPR中以供主要着色器使用。
[0062] 图3是示出包含每实例着色器前同步码代码块39的指令集37的概念图。在此实例中,每实例着色器前同步码代码块39包括用于每实例着色器前同步码起始指令(per_instance_preamble_start)调用的shader_code的伪代码并且结尾为结束每实例着色器前同步码指令(end_preamble)。示出每实例着色器前同步码代码块39内的将常数(经由指令“ldck”)从源地址(src)加载到目的地地址(dst)的环路。这可允许常数从UBO 46加载到常数RAM(例如,在常数存储器44或GPU存储器42内)。可基于实例识别符(instance_id)乘以添加到特定统一识别符(i)的实例中的统一体的数目(FOOTPRINT)计算UBO 46内的源地址(src)(或源地址偏移)。着色器核心24可从寄存器(GPR 26中)检索由处理器12上的编译器38或图形驱动器40加载的实例中的统一体的数目(FOOTPRINT)。可基于添加到特定统一识别符(i)的GPR实例偏移(ugpr)计算目的地地址(dst)。着色器核心24可从寄存器(GPR 26中)检索编译器38或图形驱动器40加载的实例偏移(ugpr)。每实例着色器前同步码代码块
39可每实例仅执行单次。
[0063] 后续每实例着色器前同步码代码块39是主要着色器指令代码块41。主要着色器指令代码块41可使用从UBO 46加载到常数RAM(例如常数存储器44或GPU存储器42)的值。主要着色器指令代码块41包含从常数RAM(constantRAM[])读取经存储用于此特定实例(具有实例地址偏移(ugpr))、由着色器核心24执行并且由常数存储器44或GPU存储器42从统一GPR 27加载的偏移-th(offset-th)统一体的读取指令。
[0064] 图4是说明可用以实施用于实施本发明的每实例着色器前同步码的技术的GPU 14的实例配置的框图。GPU 14被配置成以并行方式执行程序的指令。GPU 14包含着色器核心24,其包含控制单元72(具有波调度器96)、处理元件74A-74D(统称为“处理元件74”)、指令存储装置76、数据存储装置78(包含GPR 26、uGPR 27和常数存储器44)、状态寄存器90、通信路径80、82、84、86A-86D。状态寄存器90可包含非通用寄存器,其包含在波之间保持持续但可在每一波完成之后重新设置GPR 26的硬件管理的内部状态寄存器。通信路径86A-86D可统称为“通信路径86”。在一些实例中,GPU 14可配置为单指令多数据(SIMD)处理系统,其被配置成使用处理元件74执行用于程序(例如,着色器)的波的执行的多个线程。在此类SIMD系统中,处理元件74可一起一次处理相对于不同数据项的单个指令。在完成执行与程序相关联的所有线程之后,可退出程序。
[0065] 状态寄存器90可包含数个寄存器以及从图形驱动器40或编译器38接收或由GPU 14基于GPU 14的硬件或设置确定的硬件状态。寄存器reg_instance_region_start可存储常数存储器44中的实例区域的偏移,所述常数存储器还可含有非实例区域(例如,在具有高达2047的值的基于11位vec4(即,可保存四个值的向量)的寄存器中)。寄存器reg_instance_footprint可存储标示常数存储器44中的统一体的数目并且可从图形驱动器40或编译器38接收的值(例如,在具有高达256(或4KB)的值的8位vec4寄存器中)。寄存器reg_instance_ram_size可存储标示将存储在常数存储器44中和/或当前存储在统一缓冲对象
46中的实例的所有统一体的存储器大小的值(例如,在具有高达2048(或32KB)的值的基于
12位vec4的寄存器中)。寄存器reg_max_waves_by_instance可存储能够放入常数存储器44内的经分配空间内的实例的数目的值(例如,具有高达16的值的5位寄存器),可由图形驱动器40或编译器38预计算所述值。寄存器reg_ugprID_for_instance_offset可存储保存实例的地址偏移的统一GPR(例如GPR 26内)的地址(或编号)。
[0066] 状态变量可存储在状态寄存器90中。状态变量instance_head可包含保存常数存储器44内的环绕式环形缓冲器的头地址偏移的12位值。在另一实例中,状态变量instance_head可保存对常数存储器44内的链表的头的指针。状态变量current_instance_offset可包含将当前实例偏移地址存储在常数存储器44中的12位值,其可在new_instance_event消息传送给着色器核心24之后初始化。状态变量first_wave[]是在波创建处设置的用以确定哪个波将是实例的第一波的1位旗标的变量数目(高达存储在reg_max_waves_by_instance中的数目,例如16)。当旗标值设置为真时,将首先执行对应波,其它波设置为假。状态变量preamble_done是表示已经执行每实例着色器前同步码且线程/波可开始执行的1位旗标。
[0067] 控制单元72经由通信路径80以通信方式耦合到指令存储装置76,经由通信路径82耦合到处理元件74,以及经由通信路径84耦合到数据存储装置78。控制单元72可使用通信路径80将读取指令发送到指令存储装置76。读取指令可指定指令存储装置76中的指令地址,根据所述地址应检索到指令。响应于发送读取指令,控制单元72可从指令存储装置76接收一或多个程序指令。控制单元72可从每实例着色器前同步码代码块39读取指令并且从指令存储装置76读取主要着色器指令代码块41。控制单元72可确定先前是否已经(经由存储在数据存储装置78的状态寄存器90中的旗标)执行每实例着色器前同步码。
[0068] 当控制单元72中的波调度器96确定处理波所需的资源可用时,可在着色器核心24内部创建波。
[0069] 当控制单元72从图形驱动器40或编译器38接收存在新绘制调用事件(即,发送new_context事件)的通知时,控制单元72将用寄存器reg_max_waves_by实例修改波容量。控制单元也可以将instance_head设置为0。在另一实例中,控制单元可将instance_head设置为reg_instance_region_start的值。
[0070] 图形驱动器40或编译器38可经由命令处理器或图元控制器警示控制单元72已经初始化新实例且应为所述实例分配常数存储器44。此警示可使用从HLSQ发送到控制单元72的new_instance_event事件。在接收到此警示后,控制单元72即刻可将preamble_done旗标初始化为假,将current_instance_offset状态变量初始化为instance_head状态变量的值,使instance_head状态变量递增reg_instance_footprint(以从分配给先前实例的存储器移动到新实例),并且在instance_head+reg_instance_footprint>=reg_instance_ram_size的情况下(即,在使实例头递增将大于或等于存储器中的总分配实例,将存储器的所述部分处理为环绕式环形缓冲器的情况下)将instance_head设置为0。
[0071] 可当控制单元72中的波调度器96确定波将需要的资源可用时发生波创建。可在驱动器将绘制命令发送到GPU之后,在GPU管线的一个阶段在着色器核心24中发生波创建。在波创建处,即,当控制单元72内的波调度器96产生wave_creation事件并且控制单元72初始化一或多个非驱动器编程的状态寄存器90时,可用当前实例偏移(状态变量current_instance_offset)设置保存实例的偏移(其可通过查找寄存器的值reg_ugprID_for_istance_offset来确定)的统一GPR 27。可在相同着色器程序的执行波之间需要保存当前实例偏移的uGPR 27,这是因为存储在GPR 26中的值在波之间经重新设置。如果新波是实例的第一波,那么控制单元72可将新波的first_wave旗标设置为真。否则,控制单元72可将first_wave旗标设置为假。
[0072] 控制单元72可使用通信路径82将指令提供到处理元件74,且在一些实例中,从处理元件74接收数据,例如用于评估分支条件的比较指令的结果。在一些实例中,控制单元72可使用通信路径84从数据存储装置78检索数据项值例如以确定分支条件。尽管图4将GPU 14说明为包含通信路径84,但在其它实例中,GPU 14可不包含通信路径84。
[0073] 着色器核心24的加载单元92可将常数加载到常数存储器44中。对着色器核心24的加载单元92的指令可在每实例着色器前同步码代码块39内找到并且可允许将常数从系统存储器16加载到片上(例如,GPU)常数存储器44。常数值可最初存储在系统存储器16中的常数缓存器中。加载单元92可经由来自控制单元72、编译器38和/或图形驱动器40的指令将来自系统存储器16中的常数缓存器的常数值加载到常数存储器44、uGPR 27或GPR 26。加载单元92可被配置成在常数存储器44中分配的空间为满的情况下将常数加载于uGPR 27中。
[0074] 处理元件74中的每一个可被配置成处理存储于指令存储装置76中的程序的指令。在一些实例中,处理元件74中的每一个可被配置成执行相同操作集合。举例来说,处理元件
74中的每一个可实施相同指令集架构(ISA)。在额外实例中,处理元件74中的每一个可为算术逻辑单元(ALU)。在另外的实例中,GPU 14可被配置成向量处理器,且处理元件74中的每一个可为向量处理器内的处理元件。在额外实例中,GPU 14可为SIMD执行单元,且处理元件
74中的每一个可为SIMD执行单元内的SIMD处理元件。
[0075] 由处理元件74所执行的操作可包含算术操作、逻辑操作、比较操作等。算术操作可包含例如加法操作、减法操作、乘法操作等的操作。算术操作还可包含例如整数算术操作和/或浮点算术操作。逻辑操作可包含例如逐位AND操作、逐位OR操作、逐位XOR操作等操作。比较操作可包含例如大于操作、小于操作、等于零操作、不等于零操作等操作。大于操作和小于操作可确定第一数据项是否大于或小于第二数据项。等于零操作和不等于零操作可确定数据项是否等于零或不等于零。用于操作的操作数可存储于数据存储装置78中所含有的寄存器中。
[0076] 处理元件74中的每一个可被配置成以响应于经由通信路径82从控制单元72接收到指令而执行操作。在一些实例中,处理元件74中的每一个可被配置成独立于其它处理元件74而被激活和/或去激活。在此类实例中,处理元件74中的每一个可被配置成当相应处理元件74A-74D被激活时,响应于从控制单元72接收到指令而执行操作,并且当相应处理元件74A-74D被去激活(即,不激活)时,响应于从控制单元72接收到指令而不执行所述操作。
[0077] 处理元件74A-74D中的每一个可经由相应通信路径86A-86D以通信方式连接到数据存储装置78(包含存取状态寄存器90、GPR 26和常数存储器44)。处理元件74可被配置成经由通信路径86从数据存储装置78检索数据且将数据存储到数据存储装置78。在一些实例中,从数据存储装置78所检索到的数据可为用于由处理元件74所执行的操作的操作数。在一些实例中,存储到数据存储装置78的数据可为由处理元件74所执行的操作的结果。
[0078] 指令存储装置76被配置成存储程序以供GPU 14执行。所述程序可存储为指令序列。这些指令可包含每实例着色器前同步码代码块39和主要着色器指令代码块41。在一些实例中,每一指令可通过唯一指令地址值定地址。在此类实例中,指令序列中的稍后指令的指令地址值大于指令序列中的先前指令的指令地址值。在一些实例中,程序指令可为机器级指令。也就是说,在此类实例中,指令可呈对应于GPU 14的ISA的格式。指令存储装置76被配置成经由通信路径80从控制单元72接收读取指令。读取指令可指定指令地址,应根据所述地址检索到指令。响应于接收读取指令,指令存储装置76可经由通信路径80将对应于读取指令中所指定的指令地址的指令提供到控制单元72。
[0079] 指令存储装置76可为任何类型的存储器、高速缓冲存储器或其组合。当指令存储装置76为高速缓冲存储器时,指令存储装置76可高速缓存存储于GPU 14外部的程序存储器中的程序。尽管指令存储装置76经说明为在GPU 14内,但在其它实例中,指令存储装置76可在GPU 14外部。
[0080] 数据存储装置78被配置成存储供处理元件74使用的数据项。在一些实例中,数据存储装置78可包括多个寄存器(例如GPR 26或uGPR 27中),每一寄存器被配置成存储在GPU 14上操作的多个数据项内的相应数据项。数据存储装置78可耦合到一或多个通信路径(未示出),其被配置成在数据存储装置78中的寄存器和存储器(例如常数存储器44)或高速缓冲存储器(未示出)之间转移数据。状态寄存器90(或替代地,数据存储装置78)可存储供控制单元72和处理元件74使用的数个旗标和状态变量。
[0081] 尽管图4说明用于存储供处理元件74使用的数据的单个数据存储装置78,但在其它实例中,GPU 14可包含用于处理元件74中的每一个的独立的专用数据存储器。出于示范性目的,GPU 14说明四个处理元件74。在其它实例中,GPU 14可具有呈相同或不同配置的更多个处理元件。
[0082] 控制单元72被配置成控制GPU 14执行存储在指令存储装置76中的程序的指令。对于程序的每一指令或指令集,控制单元72可从指令存储装置76经由通信路径80检索所述指令,并且处理所述指令。在一些实例中,控制单元72可通过使得对处理元件74中的一或多个执行与指令相关联的操作而处理所述指令。举例来说,通过控制单元72所检索到的指令可为算术指令,其指示GPU 14执行关于由指令指定的数据项的算术操作;且控制单元72可致使处理元件74中的一或多个对指定数据项执行算术操作。在另外的实例中,控制单元72可在无需致使对处理元件74执行操作的情况下处理所述指令。
[0083] 控制单元72可通过经由通信路径82将指令提供到处理元件74而致使对处理元件74中的一或多个执行操作。所述指令可指定通过处理元件74执行的操作。提供到处理元件
74中的一或多个的指令可与从指令存储装置76所检索到的指令相同或不同。在一些实例中,控制单元72可通过激活特定子集的处理元件74(在此之后应执行操作)和去激活另一子集的处理元件74(在此之后不应执行操作)中的一个或两个而致使对特定子集的处理元件
74(包含单个处理元件)执行操作。控制单元72可通过经由通信路径82将相应激活和/或去激活信号提供到处理元件74中的每一个而激活和/或去激活处理元件74。在一些实例中,控制单元72可通过将激活和/或去激活信号提供到处理元件74以及将指令提供到处理元件74而激活和/或去激活处理元件74。在另外的实例中,控制单元72可在将指令提供到处理元件
74之前激活和/或去激活处理元件74。
[0084] 控制单元72可使用处理元件74执行程序的多个执行线程。将并行地执行的多个线程有时被称为波或线程束。处理元件74中的每一个可被配置成针对多个线程中的相应线程而处理程序指令。举例来说,控制单元72可将每一执行线程分配到处理元件74中的个别者以供处理。相对于数据项集合中的不同数据项,程序的执行线程可执行相同指令集。举例来说,处理元件74A可关于多个数据项中的第一数据项子集执行存储于指令存储装置76中的程序的第一执行线程,且处理元件74B可关于多个数据项中的第二数据项子集执行存储于指令存储装置76中的程序的第二执行线程。第一执行线程可与第二执行线程包含相同指令,但第一数据项子集可不同于第二数据项子集。处理元件74可执行主要着色器指令代码块41。处理元件74可执行每实例着色器前同步码代码块39。在一个实例中,每实例着色器前同步码代码块39和主要着色器指令代码块41并行地存储(无需任何定界符)在指令存储装置76中。在另一实例中,着色器核心24可使用独立标量处理单元94经由通信路径88执行每实例着色器前同步码代码块39。
[0085] 标量处理单元94可以是被配置成一次对一个数据项进行操作的任何类型的处理器。与处理元件74相似,标量处理单元94可包含ALU。由标量处理单元94所执行的操作可包含算术操作、逻辑操作、比较操作等。算术操作可包含例如加法操作、减法操作、乘法操作、除法操作等的操作。算术操作还可包含例如整数算术操作和/或浮点算术操作。逻辑操作可包含例如逐位AND操作、逐位OR操作、逐位XOR操作等操作。比较操作可包含例如大于操作、小于操作、等于零操作、不等于零操作等操作。大于操作和小于操作可确定第一数据项是否大于或小于第二数据项。等于零操作和不等于零操作可确定数据项是否等于零或不等于零。用于操作的操作数可存储于数据存储装置78中所含有的寄存器中。
[0086] 每波指令调度器96可创建和管理波,包含指配波识别符,将GPR分配给处理元件74,管理波状态转变,从多个波选择将运行的波,以及更新波的程序计数器。
[0087] 在波执行处,控制单元72和/或每波指令调度器96可将处理元件74调度给存储在指令存储装置76中的每一处理着色器代码。当着色器代码包含每实例着色器前同步码代码块39时,处理元件74(或控制单元72或每波指令调度器96)将执行per_instance_preamble_start或branch_if_not_first_wave指令。per_instance_preamble_start指令将检查当前波的波识别符(wave_id)是否是实例的第一波(通过例如检查first_wave[wave_id]状态变量)。如果当前波是实例的第一波,那么指令调度器96将使程序计数器递增到下一线以执行每实例着色器前同步码,否则,程序计数器将递增到每实例着色器前同步码代码块39的结尾(例如,到着色器程序的主要着色器指令代码块41)并且执行wait_until_instance_preamble_done指令,其等待仅在设置preamble_done旗标之后,即,在每实例着色器前同步码已完成执行之后,执行主要着色器指令代码块41。在一个实例中,每波指令调度器96将安排标量处理单元94执行每实例着色器前同步码。在另一实例中,每实例着色器前同步码由处理元件74中的一个执行。
[0088] 在主要着色器指令代码块41执行时,可从常数存储器44中的环绕式环形缓冲器检索统一体。可通过具有当前实例偏移(ugpr)和特定统一体(偏移(offset))的偏移的uGPR值(存储在uGPR 27中)获得常数存储器44中的地址。
[0089] 图5是说明根据本发明的技术的实例方法的流程图。图5的技术可由GPU 14和/或处理器12(参看图1和2)中的一或多个实施。
[0090] 在本发明的一个实例中,GPU 14可被配置成从着色器编译器接收实例的实例识别符(即,几何实例、网格实例或对象实例)以及包括每实例着色器前同步码代码块39和主要着色器指令代码块41的着色器程序(100)。每实例着色器前同步码代码块39可为可执行的以将多个实例统一体存储在常数存储器44中。常数存储器44可含有存储实例统一体的环绕式环形缓冲器。在另一实例中,常数存储器44也可以含有存储实例统一体的链表。
[0091] GPU 14可进一步被配置成在多个波中的波的创建处将实例识别符指配给通用寄存器(102)。GPU 14可进一步被配置成为实例统一体分配常数存储器44内的地址空间(104)。GPU 14可进一步被配置成每实例着色器前同步码代码块39尚未执行且所述波是将执行的实例的第一波(106)。每实例着色器前同步码代码块39尚未执行的确定可基于旗标的值(例如,preamble_done旗标具有为假的值)。所述波是将执行的实例的第一波的确定可基于旗标的值(例如,first_wave[wave_id]旗标具有为真的值)。
[0092] GPU 14可进一步被配置成至少部分地基于确定每实例着色器前同步码代码块39尚未执行且所述波是将执行的实例的第一波,执行每实例着色器前同步码代码块39以将多个实例统一体存储在常数存储器44中(108)。多个实例统一体的存储可包含通过GPU 14基于实例识别符和实例中的编号统一体确定统一缓冲对象46中的多个实例统一体中的实例统一体的源地址。此外,多个实例统一体的存储可包含通过GPU 14确定常数存储器中的多个实例统一体中的实例统一体的目的地地址。多个实例统一体的存储还可包含通过GPU 14至少部分地基于所确定的源地址和所确定的目的地地址,存储多个实例统一体中的实例统一体。
[0093] GPU 14可进一步被配置成至少部分地基于执行每实例着色器前同步码代码块39,使用存储在常数存储器44中的多个实例常数中的至少一个执行多个波中的波(110)。
[0094] 在第二波创建处,GPU 14可在多个波中的第二波的创建处将实例识别符指配给通用寄存器。此指配可因为可在波之间清除通用寄存器(例如GPR 26)而发生。GPU 14可确定第二波不是实例的第一波。至少部分地基于所述确定所述第二波不是实例的第一波以及确定前同步码块尚未执行,GPU 14可被配置成等待前同步码块完成执行。至少部分地基于所述确定所述实例的所述第二波不是实例的第一波以及所述确定所述前同步码块已经执行,GPU 14可被配置成使用存储在常数存储器中的实例常数执行实例的多个波中的第二波。
[0095] 在一或多个实例中,所描述的功能可用硬件、软件、固件或其任何组合来实施。如果用软件实施,那么所述功能可以作为一或多个指令或代码在计算机可读媒体上存储或传输,并且由基于硬件的处理单元执行。计算机可读媒体可包含计算机可读存储媒体,其对应于例如数据存储媒体等有形媒体。以此方式,计算机可读媒体通常可以对应于非暂时性的有形计算机可读存储媒体。数据存储媒体可以是可由一或多个计算机或一或多个处理器存取以检索用于实施本发明中描述的技术的指令、代码和/或数据结构的任何可用媒体。计算机程序产品可包含计算机可读媒体。
[0096] 借助于实例而非限制,此类计算机可读存储媒体可包括RAM、ROM、EEPROM、CD-ROM或其它光盘存储装置、磁盘存储装置或其它磁性存储装置、快闪存储器,或可用以存储呈指令或数据结构形式的所要程序代码且可由计算机存取的任何其它媒体。应理解,计算机可读存储媒体和数据存储媒体并不包含载波、信号或其它暂时性媒体,而是替代地涉及非暂时性有形存储媒体。如本文中所使用,磁盘和光盘包含压缩光盘(CD)、激光光盘、光学光盘、数字多功能光盘(DVD)、软性磁盘和蓝光光盘,其中磁盘通常以磁性方式再现数据,而光盘用激光以光学方式再现数据。以上各项的组合也应包含于计算机可读媒体的范围内。
[0097] 指令可以由一或多个处理器执行,所述一或多个处理器例如是一或多个数字信号处理器(DSP)、通用微处理器、专用集成电路(ASIC)、现场可编程逻辑阵列(FPGA)或其它等效的集成或离散逻辑电路。因此,如本文中所使用的术语“处理器”可指代上述结构或适用于实施本文中所描述的技术的任何其它结构中的任一个。另外,在一些方面中,本文中所描述的功能性可在被配置成用于编码和解码的专用硬件和/或软件模块内提供,或并入在组合编解码器中。并且,所述技术可完全实施于一或多个电路或逻辑元件中。
[0098] 本发明的技术可实施于包含无线手持机、集成电路(IC)或IC的集合(例如,芯片组)的多种装置或设备中。本发明中描述各种组件、模块或单元是为了强调被配置成执行所揭示的技术的装置的功能方面,但未必需要通过不同硬件单元实现。确切地,如上文所描述,各种单元可结合合适的软件和/或固件组合在编解码器硬件单元中,或由互操作硬件单元的集合来提供,所述硬件单元包含如上文所描述的一或多个处理器。
[0099] 已描述了各种实例。这些和其它实例在所附权利要求书的范围内。