对端口减少的通用寄存器的操作数冲突解决的方法和装置转让专利

申请号 : CN201580052354.3

文献号 : CN106716346B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 杜云尚洪江朱海坤

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

摘要 :

本发明描述了用于确定指令的执行是否将需要从通用寄存器GPR的存储器单元中读取与所述存储器单元的读取端口将允许的值相比更多的值的技术。在此情况下,所述技术在所述指令的执行之前可以将来自所述存储器单元中的一或多个值存储在单独的冲突队列中。在执行所述指令以实施由所述指令限定的运算期间,将从所述存储器单元中读取作为所述运算的操作数的一个值并且将从所述冲突队列中读取作为所述其它运算的操作数的另一个值。

权利要求 :

1.一种处理值的方法,所述方法包括:

确定指令的执行是否将引起从通用寄存器GPR的多个存储器单元的第一存储器单元中同时读取与所述第一存储器单元的读取端口可以输出的值相比更多的值,其中存储在所述第一存储器单元中的值无法通过所述GPR的其它存储器单元中的任一者存取;

在所述指令的执行之前,基于确定所述指令的执行将引起从所述第一存储器单元中同时读取与所述第一存储器单元的所述读取端口可以输出的值相比更多的值而将存储在所述第一存储器单元中的一或多个值存储在与所述GPR分离的冲突队列中;

通过将子指令包含在所述指令中来修改所述指令以从所述GPR的第二存储器单元中读取至少一个值,其中所述第二存储器单元与所述第一存储器单元不同,且其中来自所述GPR的所述第二存储器单元的所述至少一个值是用于随后指令的操作数;

执行所述经修改的指令以实施运算,所述指令使用来自所述第一存储器单元的至少一个值和来自所述冲突队列的至少一个值作为操作数,其中执行所述经修改的指令包括执行从所述GPR的所述第二存储器单元中读取所述至少一个值的所述子指令;

将来自所述GPR的所述第二存储器单元的所述至少一个值存储在处理元件的预提取队列中;以及基于存储在所述处理元件的所述预提取队列中的所述至少一个值执行所述随后指令。

2.根据权利要求1所述的方法,其进一步包括:

在所述经修改的指令的执行期间从所述第一存储器单元中读取所述至少一个值并且从所述冲突队列中读取所述至少一个值。

3.根据权利要求1所述的方法,其进一步包括:

当执行所述随后指令时从所述预提取队列中读取以实施由所述随后指令限定的运算。

4.根据权利要求1所述的方法,其中修改所述指令包括修改所述子指令以从所述GPR的所述第二存储器单元中读取所述至少一个值,前提是并未使用所述GPR的全部端口以及并未使用所述第二存储器单元的读取端口。

5.根据权利要求1所述的方法,其中将存储在所述第一存储器单元中的所述一或多个值存储在所述冲突队列中包括:确定当所述GPR的全部读取端口并未使用时以及当一或多个值并非从所述第一存储器单元中读取时的情形;以及在所述所确定的情形期间将存储在所述第一存储器单元中的所述一或多个值存储在所述冲突队列中。

6.根据权利要求1所述的方法,其中所述GPR中的所述存储器单元中的每一个包括仅一个读取端口和仅一个写入端口。

7.根据权利要求1所述的方法,其中存储所述一或多个值包括基于确定所述指令的执行将引起从所述第一存储器单元中同时读取与所述第一存储器单元的所述读取端口可以输出的值相比更多的值而将存储在所述第一存储器单元中的所述一或多个值存储在处理元件的所述冲突队列中。

8.一种用于处理值的装置,所述装置包括:

通用寄存器GPR,所述通用寄存器包括多个存储器单元,所述多个存储器单元包括具有读取端口的第一存储器单元,其中存储在所述第一存储器单元中的值无法通过所述GPR的其它存储器单元中的任一者存取;以及图形处理单元GPU,其经配置以进行以下操作:

确定指令的执行是否将引起从所述第一存储器单元中同时读取与所述第一存储器单元的所述读取端口可以输出的值相比更多的值;

在所述指令的执行之前,基于确定所述指令的执行将引起从所述第一存储器单元中同时读取与所述第一存储器单元的所述读取端口可以输出的值相比更多的值而将存储在所述第一存储器单元中的一或多个值存储在与所述GPR分离的冲突队列中;

通过将子指令包含在所述指令中来修改所述指令以从所述GPR的第二存储器单元中读取至少一个值,其中所述第二存储器单元与所述第一存储器单元不同,且其中来自所述GPR的所述第二存储器单元的所述至少一个值是用于随后指令的操作数;

执行所述经修改的指令以实施运算,所述指令使用来自所述第一存储器单元的至少一个值和来自所述冲突队列的至少一个值作为操作数,其中为了执行所述经修改的指令,所述GPU经配置以执行从所述GPR的所述第二存储器单元中读取所述至少一个值的所述子指令;

将来自所述GPR的所述第二存储器单元的所述至少一个值存储在处理元件的预提取队列中;以及基于存储在所述处理元件的所述预提取队列中的所述至少一个值执行所述随后指令。

9.根据权利要求8所述的装置,其中所述GPU包括所述GPR,并且其中所述GPU包括处理元件,所述处理元件包括所述冲突队列。

10.根据权利要求8所述的装置,其中所述GPU经配置以在所述经修改的指令的执行期间从所述第一存储器单元中读取所述至少一个值并且从所述冲突队列中读取所述至少一个值。

11.根据权利要求8所述的装置,其中所述GPU经配置以从所述预提取队列中读取以在执行所述随后指令时实施由所述随后指令限定的运算。

12.根据权利要求8所述的装置,其中为了修改所述指令,所述GPU经配置以修改所述子指令以从所述GPR的所述第二存储器单元中读取所述至少一个值,前提是并未使用所述GPR的全部端口以及并未使用所述第二存储器单元的读取端口。

13.根据权利要求8所述的装置,其中为了将存储在所述第一存储器单元中的所述一或多个值存储在所述冲突队列中,所述GPU经配置以进行以下操作:确定当所述GPR的全部读取端口并未使用时以及当一或多个值并非从所述第一存储器单元中读取时的情形;以及在所述所确定的情形期间将存储在所述第一存储器单元中的所述一或多个值存储在所述冲突队列中。

14.根据权利要求8所述的装置,其中所述GPR中的所述存储器单元中的每一个包括仅一个读取端口和仅一个写入端口。

15.一种上面存储有指令的计算机可读存储媒体,所述指令在由一或多个处理器执行时使得所述一或多个处理器进行以下操作:确定指令的执行是否将引起从通用寄存器GPR的多个存储器单元的第一存储器单元中同时读取与所述第一存储器单元的读取端口可以输出的值相比更多的值,其中存储在所述第一存储器单元中的值无法通过所述GPR的其它存储器单元中的任一者存取;

在所述指令的执行之前,基于确定所述指令的执行将引起从所述第一存储器单元中同时读取与所述第一存储器单元的所述读取端口可以输出的值相比更多的值而将存储在所述第一存储器单元中的一或多个值存储在与所述GPR分离的冲突队列中;

通过将子指令包含在所述指令中来修改所述指令以从所述GPR的第二存储器单元中读取至少一个值,其中所述第二存储器单元与所述第一存储器单元不同,且其中来自所述GPR的所述第二存储器单元的所述至少一个值是用于随后指令的操作数;

执行所述经修改的指令以实施运算,所述指令使用来自所述第一存储器单元的至少一个值和来自所述冲突队列的至少一个值作为操作数,其中致使所述一或多个处理器执行所述经修改的指令的指令包括致使所述一或多个处理器执行从所述GPR的所述第二存储器单元中读取所述至少一个值的所述子指令的指令;

将来自所述GPR的所述第二存储器单元的所述至少一个值存储在处理元件的预提取队列中;以及基于存储在所述处理元件的所述预提取队列中的所述至少一个值执行所述随后指令。

16.根据权利要求15所述的计算机可读存储媒体,其进一步包括指令,所述指令使得所述一或多个处理器进行以下操作:在所述经修改的指令的执行期间从所述第一存储器单元中读取所述至少一个值并且从所述冲突队列中读取所述至少一个值。

17.根据权利要求15所述的计算机可读存储媒体,其中使得所述一或多个处理器将存储在所述第一存储器单元中的所述一或多个值存储在所述冲突队列中的所述指令包括使得所述一或多个处理器进行以下操作的指令:确定当所述GPR的全部读取端口并未使用时以及当一或多个值并非从所述第一存储器单元中读取时的情形;以及在所述所确定的情形期间将存储在所述第一存储器单元中的所述一或多个值存储在所述冲突队列中。

18.根据权利要求15所述的计算机可读存储媒体,其中所述GPR中的所述存储器单元中的每一个包括仅一个读取端口和仅一个写入端口。

19.根据权利要求15所述的计算机可读存储媒体,其中使得所述一或多个处理器存储所述一或多个值的所述指令包括如下指令,所述指令使得所述一或多个处理器基于确定所述指令的执行将引起从所述第一存储器单元中同时读取与所述第一存储器单元的所述读取端口可以输出的值相比更多的值而将存储在所述第一存储器单元中的所述一或多个值存储在处理元件的所述冲突队列中。

20.一种用于处理值的装置,所述装置包括:

通用寄存器GPR,所述通用寄存器包括多个存储器单元,所述多个存储器单元包括具有读取端口的第一存储器单元,其中存储在所述第一存储器单元中的值无法通过所述GPR的其它存储器单元中的任一者存取;以及图形处理单元GPU,其包括:

用于确定指令的执行是否将引起从所述第一存储器单元中同时读取与所述第一存储器单元的所述读取端口可以输出的值相比更多的值的装置;

用于在所述指令的执行之前基于确定所述指令的执行将引起从所述第一存储器单元中同时读取与所述第一存储器单元的所述读取端口可以输出的值相比更多的值而将存储在所述第一存储器单元中的一或多个值存储在与所述GPR分离的冲突队列中的装置;

用于通过将子指令包含在所述指令中来修改所述指令以从所述GPR的第二存储器单元中读取至少一个值的装置,其中所述第二存储器单元与所述第一存储器单元不同,且其中来自所述GPR的所述第二存储器单元的所述至少一个值是用于随后指令的操作数;

用于执行所述经修改的指令以实施运算的装置,所述指令使用来自所述第一存储器单元的至少一个值和来自所述冲突队列的至少一个值作为操作数,其中所述用于执行所述经修改的指令的装置包括用于执行从所述GPR的所述第二存储器单元中读取所述至少一个值的所述子指令的装置;

用于将来自所述GPR的所述第二存储器单元的所述至少一个值存储在处理元件的预提取队列中的装置;以及用于基于存储在所述处理元件的所述预提取队列中的所述至少一个值执行所述随后指令的装置。

说明书 :

对端口减少的通用寄存器的操作数冲突解决的方法和装置

技术领域

[0001] 本发明涉及数据存储,且更确切地说涉及寄存器中的数据存储技术。

背景技术

[0002] 例如图形处理单元(GPU)的处理单元包括处理元件和通用寄存器(GPR),所述通用寄存器存储用于执行指令的数据。在一些实例中,处理元件执行用于处理一项数据的指令,并且相应的处理元件在GPR中存储这项数据或者来自处理的所述项的所得数据。一项数据可以是发生处理的基础单位。举例来说,在图形处理中,图元的顶点是项目的一个实例,并且像素是项目的另一实例。存在与每个顶点和像素相关联的图形数据(例如,坐标、色彩值等)。处理元件的处理器核心内可存在多个处理元件,从而允许指令的并行执行(例如,多个处理元件在同一时间执行相同指令)。

发明内容

[0003] 一般而言,本发明描述了用于在执行之前解决操作数冲突的技术,其中此类操作数冲突可出现在通用寄存器(GPR)中,所述通用寄存器包括具有极少写入/读取端口(例如,一个写入端口和一个读取端口)的多个存储器单元。包括多个存储器单元的GPR的设计(每个存储器单元具有极少的写入/读取端口)可以是可缩放的以用于各种类型的电路和技术。然而,由于每个存储器单元的有限数目的写入/读取端口,操作数冲突可引起其中多个值是同时从同一存储器单元中读取或写入到同一存储器单元的。换句话说,在指令的执行可引起从存储器单元中同时(例如,并行)读取与存储器单元的读取端口可以输出的值相比更多的值时产生操作数冲突。
[0004] 根据在本发明中所描述的技术,如果多个值是将同时从同一存储器单元中读取的,那么在指令的执行之前控制器可将存储在存储器单元中的值中的至少一个存储在冲突队列中以避免从存储器单元中同时读取与第一存储器单元的读取端口可以支持的值相比更多的值。举例来说,如果存储器单元仅包括一个读取端口并且如果指令的执行将引起从读取端口中同时读取一个以上的值,那么在指令的执行之前控制器可以将来自存储 器单元的值存储在冲突队列中,使得在指令的执行期间仅从存储器单元中读取一个值并且从冲突队列中读取其它值,进而避免了操作数冲突。
[0005] 在一个实例中,本发明描述了一种处理值的方法,所述方法包括:确定指令的执行是否将引起从通用寄存器(GPR)的多个存储器单元的第一存储器单元中同时读取与第一存储器单元的读取端口可以输出的值相比更多的值,其中在指令的执行之前存储在第一存储器单元中的值无法通过GPR的其它存储器单元中的任一者存取;基于确定指令的执行将引起从第一存储器单元中同时读取与第一存储器单元的读取端口可以输出的值相比更多的值而将存储在第一存储器单元中的一或多个值存储在与GPR分离的冲突队列中;并且执行指令以实施由指令限定的运算,所述指令使用来自第一存储器单元的至少一个值和来自冲突队列的至少一个值作为操作数。
[0006] 在一个实例中,本发明描述了一种用于处理值的装置,所述装置包括:通用寄存器(GPR),所述通用寄存器包括多个存储器单元,所述多个存储器单元包括具有读取端口的第一存储器单元,其中存储在所述第一存储器单元中的值无法通过GPR的其它存储器单元中的任一者存取;以及图形处理单元(GPU)。GPU经配置以确定指令的执行是否将引起从第一存储器单元中同时读取与第一存储器单元的读取端口可以输出的值相比更多的值,在指令的执行之前基于确定指令的执行将引起从第一存储器单元中同时读取与第一存储器单元的读取端口可以输出的值相比更多的值而将存储在第一存储器单元中的一或多个值存储在与GPR分离的冲突队列中,并且执行所述指令以实施由所述指令限定的运算,所述指令使用来自第一存储器单元的至少一个值和来自冲突队列的至少一个值作为操作数。
[0007] 在一个实例中,本发明描述了一种计算机可读存储媒体,所述计算机可读存储媒体具有存储在其上的指令,在由一或多个处理器执行所述指令时使得一或多个处理器确定指令的执行将是否引起从通用寄存器(GPR)的多个存储器单元的第一存储器单元中同时读取与第一存储器单元的读取端口可以输出的值相比更多的值,其中存储在第一存储器单元中的值无法通过GPR的其它存储器单元中的任一者存取,在指令的执行之前基于确定指令的执行将引起从第一存储器单元中同时读取与第一存储器单元的读取端口可以输出的值相比更多的值而将存储在第一存储器单元中的一或多个值存储在与GPR分离的冲突队列中,并且执行所述指令以实施由所述指令限定的运算,所述指令使用来自第一存储器单元的至少一个值和来自冲突队列的至少一个值作为操作数。
[0008] 在一个实例中,本发明描述了一种用于处理值的装置,所述装置包括:通用寄存器(GPR),所述通用寄存器包括多个存储器单元,所述多个存储器单元包括具有读取端口 的第一存储器单元,其中存储在所述第一存储器单元中的值无法通过GPR的其它存储器单元中的任一者存取;以及图形处理单元(GPU)。所述GPU包括:用于确定指令的执行是否将引起从第一存储器单元中同时读取与第一存储器单元的读取端口可以输出的值相比更多的值的装置;用于在指令的执行之前基于确定指令的执行将引起从第一存储器单元中同时读取与第一存储器单元的读取端口可以输出的值相比更多的值而将存储在第一存储器单元中的一或多个值存储在与GPR分离的冲突队列中的装置,以及用于执行所述指令以实施由指令限定的运算的装置,所述指令使用来自第一存储器单元的至少一个值和来自冲突队列的至少一个值作为操作数。
[0009] 在附图及以下描述中阐述一或多个实例的细节。其它特征、目标和优点将从所述描述、图式以及权利要求书显而易见。

附图说明

[0010] 图1是说明根据本发明中所描述的一或多个实例技术的用于处理数据的实例装置的框图。
[0011] 图2A是说明具有单个多端口存储器单元的通用寄存器(GPR)的实例的框图。
[0012] 图2B是说明存储在图2A的GPR的单个多端口存储器单元中的操作数值的概念图。
[0013] 图3A是说明具有多个单个写入、单个读取存储器单元的通用寄存器(GPR)的实例的框图。
[0014] 图3B是说明存储在图3A的GPR的多个单个写入、单个读取存储器单元中的操作数值的概念图。
[0015] 图4是说明图形处理单元(GPU)的着色器核心的一个实例的框图。
[0016] 图5是说明根据本发明中所描述的一或多个实例的操作的实例方法的流程图。

具体实施方式

[0017] 例如经配置以并行执行许多操作(例如,在同一时间)的图形处理单元(GPU)的并行处理单元包括一或多个处理器核心(例如,用于GPU的着色器核心),所述处理器核心执行一或多个程序的指令。为易于描述,相对于GPU或通用GPU(GPGPU)描述本发明中所描述的技术。然而,本发明中描述的技术可以扩展到未必是GPU或GPGPU的并行处理单元,以及非并行处理单元(例如,未专门配置成用于并行处理的非并行处理单元)。
[0018] GPU包括用于值存储的一或多个通用寄存器(GPR),所述值例如用于在GPU上执行指令的输入值(被称作操作数或操作数值)或通过指令的执行而产生的输出值。在一些情 况下,从一个指令中产生的输出值变为到随后指令的输入值(例如,操作数值)。
[0019] 实施多线程系统的GPU倾向于包括多个读取/写入端口GPR。作为实例,GPR可以包括四个以上端口,例如,四个写入端口和四个读取端口(4W4R),以用于总共八个端口。举例来说,为了提供并行处理能力,GPU可经配置以并行执行相同程序(被称作着色器)的多个实例。程序的一个实例的一个指令被称作线程。具有多端口GPR可以通过减少线程寿命周期允许具有增大的资源利用率的高效着色器执行。举例来说,在4W4R GPR实例中,四个线程能够同时读取操作数值,引起较少线程等待能够从GPR中读取。
[0020] 设计GPR的一种方式是通过具有多个读取/写入端口的单个存储器单元。举例来说,存储器单元可以被认为是可以水平地存储n位并且垂直地存储m位(即,n位宽度和m位深度)的二维存储器单元。作为一个实例,GPR可以包括256位深度和128位宽度(即,256x128)的单个存储器单元。在此实例中,存储器单元可以配置有两个写入端口和四个读取端口(2W4R)。
[0021] 多端口单个存储器单元GPR通常设计用于特定电路。举例来说,2W4R单个存储器单元GPR可很好地适用于特定类型的GPU,所述GPR使用四个读取端口以用于具有三个操作数的算术逻辑单元(ALU)、基本功能单元(EFU)、纹理样本单元、存储器负载/存储单元以及输出单元,并且使用两个写入端口以用于写入ALU、EFU、纹理样本单元、存储器负载/存储单元以及输入单元的结果。多端口单个存储器单元GPR的好处中的一个是多个单元可以同时存取数据。举例来说,待读取的值可以从四个端口中的任一者中读取。
[0022] 然而,使用经设计以用于特定电路的此类多端口单个存储器单元GPR存在缺点。作为一个实例,每个位的区域和电力成本是相对较高的。每个位的区域和电力成本可被认为是处理数字位所需的晶体管的数目的量度。
[0023] 并且,由于此类多端口单个存储器单元GPR经设计以用于特定电路,GPR可以没有充分迁移。举例来说,由于晶体管技术的变化,GPR结构可能没有充分的缩放。作为另一实例,此类多端口单个存储器单元GPR作为基础存储器块可能没有充分起作用,所述基础存储器块可用于形成很好地适用于另一个电路的GPR。举例来说,关于具有四个读取端口和两个写入端口的256深度、128宽度的单个存储器单元GPR的设计作为基础块可能没有充分起作用,从所述基础块中可以形成很好地适用于不同电路的GPR。
[0024] 本发明描述包括多个不同的单独的标准存储器单元(被称作宏或存储体)的GPR,所述存储器单元具有与输入和输出交叉开关一起形式GPR的有限的读取/写入端口。在本发明的GPR中的标准存储器单元可以为可用于形成各种类型的GPR的基础构建块。作 为一个实例,每个存储器单元可以为单个写入/单个读取(即,仅包括一个写入端口且仅包括一个读取端口(1W1R)),然而,其它数目的端口也是可能的,但是通常小于例如2W4R的常规的大小。
[0025] 并且,每个存储器单元可经配置以存储与特定设计的存储器单元相比较少的值。举例来说,在设计以用于特定电路的GPR的以上实例中,存储器单元为256位深度和128位宽度。在一些实例中,根据本发明中所描述的实例的GPR的存储器单元可以为64位深度和128位宽度。在此实例中,四个64位深度×128位宽度的存储器单元一起存储与一个256位深度×128位宽度的存储器单元所存储的一样多的数据。
[0026] 以此方式,本发明的GPR可被认为是被分成具有部分容量的多个存储器单元的专门设计的GPR。举例来说,在以上实例中,64位深度×128位宽度的每个存储器单元具有256位深度×128位宽度的存储器单元的容量的四分之一。
[0027] 此外,本发明的GPR可以包括输入和输出交叉开关。所述输入交叉开关可被认为是将写入到存储器单元的单元与存储器单元互连的开关。所述输出交叉开关可被认为是将从存储器单元中读取的单元与存储器单元互连的开关。
[0028] 举例来说,为了模拟具有四个读取/两个写入的256位深度×128位宽度的单个存储器单元GPR,根据本发明的GPR包括四个64位深度×128位宽度的存储器单元。GPR还包括4×4个输出交叉开关使得可以在四个存储器单元上执行四个读取,并且包括2x4个输入交叉开关使得可以在四个存储器单元上执行两个写入。
[0029] 虽然使用具有较少端口和交叉开关的较小存储器单元使得易于迁移,但是可能存在某些限制。举例来说,因为存储器单元中的每一个是不同的且单独的,所以存储在存储器单元中的一个中的值可以仅从该存储器单元的端口中可读取。在这种情况下,如果待从相同的存储器单元中读取两个值或者如果相同值同时通过两个不同单元读取,那么将发生冲突,这是因为存储器单元的单个读取端口不可能同时输出两个值或同时输出相同值到两个不同单元。
[0030] 举例来说,虽然在本发明中所描述的实例中的GPR可以包括多个端口(例如,输入和输出交叉开关可以为GPR提供四个读取端口和两个写入端口),但是每个单独的存储器单元可具有有限的端口。作为实例,输入和输出交叉开关以及各自具有一个读取端口和一个写入端口的四个存储器单元可用于形成具有四个读取端口和两个写入端口的GPR。然而,在从同一存储器单元中同时读取多个值时将存在操作数冲突。
[0031] 根据本发明中描述的技术,冲突检测单元可经配置以在指令的执行之前确定指令的执行是否将在GPR内的多个不同的存储器单元中的一个的端口处引起冲突。换句话说, 冲突检测单元可以确定指令的执行是否将引起从GPR的多个存储器单元的第一存储器单元中同时读取与第一存储器单元的读取端口可以输出的值相比更多值。如果确定执行将引起冲突,那么冲突解决器单元或处理元件可以将来自存储器单元的值中的一个存储在冲突队列中。冲突队列对于执行将引起冲突的指令的处理元件可以为本地的。
[0032] 在本发明中,在一些情况下,引起从存储器单元中同时读取与存储器单元的读取端口可以输出的值相比更多的值的指令的执行可以意味着多个指令待执行并且所述指令的同时执行将引起读取与读取端口可以输出的值相比更多的值。在此意义上,是指令的执行引起同时读取。举例来说,如果存在两个并行地待执行的指令,那么一个指令的执行与另一个指令结合将引起读取与读取端口可以支持的值(假设读取端口一次可以支持一个读取)相比更多的值,然而如果仅执行指令中的一者,那么将不存在冲突。
[0033] 并且,在一些情况下,引起从存储器单元中同时读取与存储器单元的读取端口可以输出的值相比更多的值的指令的执行还可以意味着一个指令要求同时读取多个值,这将引起读取与存储器单元的读取端口可以输出的值相比更多的值。作为一个实例,一个指令可以需要多个读取。作为另一实例,一个指令可以包括各自被引导以从同一存储器单元中读取的多个子指令。举例来说,执行引起从存储器单元中同时读取与存储器单元的读取端口可以输出的值相比更多的值的指令,可以为被认为是其中指令的执行(与其它指令结合或者其它情况)将引起需要在相同时钟周期中从存储器单元的读取端口中读取与读取端口可以输出的值相比更多的值的情况。
[0034] 作为示意性实例,假设指令的执行将引起处理元件从多个存储器单元的第一存储器单元中同时读取值A和值B。在此实例中,冲突检测单元可以在指令的执行之前确定同时读取值A和值B将引起冲突(例如,将引起从第一存储器单元中同时读取与第一存储器单元的读取端口可以输出的值相比更多的值)。继而,冲突解决器单元可以在处理元件的冲突队列中存储值A或值B中的一者(在此实例中假设是值A)。随后,当处理元件执行指令时,处理元件能够从第一存储器单元中读取值B并且从冲突队列中读取值A,进而缓解冲突。因为从不同位置读取值A和值B,所以处理元件能够在相同时钟周期中读取值A和值B。
[0035] 以此方式,本发明中描述的技术允许GPR由组成性基础存储器单元构造,同时最小化操作数冲突。举例来说,如果产生冲突,那么一些其它技术使用“无操作”(NOP)命令以等待对值的存取。通过由多个单独的不同存储器单元形成的其值仅可以通过它们的端口并且仅此端口存取的GPR,冲突将出现的可能性增大,并且本发明中描述的技术缓解了冲突情况中的一些以提高计算效率(即,减少完成计算所需的时钟周期的数目)。
[0036] 此外,由于在指令的执行之前冲突解决器在冲突队列中存储冲突值,所以在执行期间额外的读取/写入端口可以为可供使用的。举例来说,在以上实例中,可以最初需要处理元件使用GPR的两个端口,所述端口一个读取值A且一个读取值B。然而,由于冲突检测单元确定将引起冲突,所以冲突解决器单元在执行之前存储值A。这意味着GPR的端口中的一个将用于在执行期间读取值B,并且已经用于读取值A的端口是未使用的。
[0037] 在一些实例中,为了避免浪费GPR的未使用的端口,处理元件可以在执行当前指令期间预提取随后指令的值,并且在预提取队列中存储预提取值。不应当混淆在预提取队列中值的预提取和与在冲突队列中值的存储。在冲突队列中值的存储是在通过其中冲突将出现的处理元件执行当前指令之前执行的,使得值可从除其中将发生冲突的存储器单元外的不同来源获得。值的预提取是在当前指令的执行期间执行的,以提取随后指令将需要的值,这是因为在冲突队列中的值的存储不需要GPR的端口来读取或写入值。
[0038] 作为示意性实例,假设GPR包括两个不同的单独的存储器单元,并且包括两个读取端口。在此实例中,假设第一存储器单元包括值A和B,并且第二存储器单元包括值C。并且假设指令将引起处理元件同时读取值A和B。在此实例中,类似于上文,冲突解决器单元可以在处理元件的冲突队列中存储值A或值B中的一者(在此实例中假设是值A)。当处理元件执行指令时,处理元件将使用GPR的两个端口的第一个读取值B,并且从冲突队列中读取值A。由于处理元件读取从冲突队列中而不是从GPR中读取值A,所以GPR的两个端口的第二端口是未使用的。假设在未来将需要值C,在一些实例中,处理元件可以在从第一存储器单元中读取值B的同时从第二存储器单元中读取值C,并且在预提取队列中存储值C。
[0039] 以此方式,本发明中描述的技术可以提高GPR的利用率,这进一步缩短了指令周期。举例来说,在冲突队列中存储其中冲突将出现的值可以减少执行NOP指令的闲置时间,并且下一个值的预提取可以减少需要执行的指令的数目,这是由于稍后指令所需的一些值已经存储在预提取队列中,并且随后可不需要执行指令以读取此类值。
[0040] 图1是说明根据本发明中所描述的一或多个实例技术的用于处理数据的实例装置的框图。图1说明装置10,装置10的实例包括但不限于例如媒体播放器的视频装置、机顶盒、例如移动电话的无线手持机、个人数字助理(PDA)、桌上型计算机、膝上型计算机、游戏控制台、视频会议单元、平板计算装置等等。
[0041] 在图1的实例中,装置10包括处理器12、图形处理单元(GPU)14和系统存储器16。在一些实例中,例如装置10是移动装置的实例,处理器12和GPU 14可以形成为集成电路(IC)。举例来说,IC可以被认为是例如芯片上系统(SoC)的芯片封装内的处理芯片。 在一些实例中,处理器12和GPU 14可容纳在不同集成电路(即,不同芯片封装)中,例如装置10是桌上型或膝上型计算机的实例。然而,在装置10是移动装置的实例中,或许有可能的是处理器12和GPU 14容纳在不同集成电路中。
[0042] 处理器12和GPU 14的实例包含但不限于一或多个数字信号处理器(DSP)、通用微处理器、专用集成电路(ASIC)、现场可编程逻辑阵列(FPGA)或其它等效的集成或离散逻辑电路。处理器12可为装置10的中央处理单元(CPU)。在一些实例中,GPU 14可以是专用硬件,其包括集成和/或离散逻辑电路,所述集成和/或离散逻辑电路向GPU 14提供适用于图形处理的大规模并行处理能力。在一些情况下,GPU 14还可包括通用处理能力,且在实施通用处理任务(即,非图形相关任务)时可被称为通用GPU(GPGPU)。
[0043] 出于说明的目的,结合GPU 14描述本发明中描述的技术。然而,本发明中描述的技术不受此限制。本发明中描述的技术可扩展到其它类型的并行处理单元(例如,提供大规模并行处理能力、即使不用于图形处理的处理单元)。并且,本发明中描述的技术可以扩展到未被专门配置成用于并行处理的处理单元。
[0044] 处理器12可执行各种类型的应用程序。应用程序的实例包括网络浏览器、电子邮件应用程序、电子数据表、视频游戏或产生可视对象以供显示的其它应用程序。系统存储器16可以存储用于执行一或多个应用程序的指令。在处理器12上执行应用程序使得处理器12产生用于待显示的图像内容的图形数据。处理器12可将图像内容的图形数据传输到GPU 14以用于进一步处理。
[0045] 作为一个实例,在处理器12上执行应用程序使得处理器12能够产生图元的顶点,其中相应顶点处的图元的互连形成图形对象。在这个实例中,处理器12产生的图形数据是用于所述顶点的属性的属性数据。举例来说,在处理器12上执行的应用程序可以生成顶点的色彩值、不透明度值、坐标等,这些全都是顶点的属性的实例。还可存在额外属性,并且在一些实例中,应用程序无需产生全部实例属性。总的来说,所述技术可以扩展到属性数据之外的数据类型(例如,计数器),并且所述技术不应当被视为受限于属性数据或受限于例如色彩值、不透明度值、坐标等属性数据的实例。
[0046] 在一些非图形相关实例中,处理器12可以产生更适用于通过GPU 14处理的数据。此类数据无需用于图形或显示用途。举例来说,处理器12可以输出需要通过GPU 14对其执行矩阵运算的数据,并且GPU 14可以继而执行矩阵运算。
[0047] 一般而言,处理器12可以将处理任务卸载到GPU 14,所述处理任务例如需要大规模并行运算的任务。作为一个实例,图形处理需要大规模并行运算,并且处理器12可将此类图形处理任务卸载到GPU 14。然而,例如矩阵运算的其它运算还可受益于GPU 14 的并行处理能力。在这些实例中,处理器12可以利用GPU 14的并行处理能力以使得GPU 14执行非图形相关运算。
[0048] 处理器12可根据特定应用处理接口(API)与GPU 14通信。此类API的实例包括 的 API、克罗诺斯(Khronos)组织的 或OpenGL 以及OpenCLTM;然而,本发明的各方面不限于DirectX、OpenGL或OpenCL API,并且可扩展到其它类型的API。此外,本发明中描述的技术不需要根据API作用,且处理器12和GPU 14可利用任何技术来通信。
[0049] 装置10还可包括显示器18、用户接口20以及收发器模块22。装置10可包括出于清楚起见而未在图1中示出的额外模块或单元。举例来说,装置10可包括扬声器和麦克风(两者都未在图1中示出),以在装置10为移动无线电话的实例中实现电话通信。此外,装置10中所示的各种模块和单元可能并不是在装置10的每一实例中都是必要的。举例来说,在装置10为桌上型计算机的实例中,用户接口20和显示器18可在装置10外部。作为另一实例,在显示器18为移动装置的触敏或压敏显示器的实例中,用户接口20可为显示器18的一部分。
[0050] 显示器18可以包括液晶显示器(LCD)、阴极射线管(CRT)显示器、等离子显示器、触敏显示器、压敏显示器或另一类型的显示装置。用户接口20的实例包括但不限于轨迹球、鼠标、键盘以及其它类型的输入装置。用户接口20也可为触摸屏并且可并入作为显示器18的一部分。收发器模块22可包括电路以使得装置10与另一装置或网络之间进行无线或有线通信。收发器模块22可包括调制器、解调器、放大器和用于有线或无线通信的其它此类电路。
[0051] 系统存储器16可为装置10的存储器。系统存储器16可包括一或多个计算机可读存储媒体。系统存储器16的实例包括但不限于随机存取存储器(RAM)、电可擦除可编程只读存储器(EEPROM)、快闪存储器或其它媒体,所述其它媒体可用于携载或存储以指令和/或数据结构形式的所需的程序代码并且可通过计算机或处理器存取。
[0052] 在一些方面中,系统存储器16可包括引起处理器12和/或GPU 14执行在本发明中归属于处理器12和GPU 14的功能的指令。因此,系统存储器16可为其上存储有指令的计算机可读存储媒体,所述指令在被执行时,引起一或多个处理器(例如,处理器12和GPU 14)执行各种功能。
[0053] 在一些实例中,系统存储器16可为非暂时性存储媒体。术语“非暂时性”可指示存储媒体不实施于载波或传播信号中。然而,术语“非暂时性”不应解释为意味着系统存储器16为不可移动的或其内容为静态的。作为一个实例,可从装置10移除系统存储 器16,并将所述系统存储器移动到另一装置。作为另一实例,大体类似于系统存储器16的存储器可插入到装置10中。在某些实例中,非暂时性存储媒体可存储可随时间而改变的数据(例如,在RAM中)。
[0054] 如上文所述,GPU 14提供大规模并行处理能力。GPU 14提供此类并行处理能力的一种方式是通过单指令多数据(SIMD)结构。在SIMD结构中,GPU 14执行相同程序的多个实例。举例来说,图形处理和一些非图形相关处理需要执行相同操作,但是针对不同数据执行。
[0055] 举例来说,GPU 14可执行着色器程序(简单地称为着色器),其执行图形或非图形相关任务。GPU 14包括至少一个着色器核心,并且着色器程序在着色器核心上执行。为了描述的简洁和容易起见,将GPU 14描述为执行图形相关任务,但是可类似地执行非图形相关任务。GPU 14可以执行着色器程序的多个实例以一次处理多个图形项目。
[0056] 图形项目是GPU 14执行并行处理的基础单位。GPU 14可以并行处理多个图形项目(例如,同时)。举例来说,顶点着色器可以处理顶点,并且GPU 14可以并行执行顶点着色器的多个实例以同时处理多个顶点。类似地,像素或片段着色器可以处理显示器的像素,并且GPU 14可以并行执行像素着色器的多个实例以同时处理显示器的多个像素。顶点和像素是图形项目的实例。
[0057] 对于非图形相关应用程序,图形项目这个术语还指代GPU 14执行处理的最小单位。然而,此类的处理可能不是图形相关的。因此,术语“图形项目”的意思是指图形处理单元(例如,GPU 14)或通用图形处理单元(例如,其中GPU 14充当GPGPU的实例)将要并行处理的项目。图形项目可以用于图形或非图形用途。
[0058] 在一些情况下,术语“纤维”是指GPU 14执行处理的基础单位。术语“纤维”与“图形项目”同义。GPU 14的大规模并行处理能力使得GPU 14能够同时处理多个纤维。GPU 14同时处理的多个纤维被称作波。在本发明中,“图形波”与纤维波同义。换句话说,多个图形项目形成图形波。
[0059] 如上文所述,对于并行处理,GPU 14可执行着色器程序的多个实例以一次处理多个图形项目。举例来说,GPU 14可以执行顶点着色器的多个实例以一次(例如,并行)处理多个顶点。一般而言,对于一个顶点所需要执行的操作与对于其它顶点所需要执行的操作相同。
[0060] 虽然对于所述顶点所需要执行的操作是相同的,但是顶点中的每一个的一或多个属性数据可以是不同的。举例来说,每个图形项目(例如,顶点或像素)与多个属性相关联。每个属性包含属性数据。作为一实例,图元的顶点或显示器的像素可以由坐标(例如,x、 y、z、w)限定。顶点和像素中的每一个还可由色彩(例如红色分量、绿色分量、蓝色分量(RGB))限定。还可存在用于每个顶点或像素的不透明度值(例如,α值)。坐标、色彩和不透明度全都是图形项目(例如,纤维)的属性的实例,并且可以存在比实例更多或更少的属性。
[0061] 属性不应当被视为受限于坐标、色彩和不透明度。提供坐标、色彩和不透明度只是为了帮助理解。然而,对于一些情况,图形项目的属性可以受限于特定的数据类型(例如,由于着色器程序的编程方式,或者由于GPU 14的设计方式)。
[0062] 一般而言,每个图形项目可以与多个变量相关联,且需要所述多个变量以用于处理图形项目中的每一个。多个变量的一个实例是与顶点或像素相关联的属性。对于每个变量,可存在限定所述变量的数据(例如,值)。数据的一个实例是与每个属性相关联的属性数据。在这个实例中,需要与顶点或像素相关联的属性以用于处理顶点和像素中的每一个。为了处理所述属性,GPU 14处理所述属性的属性数据。
[0063] 为了易于描述,参考与处理顶点或像素所需的属性相关联的属性数据描述所述技术。然而,本发明中描述的技术通常适用于与处理图形项目所需的变量相关联的数据,并且为了便于理解提供与顶点或像素的属性相关联的属性数据。
[0064] 在本发明中描述的技术中,属性数据可被认为是操作数值(也被简称为操作数),这是因为指令是在这些值上面操作的。GPU 14可以包括通用寄存器(GPR),其经配置以存储操作数值。在一些情况下,由指令所限定的操作的结果可以为到另一个随后指令的输入,并且因此在一些情况下GPR可经配置以存储来自操作的结果值。
[0065] 为了促进并行处理,GPR可被配置为多端口GPR。在多端口GPR中,可以从GPR中同时读取多个值或同时写入多个值到GPR。举例来说,假设GPR具有两个写入端口和四个读取端口(2W4R)。在此实例中,可以从GPR中同时(并行)读取最多四个值,其中一个值来自一个端口。
[0066] 举例来说,GPU 14包括在上面执行着色器程序的着色器核心。举例来说,着色器核心包括执行由着色器程序的指令所限定的操作的多个处理元件。每个处理元件可执行着色器程序的一个实例的指令。着色器程序的一个实例的一个指令被称作线程。
[0067] 可存在设计GPR的多种不同方式,且在一些实例中,GPR经设计以用于GPU 14的特定配置。举例来说,GPU 14的处理元件可被认为是各自设计成处理最多达三种操作数值的算术逻辑单元(ALU)。操作数值(或简称操作数)是执行由指令所限定的操作的值。作为基础实例,指令可限定添加X、Y及Z。在此实例中,X、Y及Z是执行添加操作的操作数值,且处理元件可经配置以执行三个或少于三个操作数值的算术运算。
[0068] 除处理元件之外,GPU 14还可包括基本功能单元(EFU)、纹理样本单元以及各自从GPR中读取值的存储器负载/存储单元。GPR还可以存储待输出以用于显示的最终输出值(例如,最终像素值)。GPR还可以接收来自处理元件的值(例如,算术运算的结果)、来自EFU、纹理样本单元、存储器负载/存储单元的值,以及其它输入值。
[0069] 对于包含上述实例单元的GPU 14的一个实例,包括四个读取端口和两个写入端口的GPR可以足够有助于GPU 14的并行处理能力。在GPU 14的一些实例中,GPR可以包括除上述实例外不同数目的读取和写入端口以有助于GPU 14的特定实例的并行处理能力。
[0070] 在一些情况下,GPU 14的设计者可以设计特定类型的GPR用于GPU 14。举例来说,如果GPU 14将使用四个读取端口、两个写入端口的GPR,那么GPU 14的设计者可以设计包括四个读取端口和两个写入端口的单个存储器单元GPR。在此实例中,可以在没有任何端口冲突的情况下从GPR的单个存储器单元中同时读取最多四个值,并且在没有任何端口冲突的情况下将最多两个值同时写入到GPR的单个存储器单元。
[0071] 虽然设计单个存储器单元,但是多端口GPR可有利的促进并行处理(例如,可以并行读取或写入多个值),这可能存在某些缺点。举例来说,此类GPR所需要的区域和电力可能相对较高。并且,GPR的单个存储器单元无法形成为基础构建块,从所述基础构建块中可形成其它GPR,这是由于GPR的单个存储器单元是为GPU 14的特定配置而设计的。换句话说,单个存储器单元、多端口GPR可能不易于设计迁移。
[0072] 本发明中描述的技术使用由多个单独的不同的存储器单元形成的GPR,其中每个存储器单元具有有限数目的读取和写入端口。举例来说,多个存储器单元中的一个可以包括仅一个读取端口和仅一个写入端口,然而,它可有可能包括更多的读取和写入端口(然而没有如此多以至于存储器单元影响设计迁移)。出于说明的目的,本发明结合实例描述,其中多个存储器单元的每个存储器单元(也被称作存储体)包括仅一个读取端口和仅一个写入端口。由于多个存储器单元是单独的且不同的,所以存储于存储器单元中的值可以仅可从该存储器单元的读取端口中读取,并且仅使用该存储器单元的写入端口仅可以将所述值写入到存储器单元中。
[0073] 为了有助于数据传送到存储器单元和从存储器单元中传送数据,如本发明中所描述的GPR可以包括输入和输出交叉开关。输入和输出交叉开关可被认为是开关的矩阵以互连从GPR中读取或写入到GPR的单元与特定存储器单元,所述特定存储器单元存储被读取的值或将要存储被写入的值。
[0074] 以此方式,使用多个标准的一个写入、一个读取存储器单元以及输入和输出交叉开 关,有可能设计各种类型的GPR,所述GPR在较高每位密度和较低每位电力消耗的设计之间良好的迁移。举例来说,为了模拟上述2W4R单个存储器单元GPR,有可能使用四个1W1R存储器单元,所述1W1R存储器单元各自存如2W4R单个存储器单元GPR的数据的量的四分之一,并且包括4x4个输出交叉开关以允许读取四个值以及2x4个输入交叉开关以允许写入两个值。
[0075] 图2A是说明具有单个多端口存储器单元的通用寄存器(GPR)的实例的框图。图2B是说明存储在图2A的GPR的单个多端口存储器单元中的操作数值的概念图。如图2A中所说明,GPR 24A包括接收各种输入的存储器单元26(也被称作宏),所述输入例如来自纹理/存储器存储单元的输入、基本功能单元(EFU)的结果,以及来自处理单元(说明为ALU DST)的算术运算的结果。GPR 24A的存储器单元26输出各种数据,例如输出到纹理/存储器存储单元、到EFU的值;以及输出最多三种操作数值到ALU(说明为ALU SRC0-SRC2)。
[0076] GPR 24A可以为2W4R GPR。在此实例中,存储器单元26可经设计以使得最多两个值可以同时(例如,并行)写入到存储器单元26,并且可以从存储器单元26中同时(例如,并行)读取最多四个值。
[0077] 图2B说明存储在存储器单元26中的值的实例。在此实例中,存储器单元26是128位宽度×256位深度。在图2B中,P0到P3指代像素或顶点(例如,图形项目或纤维),R、G、B以及A相应地指代红色分量、绿色分量、蓝色分量和不透明度分量,并且X、Y、Z和W指代3-D坐标。举例来说,P0.R是指像素P0的红色分量,P0.G是指像素P0的绿色分量等等,并且同样适用于像素P1、P2和P3。
[0078] 使用变量R0到R7作为将常见属性分组在一起的简单方式。举例来说,GPU 14可经配置以并行处理四个像素(例如,四重处理)。变量R0可指代四个像素P0到P3的红色分量。换句话说,如果指令指示变量R0是操作数,那么指令限定P0.R到P3.R是将并行处理的操作数。
[0079] 图3A是说明具有多个单个写入、单个读取存储器单元的通用寄存器(GPR)的实例的框图。图3B是说明存储在图3A的GPR的多个单个写入、单个读取存储器单元中的操作数值的概念图。如图3A中所说明,GPR 24B包括与图2A中的GPR 24A的实例类似的输入和输出。然而,GPR 24B并非包括单个存储器单元26,而是包括多个单独的不同的存储器单元28A到28D。并且,虽然存储器单元26为具有多个读取和多个写入端口的多端口存储器单元,但是存储器单元28A到28D可以为具有仅一个读取和仅一个写入端口的单端口存储器单元。存储器单元28A到28D中的每一个可以存储存储器单元 26存储的数据的量的四分之一。举例来说,如图3B中所说明,存储器单元28A到28D中的每一个是128位宽度×64位深度,并且因此,四个存储器单元28A到28D一起提供与128位宽度×256位深度的存储器单元26一样多的存储量。
[0080] GPR 24B还包括2x4个输入交叉开关30和4×4个输出交叉开关32。输入交叉开关30可经配置以将提供输入的单元中的两个同时互连到存储器单元28A到28D中的两个。举例来说,输入交叉开关30可以将存储器单元28A连接到来自EFU的输出并且将存储器单元28B连接到纹理/存储器存储单元的输出使得EFU和纹理/存储器存储单元可以同时写入到GPR 24B。输出交叉开关32可经配置以将读取值的单元中的四个同时互连到存储器单元28A到
28D中的四个。举例来说,输出交叉开关32可以将存储器单元28A连接到EFU的输入、将存储器单元28B连接到ALU SRC2的输入、将存储器单元28C连接到ALU SRC1的输入,并且将存储器单元28D连接到ALU SRC0的输入。在此实例中,处理单元能够从相应的存储器单元28B到
28D中读取三个操作数值(例如,通过ALU SRC0到SRC2),并且EFU能够从存储器单元28A中全部彼此并行的读取它的操作数值。
[0081] 以此方式,类似于GPR 24A,使用标准1W1R存储器单元28A到28D,GPR 24B可以经调配以充当2W4R GPR。然而,GPR 24B可能存在问题,例如,可能并不存在于GPR 24A中的端口冲突。
[0082] 举例来说,如图3B中所说明,存储器单元28A到28D中的每一个存储图2B的存储器单元26所存储的数据的一部分。在图3A和3B中所说明的实例中,并行读取存储在存储器单元28A到28D中的同一个中的多个值可以是不可能的,或者并行写入待存储在存储器单元28A到28D中的同一个中的多个值可以是不可能的。替代地,此类读取或写入可能需要串行化使得一个接一个的读取或写入值,而不是并行(例如,同时)读取或写入值。
[0083] 作为一个实例,假设处理元件将执行的指令是R0+R4。如上文所述,GPU 14可以四重地处理像素(一次处理四个像素)。因而,R0是指像素P0到P3的属性,并且R4是指像素P0到P3的属性。并且,如上文所述,R0是指像素P0到P3的红色分量并且R4是指像素P0到P3的x坐标。一般而言,GPU 14将需要添加红色分量到x坐标的实例将是非常少的。因此,R0+R4的此实例仅提供用于辅助理解,并且出于实例的目的,R0和R4可以被认为是不同像素的代表属性且未必是在图2A、2B、3A和3B中说明的属性。
[0084] 在图2A和2B中所说明的实例中,处理元件能够同时读取值R0和R4。举例来说, GPR 24A提供四个读取端口,并且处理元件可使用四个读取端口中的两个。举例来说,在指令R0+R4中,R0和R4是操作数。处理元件可被认为是通过ALU SRC0读取R0和通过ALU SRC1读取R1。
以此方式,仅需要一个时钟周期来读取值R0和R4。
[0085] 在图3A和3B中所说明的实例中,处理元件不能够同时读取值R0和R4。举例来说,如图3B中所说明,存储器单元28A存储R0和R4两者。如上文所述,存储器单元仅包括一个读取端口。因而,输出交叉开关32通过ALU SRC0将一个连接提供到存储器单元28A,从中处理元件将读取值R0或R4中的一者;并且随后在读取值R0和R4中的一者之后,输出交叉开关32通过ALU SRC1将一个连接提供到存储器单元28A,从中处理元件将读取值R0和R4中的另一者。在此实例中,需要两个时钟周期来读取值R0和R4,这是因为由于存储器单元28A仅具有一个读取端口而无法同时读取它们。
[0086] 在本发明中,在一个时钟周期中(例如,同时或同步)需要读取或写入比读取端口或写入端口所支持的值多的值的情况被称作操作数冲突。举例来说,在图3B中示出的实例中,存储器单元28A到28D仅提供一个读取端口,并且当需要同时(例如,在相同时钟周期中)读取两个值时存在操作数冲突。本发明中描述的技术描述了在指令的执行之前解决操作数冲突的一种方式,使得冲突操作数(例如,对于同一存储器单元需要同时读取或写入的操作数值)不需要同时读取或写入。
[0087] 图4是说明图形处理单元(GPU)的着色器核心的一个实例的框图。举例来说,图4说明GPU 14的着色器核心31的一个实例。着色器核心31可以包括控制单元33(其包括冲突检测单元34)、指令存储装置36、一或多个处理元件38A到38H(统称为“处理元件38”)、GPR 40以及冲突解决器单元48。尽管图4说明八个处理元件38,但在其它实例中,可存在多于或少于八个处理元件38。处理元件38是在上面并行执行着色器程序的实例的处理元件的实例。
[0088] 控制单元33可以控制着色器核心31的功能性。举例来说,控制单元33可以检索待通过处理元件38执行的指令,并且在指令存储装置36中存储所述指令。并且,控制单元33可以检索处理元件38将处理的属性数据(例如,操作数值),并且在GPR 40中存储属性数据。
[0089] GPR 40可以类似于如图3A中所说明的GPR 24B。举例来说,GPR 40可以包括多个单独的不同的存储器单元,每个存储器单元具有有限数目的读取和写入端口(例如,仅一个读取和仅一个写入端口),并且存储在存储器单元中的一个的值仅可以相应地从它的读取端口读取并且写入到它的写入端口。在图4中所说明的实例中,在从GPR 40中读取和写入值中可能存在冲突。
[0090] 指令存储装置36可以是能够存储指令的存储器,例如但不限于易失性存储器、非易失性存储器、高速缓冲存储器、随机存取存储器(RAM)、静态RAM(SRAM)、动态RAM(DRAM)等。控制单元33可以为着色器核心31的硬接线电路,其控制着色器核心31的组件。然而,或许有可能至少部分地通过着色器核心31的在硬件上执行的软件或固件形成控制单元33。
[0091] 处理元件38经配置以执行着色器程序的线程。处理元件38中的每一个可执行不同线程。举例来说,处理元件38中的每一个可相对于潜在地不同的图形项目(例如,不同纤维)执行着色器程序的指令的实例。处理元件38可以是单指令多数据(SIMD)处理元件。SIMD处理元件指代当被激活时经配置以相对于不同数据同时执行相同指令的处理元件。这可使得处理元件38相对于不同数据项并行执行着色器程序的多个线程。在一些情况下,处理元件38中的每一个可基于指向指令存储装置36中包含的指令的常见程序计数器执行着色器程序的指令。
[0092] 如果控制单元33解除激活处理元件38中的一或多个,那么此类处理元件38在给定指令周期中并不执行程序指令。在一些情况下,控制单元33可解除激活处理元件38中的一或多个以实施条件性分支指令,其中分支条件对于一些线程得到满足且对于其它线程得不到满足。
[0093] 在一些实例中,处理元件38中的每一个可以包括一或多个算术逻辑单元(ALU)和/或对应于一或多个算术逻辑单元(ALU)。在其它实例中,处理元件38中的每一个可实施ALU功能性。ALU功能性可以包括加法、减法、乘法等。
[0094] 举例来说,图4进一步详细地说明处理元件38A。处理元件38B到38H可类似于处理元件38A。如所说明,处理元件38A包括冲突队列42A、预提取队列44A以及算术流水线46A。在下文中更详细地描述冲突队列42A和预提取队列44A,并且算术流水线46A可经配置以执行数学函数,例如,存储在GPR 40中的不同操作数值的加法、减法、乘法、除法。
[0095] 为了易于描述,随后的实例是相对于处理元件38A描述的,但是实例也同等的适用于其它处理元件38。在一些情况下,处理元件38A执行的指令使得处理元件38A从GPR40中读取多个操作数值。如上文所述,处理元件38可经配置以并行处理三个操作数(例如,执行算术运算所需的最多三个值)。为了执行在指令中定义的算术运算,处理元件38A可以在一个时钟周期中从GPR 40中读取操作数值。然而,如果操作数值存储在GPR40中的同一存储器单元中,那么可能出现冲突。
[0096] 在本发明中描述的技术中,在处理元件38执行将引起冲突的指令(例如,引起处理 元件从GPR 40中的存储器单元中读取与将支持的在GPR 40中的存储器单元的读取端口的数目相比更多的值)之前,冲突检测单元34可以确定存储在指令存储装置36中的指令的执行是否将引起冲突。举例来说,冲突检测单元34可以确定指令的执行是否将引起从GPR 40的多个存储器单元的第一存储器单元中同时读取与第一存储器单元的读取端口可以输出的值相比更多的值。如上文所述,确定指令的执行是否将引起从GPR 40的多个存储器单元的第一存储器单元中同时读取与第一存储器单元的读取端口可以输出的值相比更多的值可以意味着指令(结合其它指令、指令的子指令或其本身)的执行将引起从第一存储器单元中读取与第一存储器单元的读取端口可以输出(例如,在相同时钟周期中输出)的值相比更多的值。
[0097] 可能存在冲突检测单元34可用以确定存储在指令存储装置36中的指令的执行是否将引起冲突的许多不同的方式,并且下文仅是一个实例方式。确定执行是否将引起冲突的其它方法也可以是可能的。
[0098] 在一些实例中,存储在指令存储装置36中的指令可以指示操作数值将在GPR 40中从何处被读取。举例来说,控制单元33可以控制将值存储到GPR 40中,并且可以包括识别将从何处读取操作数值的存储在指令存储装置36中的指令中的信息。冲突检测单元34可以确定将从GPR 40中的何处读取操作数值。如果冲突检测单元34确定将从GPR40的多个存储器单元的同一存储器单元中读取操作数值,那么冲突检测单元34可以确定存在冲突。
[0099] 举例来说,如上文所述,处理元件38A可以使用ALU SRC0到ALU SRC2读取最多三个操作数值。在一个实例中,冲突检测单元34可以比较通过ALU SRC0将从何处读取值以及通过ALU SRC1将从何处读取值。如果将从其中读取值的位置不是递增的,那么冲突检测单元34可以确定存在冲突。举例来说,对于并行处理,GPU 14可经配置以执行指令,其中指令的操作数是从不同存储器单元中检索到的,并且这些指令以从中检索到操作数的存储器单元中的递增改变重复。如果不存在递增改变,那么冲突检测单元34可以确定变量从同一存储器单元中同时读取两次,并且确定存在冲突。类似地,冲突检测单元34可以比较通过ALU SRC0将从何处读取值以及通过ALU SRC2将从何处读取值,以及比较通过ALU SRC1将从何处读取值以及通过ALU SRC2将从何处读取值。如果位置并不递增,那么如上文所述冲突检测单元34可以确定存在冲突。
[0100] 举例来说,假设处理元件38A将执行需要在三个操作数上的算术运算的指令。此类指令的一个实例是乘法和加法运算(MAD)操作,其中两个操作数值相乘并且所得的值被添加到第三操作数值。在此实例中,一个指令包括三个操作数的读取。在一些实例中, 可有可能的是三个指令包括三个相应的操作数的读取,并且如果三个操作数存储在同一存储器单元中,那么将引起冲突。在此实例中,指令中的一个(结合至少一个其它的)的执行将引起从存储器单元中同时读取与存储器单元的读取端口可以输出的值相比更多的值。
[0101] 在一些情况下,冲突检测单元34可以确定不存在冲突,例如其中操作数值中的每一个存储在GPR 40中的多个存储器单元的不同存储器单元中。在一些情况下,冲突检测单元34可以确定存在一个冲突,其中三个操作数值中的两个需要从同一存储器单元中读取(例如,在ALU SRC0与ALU SRC1之间、在ALU SRC0与ALU SCR2之间,或在ALU SRC1与ALU SRC2之间)。在一些情况下(例如,最差情况情境),由于全部三个操作数值都存储在同一存储器单元中,所以冲突检测单元34可以确定存在两个冲突。
[0102] 在冲突检测单元34确定存在冲突的情况下,冲突检测单元34可以包括指令中的来源冲突(SC)位以指示此指令的执行造成冲突。此外,控制单元33向冲突解决器单元48指示指令的执行造成冲突,并且冲突解决器单元48可以在执行指令之前解决冲突。
[0103] 在执行之前解决冲突意味着冲突解决器单元48可以读取或使得处理元件38A在指令的执行之前读取冲突操作数中的一个并且使得在处理元件38A的冲突队列42A中存储冲突操作数中的一个。举例来说,GPR 40可以提供具有类似于图3A的输出交叉开关32的输出交叉开关的四个读取端口。假设冲突操作数存储在GPR 40的第一存储器单元中。在此实例中,冲突解决器单元48可以确定在冲突队列42A中是否存在存储空间。如果在冲突队列42A中存在存储空间并且SC位经设置以用于指令,那么冲突解决器单元48可以确定是否使用GPR 40的全部四个读取端口并且读取端口中的任一个是否从存储冲突操作数的存储器单元(例如,第一存储器单元)中读取。
[0104] 如果并未使用GPR 40的全部四个读取端口并且没有从存储冲突操作数的存储器单元(例如,第一存储器单元)中读取值,那么冲突解决器单元48可以使得处理元件38A读取冲突操作数中的一个并且在冲突队列42A中存储冲突操作数或者冲突解决器单元48可以直接地读取冲突操作数中的一个并且在冲突队列42A中存储冲突操作数。此外,冲突解决器单元48或控制单元33可以修改处理元件38A执行的指令以指示处理元件38A从GPR 40中读取一个操作数值并且从冲突队列42A中读取其它的一或多个操作数值。
[0105] 换句话说,在指令的执行之前,冲突解决器单元48或处理元件38A可以基于确定指令的执行将引起从第一存储器单元中同时读取与第一存储器单元的读取端口可以输出的值相比更多的值而将存储在第一存储器单元中的一或多个值存储在冲突队列42A 中。举例来说,冲突解决器单元48可以确定当GPR 40的全部的读取端口不在使用中时并且当一或多个值未从第一存储器单元中读取时的实例。冲突解决器单元48或处理元件38A可以在所述所确定的实例期间将存储在第一存储器单元中的一或多个值存储在冲突队列42A中。
[0106] 作为示意性实例,假设GPR 40包括类似于图3B的四个存储器单元,并且第一存储器单元存储R0和R4。并且,假设处理元件38A将执行指令R0+R4。在此实例中,冲突检测单元34可以首先确定读取值R0和R4将引起冲突,这是由于两个值需要从同一存储器单元中读取,并且存储器单元的读取端口的数目小于同时读取值所需的读取端口的数目。冲突检测单元34可以包括指示指令的执行将引起应当解决的冲突的SC位。
[0107] 继而,冲突解决器单元48可以确定在冲突队列42A中足够的存储空间是否是可供使用的以存储冲突操作数值(例如,值R0和R4中的一个)。冲突操作数值可以是存储于存储器单元中的需要与来自存储器单元的其它值同时读取的值中的一个。冲突解决器单元48还可以确定对GPR 40的存取是否是可供使用的,这是因为并非GPR 40的全部读取端口都被使用,并且确定对存储R0和R4的存储器单元的存取是否是可供使用的。如果冲突解决器单元48确定并未使用GPR 40的全部读取端口且对存储R0和R4的存储器单元的存取是可供使用的,那么冲突解决器单元48可以使得处理元件38A读取值R0或R4中的一个(假设是R0)并且在冲突队列42A中存储值R0,或者冲突解决器单元48可以读取值R0或R4中的一个(同样假设是R0)并且在冲突队列42A中存储值R0。
[0108] 冲突解决器单元48或控制单元33可以修改指导处理元件38A以从GPR 40中读取值R0和R4的指令。举例来说,控制解决器单元48或控制单元33可以修改指导处理元件38A以从GPR 40中读取值R0和R4的指令,使得指令指导处理元件38A从GPR 40中读取值R4并且从冲突队列42A中读取值R0。
[0109] 处理元件38A可随后执行指令。在这种情况下,处理元件38A可以从GPR 40中读取值R4并且从冲突队列42A中读取值R0。举例来说,处理元件38A可以从GPR 40中读取值R4,并且算术流水线46A可以从GPR 40中接收值R4。然而,算术流水线46A可以从冲突队列42A而非GPR 40中接收值R0。以此方式,算术流水线46A可以能够在相同时钟周期中接收两个操作数值。换句话说,本发明中描述的技术可以确定冲突存在于指令中,其中指令的执行将使得处理元件38A从存储器单元中检索与存储器单元支持的读取端口的数目相比更多的操作数值。作为响应,所述技术可以将来自GPR 40的操作数值存储到处理元件38A中。处理元件38A可随后执行指令,并且从GPR 40中读取操作数值中的一个并且从冲突队列42A中读取其它操作数。
[0110] 以此方式,本发明中描述的技术可以在指令的执行之前确定指令的执行是否将引起冲突,其中如果指令的执行引起同时从GPR 40的多个不同的单独的存储器单元的存储器单元中读取与存储器单元支持的读取端口相比更多的值,那么冲突出现。如果确定执行将引起冲突,那么技术可以在指令的执行之前预加载在冲突队列42A中执行指令所需的值。所述技术还可以修改指令以指示待从GPR 40的存储器单元中读取的值中的仅一者以及待从冲突队列42A中读取的其它值。在执行期间,处理元件38A可以从GPR 40的存储器单元中读取值中的一个并且从冲突队列42A中读取其它值。因为所述值并不全部都在GPR 40的相同存储器单元中,不存在冲突,并且处理元件38A可以能够在一个时钟周期中(例如,同时)读取全部的值。
[0111] 如所说明,在一些实例中,处理元件38A还可包括预提取队列44A。预提取队列44可用于存储将是随后指令所需的值。举例来说,通过冲突解决,处理元件38A可能需要使用GPR 40的仅一个读取端口,意味着GPR 40的额外的读取端口可以是可供使用的。作为一个实例,在先前情况中,指令最初指导处理元件38A从GPR 40中读取值R0和R4,这意味着在冲突检测单元34确定存在冲突之前,控制单元33确定将利用GPR 40的四个读取端口中的两个,并且可以向两个其它单元授予读取存取权,使得将利用GPR40的全部四个读取端口。
[0112] 随后,在冲突解决之后,值R0存储在冲突队列42A中,并且处理元件38A仅需要使用GPR 40的读取端口中的一个,而非分配到处理元件38A的两个读取端口控制单元33。在此实例中,这意味着到GPR 40的端口中的一个仍是可供使用的。在一些实例中,冲突解决器单元48或控制单元33可以使得处理元件38A使用其余的读取端口来读取用于随后指令的值,并且在预提取队列44A中存储所述值。
[0113] 不应当混淆值的预加载和值的预提取。值的预加载出现在已经引起从存储器单元中读取与存储器单元支持的读取端口相比更多的值的指令的执行之前以缓解冲突。值的预提取出现在用于从存储器单元中读取值的指令的执行期间,所述存储器单元是除了在它的值上将执行算术运算的存储器单元之外的存储器单元,其中所述值是执行随后指令所需的。
[0114] 以下是进一步说明在冲突队列42A和预提取队列44A中的值的存储的实例。在此实例中,处理元件38A执行以下指令:(rpt3)Mad.f32R0,R0,R4,R8。“rpt3”意味着此指令表示四个“Mad”运算(例如,实施指令一次,且随后重复三次)。Mad运算是“乘法和加法”运算,其中两个操作数相乘并且将结果添加到第三操作数。举例来说,(rpt3)Mad.f32R0,R0,R4,R8指令可以分成以下子指令:
[0115] R0=R0*R4+R8;
[0116] R1=R1*R5+R9;
[0117] R2=R2*R6+R10;以及
[0118] R3=R3*R7+R11。
[0119] 出于说明的目的,假设GPR 40包括四个存储器单元,类似于在图3B中说明的实例所述四个存储器单元各自存储值。举例来说,如图3B中所说明,存储器单元28A存储值R0和R4,并且基于此模式将存储值R8。类似地,存储器单元28B存储值R1和R5,并且基于此模式将存储值R9,存储器单元28C存储值R2和R6,并且基于此模式将存储值R10,且存储器单元28D存储值R3和R7,并且基于此模式将存储值R11。
[0120] 类似于图3B,在此实例中,假设GPR 40的第一存储器单元存储值R0、R4和R8,GPR 40的第二存储器单元存储值R1、R5和R9,GPR 40的第三存储器单元存储值R2、R6和R10,并且GPR 40的第四存储器单元存储值R3、R7和R11。此实例说明了“最差情况”情境,其中相应的子指令的全部操作数都存储在同一存储器单元中。因此,对于每个操作数存在冲突。
[0121] 作为一个实例,对于指令R0*R4+R8,R0、R4和R8全部存储在GPR 40的第一存储器单元中,这意味着不可能同时读取全部三个值,这是因为第一存储器单元可能仅具有单个读取端口,并且因此三个值无法被同时(例如,并行)读取。这种情况对于其它三个指令也成立。
[0122] 在本发明中描述的技术中,冲突检测单元34可确定(rpt)Mad.f32R0,R0,R4,R8指令将引起冲突,并且作为响应将确证与指令相关联的“来源冲突”(SC)。冲突解决器单元48可以确定指令的执行将引起基于SC位的冲突。作为响应,冲突解决器单元48可以确定当GPR 40的全部读取端口未被使用时以及当第一存储器单元未被读取时的实例。冲突解决器单元
48可随后使得处理元件38A在冲突队列42A中存储R0、R4或R8中的一个(假设是R4)或在所确定的实例中在冲突队列42A中直接地存储R0、R4或R8中的一个(假设是R4)。因为在此实例中存在三个冲突操作数,所以冲突解决器单元48还可以确定当GPR 40的全部读取端口未被使用时以及当第一存储器单元未被读取时的另一个实例。冲突解决器单元48可随后使得处理元件38A存储R0或R8中的一个(假设是R8),这是因为R4还存储在冲突队列42A中、在冲突队列42A中或在所确定的实例中在冲突队列42A中直接地存储R0或R8中的一个(假设是R8)。
[0123] 在此实例中,冲突解决器单元48可以使得在通过处理元件38A的指令的执行之前处理元件38A在冲突队列42A中存储值R4和R8(或者可直接地存储值R4和R8)。在一 些实例中,冲突解决器单元48可修改处理元件38A将执行的指令,使得处理元件38A从冲突队列42A中而不是从GPR 40中读取R4和R8值。换句话说,在执行期间,处理元件38A可以从GPR 40的第一存储器单元中读取至少一个值(例如,R0)并且从冲突队列42A中读取至少一个值(例如,R4和R8)。
[0124] 并且,R0=R0*R4+R8的初始指令意味着在指令的执行期间处理元件38A将使用GPR 40的三个读取端口。然而,因为在经修改指令的执行期间值R4和R8存储在冲突队列42A中,所以处理元件38A可能仅需要读取端口中的一个来读取R0值。这意味着GPR 40的两个读取端口是可供使用的。
[0125] 在一些实例中,在其中一或多个读取端口是可供使用的经修改指令的执行期间,冲突解决器单元48可使得处理元件38A针对待执行的下一指令预提取值或者针对待执行的下一指令直接预提取值。在此实例中,预提取的值在与包括当前指令的执行所需的被读取的值的存储器单元不同的存储器单元中。
[0126] 举例来说,如上文所述,处理元件38A将执行的下一指令是R1=R1*R5+R9。并且,在以上实例中,在执行期间,处理元件38A将从第一存储器单元中读取R0、从冲突队列42A中读取值R4和R8,意味着GPR 40的两个读取端口是可供使用的。在此实例中,处理元件38A或冲突解决器单元48可使用两个读取端口中的一个来读取值R1、R5或R9中的一个(假设是R5),所述值全部存储在GPR 40的第二存储器单元中,并且将所述值存储在预提取队列44A中。
[0127] 在一些情况下,处理元件38A或冲突解决器单元48将已经从两个可供使用的读取端口中的另一者中读取R1或R9中的一个(R5是通过两个可供使用的读取端口中的一个读取的)。然而,在此最差情况情境中,R1和R9两者都存储在与R5相同的存储器单元中(例如,GPR 40的第二存储器单元)。这意味着当GPR 40的第二存储器单元的单个读取端口用于读取值R5时,使用GPR 40的两个可供使用的读取端口中的一个。在此实例中,处理元件38A或冲突解决器单元48可能不能够使用GPR 40的两个可供使用的读取端口中的另一者来读取值R1或R9,这是因为GPR 40的第二存储器单元的单个读取端口正在被使用。
[0128] 在本发明中描述的技术中,因为R1或R9都无法与R5同时读取,所以冲突解决器单元48或处理元件38A可以从当前并未从中读取的存储器单元中读取下一指令的值。举例来说,下一指令是R2=R2*R6+R10。如上文所述,R2、R6和R10全部存储在GPR40的第三存储器单元中。在一些实例中,冲突解决器单元48或处理元件38A可以在读取值R0和R5的指令的执行期间读取值R2、R6或R10中的一个(假设是R10),并且在 预提取队列44A中存储R10。
[0129] 在此实例中,R0=R0*R4+R8的初始指令可已经包括子指令以从三个读取端口(SRC0到SRC2)中读取R0、R4和R8。举例来说,子指令可以是:读取R0(SRC0)、R4(SRC1)、R8(SRC2)。根据本发明中描述的技术,冲突解决器单元48或控制单元33可修改指令(例如,上文的子指令),使得子指令如下:读取R0(SRC0)、R5(SRC1)、R10(SRC2)。以此方式,冲突解决器单元48或控制单元33可修改指令以包括从GPR 40的第二不同存储器单元中读取至少一个值的指令。举例来说,从同一存储器单元中读取三个值所需要的初始指令和经修改指令需要从GPR 40的不同存储器单元中读取R5和R10,其中来自GPR 40的不同存储器单元的R5和R10值是用于随后指令的操作数。在此实例中,R5是用于随后指令R1=R1*R5+R9的操作数,并且R10是用于另一随后指令R2=R2*R6+R10的操作数。
[0130] 对子指令进行修改的原因是因为冲突解决器单元48可能在执行之前已经将值R4和R8存储到冲突队列42A中。并且,在执行期间将仅使用SRC0,意味着SRC1和SRC2是空闲的,这是因为值R4和R8先前存储在冲突队列42A中。因此,在此实例中,冲突解决器单元48可修改子指令以通过SRC1读取R5,而不是通过SRC1读取R4。并且,因为R9无法与R5并行读取(两者都在同一存储器单元)中,所以冲突解决器单元48可修改子指令以通过SRC2读取R10,而不是通过SRC2读取R8。
[0131] 以此方式,在经修改的指令(即,经修改的子指令)的执行期间,处理元件38A可从GPR 40的第一存储器单元中读取至少一个值(例如,R1值)并且从GPR 40的第二存储器单元中读取至少一个值(例如,R5值)。处理元件38A可将来自GPR 40的第二存储器单元的至少一个值(例如,R5值)存储在处理元件38A的预提取队列44A中。处理元件38A的算术流水线46A可以从预提取队列44A中读取以用于实施由随后指令限定的运算作为执行随后指令的一部分。举例来说,算术流水线46A可从预提取队列44A中读取以实施运算R1=R1*R5+R9作为执行随后指令R1*R5+R9的一部分。
[0132] 上述实例是相对于R0、R1和R2的前三个指令描述的以用于读取值R0、R4、R8、R5和R10。冲突解决器单元48可以执行类似步骤以用于读取其它值。举例来说,冲突解决器单元48可以直接或可以使得处理元件38A读取值R9以用于存储在冲突队列42A中,这是因为处理元件38A可以在执行期间读取值R1并且值R5是先前存储在预提取队列44A中的。
[0133] 以此方式,以下伪码说明处理元件38A可以执行的指令(作为经修改的)。为了便于说明,未示出处理元件38A或冲突解决器单元48执行以在冲突队列42A中存储值的指 令。换句话说,应理解当处理元件38A执行以下指令时,实施指令所需的值中的一些已经存储在冲突队列42A中,并且以下指令仅示出尚未读取的那些值。举例来说,在以下指令中,未说明值R4和R8的存储,这是因为值R4和R8在指令的执行之前已经存储在冲突队列42A中。
[0134] 周期0:读取R0(SRC0)、R5(SRC1)、R10(SRC2)
[0135] 周期1:读取R1(SRC0)、R6(SRC1)、R11(SRC2)
[0136] 周期2:读取R2(SRC0)、R7(SRC1)
[0137] 周期3:读取R3(SRC0)。
[0138] 可以进一步推断上述实例。举例来说,如上文所述,值R0可以表示四个像素的属性(例如,如图3B中所说明,R0表示像素P0到P3的红色分量)。这对于值R1到R11也可以成立(例如,每个值表示四个像素的属性)。在一些情况下,处理元件38A可以从周期0到周期3执行上述子指令两次以处理像素P0到P7。
[0139] 如上文所说明,对于周期2和周期3,并不利用全部读取端口。在一些实例中,对于周期2和周期3,可以利用额外的读取操作以针对像素的下一分组读取像素值。举例来说,如果上述子指令是用于像素P0到P7的,那么额外的读取操作可以被添加到周期2和周期3以用于像素P8到P15。
[0140] 举例来说,子指令可以如下:
[0141] 周期0:读取R0(SRC0)、R5(SRC1)、R10(SRC2)
[0142] 周期1:读取R1(SRC0)、R6(SRC1)、R11(SRC2)
[0143] 周期2:读取R2(SRC0)、R7(SRC1)、R8(SRC2)//此处R8用于P8到P15,同样如上文所述,用于P0到P7的R8已经存储在冲突队列42A中
[0144] 周期3:读取R3(SRC0)、R4(SRC1)、R9(SRC2)//此处R4和R9用于P8到P15,同样如上文所述,用于P0到P7的R4和R9已经存储在冲突队列42A中
[0145] 周期4:读取R0(SRC0)、R5(SRC1)、R10(SRC2)//此处R0、R5和R10全部用于P7到P15[0146] 周期5:读取R1(SRC0)、R6(SRC1)、R11(SRC2)//此处R1、R6和R11全部用于P7到P15[0147] 周期6:读取R2(SRC0)、R7(SRC1)//此处R2和R7用于P7到P15
[0148] 周期7:读取R3(SRC0)//此处R3用于P7到P15
[0149] 一旦用于指令的全部的值是可供使用的,则算术流水线46A可以执行由指令限定的运算。在一些实例中,算术流水线46A可以从由处理元件38A执行的读取操作中接收 值和/或通过冲突队列42A和预提取队列44A的两者中的一或多个接收值。举例来说,为了实施R0=R0*R4+R8Mad运算,算术流水线46A可以接收R0值作为处理元件38A执行的读取指令的一部分,并且可以从冲突队列42A中接收R4和R8值。作为另一实例,为了实施R1=R1*R5+R9Mad运算,算术流水线46A可以从处理元件38A执行的读取操作中接收R1值、从预提取队列44A中接收R5值(例如,其中R5值是同R0值一起读取的),并且从冲突队列42A中接收R9值。
[0150] 因为算术流水线46A可以从不同来源接收值(例如,作为读取的一部分、从冲突队列42A中或从预提取队列44A中),所以算术流水线46A可以包括多个多路复用器,从所述多路复用器中可选择校正输入。举例来说,控制单元33可以输出信号以选择算术流水线46A内的多路复用器的输入,使得操作数是从读取操作、冲突队列42A或预提取队列44A中正确地选择的。
[0151] 如上文所述,冲突解决器单元48可经配置以在将引起冲突的指令的执行之前使得处理元件38A从GPR 40中读取值。下文描述一种实例方式,其中冲突解决器单元48可执行此类功能。控制单元33可以被视为在执行指令时被调度的调度器。
[0152] 冲突解决器单元48可选取一个表项(标签ID 0或1)并且可以设置脏位以用于所选择的表项。冲突解决器单元48可随后发布命令给处理元件38A以读取操作数值中的一个或直接地读取操作数值中的一个。冲突解决器单元48可随后向控制单元33确认值的读取已经完成并且发送返回标签ID“0/1”。控制单元33随后调度具有标签ID“0/1”的指令的执行。控制单元33指导冲突解决器单元48重置脏位并且释放表项。
[0153] 作为一个实例,假设冲突队列42A具有两个表项,表项0和表项1,并且两个表项都是可供使用的并且存在两个位脏旗标D0(标签ID#0)和D1(标签ID#1)以分别表示表项0和表项1。在此实例中,对于R0=R0+R4*R8的第一冲突,冲突队列42A可能需要使用表项0并且当同意存取时,D0将被设置成1。对于R1=R1+R5*R9的另一冲突,冲突队列42A可能需要使用表项1并且当准许访问时,D1将被设置成1。在此情况下,使用两个表项。随后,对于下一冲突,可能存在一些延迟因为D0/D1都是1。指令可发布标签ID=1作为令牌以在整个执行过程中携带以指示从何处检索冲突操作数,并且在冲突队列42A的表项1就绪之后,D1可以被设置成0,并且冲突队列42A的表项1可用于存储另一个冲突操作数。
[0154] 测试显示本发明中描述的技术相对于一些其它技术可以是有利的。举例来说,作为在具有多个端口GPR(例如,六个端口2W4R)的单个存储器单元与具有极少端口(例如,四个1W1R)的多个存储器单元的GPR之间的比较显示存在18%路由数据的平均节省以 及5%到10%的性能增大。此外,尽管上述实例技术是相对于1W1R存储器单元描述的,但是所述技术可以扩展到其它类型的存储器单元,例如1W2R、伪1W1R和其它此类存储器单元。
[0155] 图5是说明根据本发明中所描述的一或多个实例的操作的实例方法的流程图。如所说明,通过着色器核心31的冲突检测单元34,GPU 14可以确定指令的执行是否将引起从GPR 40的第一存储器单元中同时读取与第一存储器单元的读取端口可以输出的值相比更多的值(100)。举例来说,GPR 40的存储器单元可以包括仅单个读取端口和仅单个写入端口。
[0156] 在此类实例中,GPR 40的存储器单元可以仅能够通过存储器单元的单个读取端口输出一个值,并且冲突检测单元34可确定指令的执行是否将引从第一存储器单元中同时读取两个或大于两个值,所述值与第一存储器单元的读取端口可以输出的值相比是更多的值。作为一个实例,如上文所述,R0=R0*R4+R8的执行将需要从GPR 40的第一存储器单元中同时读取三个值(例如,R0、R4和R8),所述值大于第一存储器单元的读取端口可以输出的值(例如,第一存储器单元的读取端口可以输出一个值,但是执行指令将引起三个值由读取端口同时输出)。
[0157] 在指令的执行之前,GPU 14通过冲突解决器单元48或处理元件38A可以基于确定指令的执行将引起从第一存储器单元中同时读取与第一存储器单元的读取端口可以输出的值相比更多的值而将存储在第一存储器单元中的一或多个值存储在冲突队列42A中(102)。举例来说,如上文所述,冲突解决器单元48或处理元件38A可以在R0=R0*R4+R8的执行之前将值R4和R8存储在冲突队列42A中。冲突队列42A与GPR 40分离。举例来说,处理元件38A包括冲突队列42A。
[0158] 在此实例中,冲突解决器单元48可以确定当GPR 40的全部读取端口不在使用中时并且当一或多个值未从第一存储器单元中读取时的实例。冲突解决器单元48或处理元件38A可以在所述所确定的实例期间将存储在第一存储器单元中的一或多个值存储在冲突队列42A中。举例来说,尽管GPR 40的每个存储器单元可具有有限的端口(例如,仅一个读取端口和仅一个写入端口),但是GPR 40本身可具有多个端口,如通过例如输入交叉开关30和输出交叉开关32的输入交叉开关和输出交叉开关所设置的。在此情况下,如果GPR 40的输出交叉开关的全部的输出未被使用并且GPR的第一存储器单元未被存取,那么冲突解决器单元48或处理元件38A可以能够从第一存储器单元中读取R4或R8值并且将所述值存储在冲突队列42A中以用于R0=R0*R4+R8指令的稍后执行。
[0159] 在一些实例中,通过着色器核心31和处理元件38A,GPU 14可执行指令以实施由 使用来自第一存储器单元的值和来自冲突队列42A的值作为操作数的指令限定的运算(108)。举例来说,处理元件38A可执行指令R0=R0*R4+R8以实施由所述指令限定的MAD(乘法和加法)运算。在此实例中,算术流水线46A使用来自GPR 40的第一存储器单元的至少一个值(例如,R0)和来自冲突队列42A的至少一个值(例如,R4和R8)作为操作数。
[0160] 在本发明中描述的技术中,并非立刻执行指令以实施由指令限定的运算,冲突解决器单元48和/或控制单元33可修改指令以包括从GPR 40的第二不同存储器单元中读取至少一个值的指令(104)。来自GPR 40的第二存储器单元的值是用于随后指令的操作数。举例来说,控制单元33或冲突解决器单元48可修改读取R0、R4、R8指令以读取R0、R5、R10,其中R5和R10值是用于随后指令的操作数。在此实例中,在经修改的指令的执行期间处理元件38A可从第一存储器单元中读取至少一个值(例如,R0)并且从第二存储器单元中读取至少一个值(例如,R5)。
[0161] 在一些实例中,控制单元33或冲突解决器单元48可修改指令以从GPR 40的第二存储器单元中读取至少一个值,前提是并未使用GPR 40的全部的端口并且并未使用第二存储器单元的读取端口。举例来说,处理元件38A可读取值R5和R10,前提是并未使用GPR 40的全部的读取端口(将是这种情况因为值R4和R8不再是从GPR 40中读取的)并且并未使用第二存储器单元的读取端口。作为一个实例,因为第二存储器单元的读取端口用于读取R5值,所以处理元件38A可能无法同时读取R9值与R5值。
[0162] 通过处理元件38A或冲突解决器单元48,GPU 14可以将来自第二存储器单元中的值存储在处理元件38A的预提取队列44A中(106)。处理元件38A可以从预提取队列44中读取以用于实施由随后指令限定的运算作为执行随后指令的一部分。举例来说,为了实施R1=R1*R5+R9,算术流水线46A可以从预提取队列44A中读取R5值。
[0163] 在一些实例中,在将来自第二存储器单元的值存储在预提取队列44A中之后,所述值可以仍然存储在预提取队列44A中。处理元件38A可执行指令以实施由使用来自第一存储器单元的值和来自冲突队列42A的值的指令限定的运算(108)。随后,在随后指令的执行期间,处理元件38A可使用从第二存储器单元中读取的值中的一或多个、存储在冲突队列42A中的值和/或存储在预提取队列44A中的值。
[0164] 在一或多个实例中,所描述的功能可以硬件、软件、固件或其任何组合来实施。如果在软件中实施,那么功能可作为一或多个指令或代码存储在计算机可读媒体上或经由计算机可读媒体传输,且通过基于硬件的处理单元执行。计算机可读媒体可以包括计算机可读存储媒体,其对应于例如数据存储媒体的有形媒体。以此方式,计算机可读媒体 通常可以对应于非暂时性的有形的计算机可读存储媒体。数据存储媒体可为可由一或多个计算机或一或多个处理器存取以检索用于实施本发明中描述的技术的指令、代码和/或数据结构的任何可供使用的媒体。计算机程序产品可以包括计算机可读媒体。
[0165] 借助于实例而非限制,此类计算机可读存储媒体可以包括RAM、ROM、EEPROM、CD-ROM或其它光盘存储装置、磁盘存储装置或其它磁性存储装置、快闪存储器或可用于存储呈指令或数据结构的形式的所需要的程序代码且可由计算机存取的任何其它媒体。应理解,计算机可读存储媒体和数据存储媒体并不包括载波、信号或其它暂时性媒体,而是针对非暂时性有形存储媒体。如本文所使用,磁盘和光盘包括压缩光盘(CD)、激光光盘、光学光盘、数字多功能光盘(DVD)、软盘和蓝光光盘,其中磁盘通常以磁性方式再现数据,而光盘用激光以光学方式再现数据。上述的组合也应包含于计算机可读媒体的范围内。
[0166] 指令可由一或多个处理器执行,所述一或多个处理器例如是一或多个数字信号处理器(DSP)、通用微处理器、专用集成电路(ASIC)、现场可编程逻辑阵列(FPGA),或其它等效的集成或离散逻辑电路。因此,如本文中所使用的术语“处理器”可指代上述结构或适用于实施本文中所描述的技术的任何其它结构中的任一者。此外,在一些方面中,本文中所描述的功能性可在经配置用于编码和解码的专用硬件和/或软件模块内提供,或并入在组合编解码器中。而且,可将所述技术完全实施于一或多个电路或逻辑元件中。
[0167] 本发明的技术可在各种各样的装置或设备中实施,包括无线手持机、集成电路(IC)或一组IC(例如,芯片组)。本发明中所描述的各种组件、模块或单元是为了强调经配置以执行所公开的技术的装置的功能性方面,但未必需要通过不同硬件单元来实现。实际上,如上文所描述,各种单元可结合适当的软件和/或固件组合在编解码器硬件单元中,或由互操作硬件单元的集合来提供,所述硬件单元包括如上文所描述的一或多个处理器。
[0168] 已描述各种实例。这些和其它实例在所附权利要求书的范围内。