发明内容
本申请能够节省顶点占用的GPR资源,提升GPU性能。
为了达到上述目的,本申请提供了以下技术方案:
第一方面,本申请提供了一种图形处理单元,图形处理单元包括:调度执行器,用于接收顶点输出指令,所述顶点输出指令包括顶点标识;顶点数据输出模块,用于根据所述顶点输出指令将属性数据写入所述顶点标识对应的顶点缓冲区中的存储位置。
可选的,所述顶点输出指令具有顶点标识域,所述顶点标识域的值表示所述顶点标识。
可选的,所述顶点标识域占用至多8个比特。
可选的,所述顶点输出指令还包括属性数据的标识以及源寄存器,所述顶点数据输出模块将所述源寄存器中的数据作为所述属性数据的标识指示的属性数据,并写入所述顶点标识对应的顶点缓冲区中的存储位置。
可选的,所述调度执行器解析所述顶点输出指令,将所述顶点标识发送至所述顶点数据输出模块。
第二方面,本申请提供了一种指令编译方法,指令编译方法包括:生成顶点输出指令,所述顶点输出指令包括顶点标识,所述顶点输出指令用于指示将属性数据写入所述顶点标识对应的顶点缓冲区中的存储位置;发送所述顶点输出指令。
可选的,所述顶点输出指令具有顶点标识域,所述顶点标识域的值表示所述顶点标识。
可选的,所述生成顶点输出指令包括:获取外壳着色器输出的顶点信息;根据所述顶点信息生成顶点标识,并生成所述顶点输出指令。
第三方面,本申请提供了一种指令编译装置,指令编译装置包括:指令生成模块,用于生成顶点输出指令,所述顶点输出指令包括顶点标识,所述顶点输出指令用于指示将属性数据写入所述顶点标识对应的顶点缓冲区中的存储位置;通信模块,用于发送所述顶点输出指令。
第四方面,本申请提供了一种终端设备,其特征在于,包括第一方面所述的图形处理单元。
第五方面,本申请提供了一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器运行时执行所述指令编译方法的步骤。
与现有技术相比,本申请技术方案具有以下有益效果:
本申请技术方案中的顶点输出指令包括顶点的标识,该顶点输出指令可以指示将属性数据写入顶点的标识对应的顶点缓冲区。顶点数据输出模块可以直接根据顶点输出指令直接将属性数据写入顶点标识对应的顶点缓冲区中的存储位置,无需等待该顶点标识对应的其他属性数据,从而可以占用更少的GPR资源,提升GPU性能;此外,还能够使得顶点的属性数据的存储具有更高的灵活性。
进一步地,申请技术方案中,由于顶点输出指令中携带了顶点标识,使得顶点输出指令无需按照顶点标识从小到大的顺序来生成,提升了指令生成的灵活性。
进一步地,申请通过对顶点输出指令的架构进行更改,在顶点输出指令中增加顶点标识域来指示顶点标识,使顶点数据输出模块能够直接根据顶点标识域的值来确定顶点标识,保证了顶点的属性数据存储的效率。
具体实施方式
如背景技术中所述,现有技术中存在大量的GPR资源被占用,导致GPU并行运行的线程组(warp)数目减少,降低GPU性能。
具体地,外壳着色器执行任务时,外壳着色器中的顶点生成函数的输入是一个输入面片,每调用一次就生成一个输出顶点,多个输出顶点组成一个输出面片。顶点生成函数会指定输出面片尺寸来表征一个输出面片的顶点数目。该函数的输出变量逐个顶点(pervertex)地传递到域着色器。每一顶点输出被聚合成为数组 如:out vec2 vertexTexCoord[];数组的尺寸等于面片尺寸。顶点生成函数每调用一次就往顶点属性输出数组中写入一个输出数据。同一个面片的顶点生成函数的调用,可以互相访问彼此的输出变量,即第二次调用可以访问第一次调用输出的变量,第一次调用可以访问第二次调用输出的变量。但是前提是被访问的输出变量必须是被写入顶点属性输出数组,否则值就是未定义。为了确保所有的调用都写入到输出变量,这需要调用之间的同步。这个需要通过函数barrier(主要是用作集合线程,然后再一起往下执行)来完成,当执行时,需要所有的调用都到达barrier函数的位置时,才往函数的下面执行。
具体地,顶点输出指令示例如下所示,
EMITF ocp[0].xyzw , r0
EMITF.ve ocp[1].xyzw , r1
其中,EMITF表示顶点输出指令,第一条指令表示将寄存器r0-r3 中的数据输出作为外壳着色器当前输出顶点的第0个属性,xyzw表示具体的属性,如坐标、纹理等;第二条指令表示将寄存器r1-r4中的数据输出作为外壳着色器当前输出顶点的第1个属性。此外,第二条指令具有vend标记,表示输出第1个属性后,该顶点的属性数据全部完成,顶点的标识从0变成1。从上述顶点输出指令中可以看出,现有技术是通过累计vend标记的方式确定顶点的标识。
如果遇到外壳着色器的顶点输出函数调用同步的情况,即外壳着色器中在顶点的属性赋值语句后出现函数barrier()的场景下,必须要把函数barrier()前生成的顶点属性数据保存在GPR中,当GPR资源不够时还要将顶点属性数据写入到外部存储器中,直到输出顶点的其他所有属性数据全部生成,再把GPR中的或者从外部存储器中读回顶点属性数据,再按顶点标识从小到大的顺序依次输出各个控制点的属性数据到顶点数据缓冲区中,写入外部存储器以及从外部存储器读取操作会显著降低GPU性能。此外,还会导致大量的GPR资源被占用,GPR资源是非常稀缺的运算资源,进而导致GPU并行运行的warp数目减少,影响GPU性能。
此外,编译器(compiler)生成顶点输出指令必须严格保证外壳着色器输出的顶点标识从小到大的顺序,依次输出顶点的属性数据,大大减少了指令生成的灵活性。
本申请技术方案中的顶点输出指令包括顶点的标识,该顶点输出指令可以指示将属性数据写入顶点的标识对应的顶点缓冲区。顶点数据输出模块可以直接根据顶点输出指令直接将属性数据写入顶点标识对应的顶点缓冲区中的存储位置,无需等待该顶点标识对应的其他属性数据,从而可以占用更少的GPR资源,提升GPU性能;此外,还能够使得顶点的属性数据的存储具有更高的灵活性。
进一步地,生成顶点输出指令,顶点输出指令包括顶点标识,顶点输出指令用于指示将属性数据写入顶点标识对应的顶点缓冲区中的存储位置。本申请技术方案中,由于顶点输出指令中携带了顶点标识,使得顶点输出指令无需按照顶点标识从小到大的顺序来生成,提升了指令生成的灵活性。
为使本申请的上述目的、特征和优点能够更为明显易懂,下面结合附图对本申请的具体实施例做详细的说明。
参见图1,指令编译方法可以由编译器运行,也即由编译器执行指令编译方法的各个步骤,以生成并发送顶点输出指令。当然可以理解的是,指令编译方法也可以由其他任意适当的主体来执行。
具体地,指令编译方法具体可以包括以下步骤:
步骤101:生成顶点输出指令。其中,顶点输出指令包括顶点标识。
步骤102:发送顶点输出指令。
可以理解的是,在具体实施中,上述方法的各个步骤可以采用软件程序的方式实现,该软件程序运行于芯片或芯片模组内部集成的处理器中。该方法也可以采用软件结合硬件的方式实现,本申请不作限制。
本实施例中,每一顶点输出指令用于控制输出一个属性数据,每一顶点可以具有多个属性数据。
本实施例中对指令集架构(Instruction Set Architectures, ISA)进行更改,使顶点输出指令携带顶点标识的信息。顶点输出指令是用于指示存储属性数据的指令,而顶点标识与属性数据要存储的位置相关,因此通过在指令中直接指示顶点标识,有助于后续顶点数据模块直接存储属性数据,避免属性数据被存储至GPR,从而节省GPR资源。
具体地,顶点输出指令具有顶点标识域,顶点标识域的值表示顶点标识。更具体地,顶点标识域可以是顶点输出指令中的空闲比特。
例如,顶点标识域占用5个比特,可以用于表示32个顶点标识。
又例如,顶点标识域占用8个比特,可以用于表示256个顶点标识。
需要说明的是,根据实际应用场景的不同,顶点标识域也可以占用其他任意可实施数量的比特,本申请对此不作限制。
更具体地,顶点输出指令还包括属性数据的标识以及源寄存器。源寄存器中的数据作为属性数据的标识指示的属性数据。
具体地,顶点输出指令的具体形式如下:
EMITF ocp[1][0].xyzw , r0
其中,EMITF表示顶点输出指令,ocp[1]表示顶点标识1,[0]表示属性数据的标识0,xyzw表示具体的属性,如坐标、纹理等,r0表示源寄存器。该指令表示将寄存器r0-r3 中的数据输出作为顶点1的第0个属性数据。
相对于现有的顶点输出指令,本发明实施例中的顶点输出指令不再带有vend标记,并且具有顶点标识域来表示顶点标识。
在步骤101的一种具体实施方式中,编译器可以从外壳着色器获取顶点信息,具体可以是外壳着色器关于输出顶点的声明信息。编译器根据顶点信息生成顶点标识,并生成顶点输出指令。
例如,外壳着色器声明了4个顶点:Layout (vertices = 4) out。编译器获取上述声明信息,并且了解顶点标识的变化规律,也即顶点标识按照从小到大的顺序排列:0 ->1->2 ->3。编译器可以据此生成顶点标识。由此,编译器可以结合属性数据以及源寄存器顶点输出指令:
EMITF ocp[0][0].xyzw , r0
EMITF ocp[1][0].xyzw , r4
EMITF ocp[2][0].xyzw , r8
EMITF ocp[3][0].xyzw , r12。
此外,编译器也可以根据外壳着色器声明的顶点信息生成属性数据的标识。例如,外壳着色器声明了2个顶点的属性:Out ivec4 test_vector[],Out ivec4 test_vector2[]。那么,编译器可以据此生成属性数据的标识0和1。
请参照图2,图2示出了一种图形处理单元的结构。图形处理单元可以包括调度执行器201和顶点数据输出模块202。其中,调度执行器201用于接收顶点输出指令,顶点输出指令包括顶点标识。
具体地,编译器生成顶点输出指令,并将顶点输出指令发送至调度执行器201。
继续参照图1,调度执行器201将顶点输出指令转发至顶点数据输出模块202。顶点数据输出模块202根据顶点输出指令将属性数据写入顶点标识对应的顶点缓冲区203中的存储位置。
具体地,调度执行器201可以解析顶点输出指令,从中解析出顶点标识,并将顶点标识发送至顶点数据输出模块202。
具体地,每个输出面片的顶点保存在一块连续的顶点缓冲区203中,面片中每个顶点根据一定的布局(layout)摆放在特定的位置。也就是说,对于顶点数据输出模块202,获知顶点标识即可获知该顶点对应的顶点缓冲区203。由于每一顶点具有多个属性数据,每一属性数据在顶点缓冲区203中可以具有对应的存储位置。
具体可参照图3,V0表示顶点标识0,E0表示属性数据标识0,E1表示属性数据标识1,C0、C1、C2以及C3表示顶点输出指令中的具体的属性数据xyzw。从图3中可以看出,顶点标识0的属性数据0以及属性数据1分别存储在对应的存储位置。
需要说明的是,关于顶点的各个属性数据在顶点缓冲区203中对应存储位置的具体计算方式可以参照现有技术,本申请对此不作限制。
进一步地,顶点输出指令还包括属性数据的标识以及源寄存器,顶点数据输出模块202将源寄存器中的数据作为属性数据的标识指示的属性数据,并写入顶点标识对应的顶点缓冲区203中的存储位置。
具体地,调度执行器201可以解析顶点输出指令,从中解析出属性数据的标识以及源寄存器,并将属性数据的标识以及源寄存器发送至顶点数据输出模块202。
具体地,顶点数据输出模块202从源寄存器中读取数据作为属性数据的标识指示的属性数据,并将其写入顶点标识对应的顶点缓冲区203中的存储位置。
由于顶点输出指令不再带有vend标记,相应地在本实施例中,顶点数据输出模块202中不再设置有顶点计数器,不再通过累计vend的方式来确定当前顶点的标识,而是直接使用顶点输出指令中的顶点标识把顶点的属性数据写入到对应的顶点缓冲区203中。本发明实施例能够实现将任意顶点的任意属性数据存储至顶点缓冲区203,而不受顶点标识大小的约束,提升了顶点属性数据存储的灵活性。
请参照图4,图4示出了另一种图形处理单元的结构。
如图4所示,外壳着色器405为缝合器406提供细分参数,如三角形数量、四边形数量(tessellation levels),其决定缝合器406能够细分出多少小的图元。缝合器406以从外壳着色器405接收到的细分参数,细分出一系列单元图元顶点。外壳着色器405同时为域着色器407提供面片数据,具体可以是顶点的属性数据(顶点的坐标位置、细分参数灯)和面片常量。具体地,域着色器407从顶点缓冲区403中读取顶点的属性数据。具体地,域着色器407由从外壳着色器405接收到的面片数据把从缝合器406接收到的单元图元顶点生成实际的顶点数据。
当GPU 流水线运行到外壳着色器405阶段时,外壳着色器405的线程构造器组建外壳着色器405的输入顶点面片,打包成外壳着色器线程任务,再发往调度执行器401执行运算,外壳着色器线程构造器在打包一个线程时,预分配好当前线程需要的顶点缓冲区403,再发往调度执行器401去执行。具体地,外壳着色器405执行任务时,其中的顶点生成函数每调用一次,生成一个输出顶点。顶点的属性数据存放在寄存器408(例如GPR)中。
具体地,编译器404生成顶点输出指令,并发送给调度执行器401。调度执行器401解析顶点输出指令,将顶点输出指令中的顶点标识、属性数据的标识以及源寄存器的标识发送给顶点数据输出模块402。顶点数据输出模块402从对应的寄存器408中读取属性数据,并将其存储至顶点标识对应的顶点缓冲区403中。
相对于现有技术,本发明实施例能够节省寄存器资源。
例如,外壳着色器405先生成顶点0、顶点1以及顶点2的属性数据0,再生成顶点0、顶点1以及顶点2的属性数据1。按照现有技术,在顶点0、顶点1以及顶点2的属性数据0生成后,均需要存储至寄存器408中,并等待顶点0的属性数据1生成并输出后,顶点1以及顶点2的属性数据0才能输出。
而在本发明中,在顶点0、顶点1以及顶点2的属性数据0生成后,顶点1以及顶点2的属性数据0无需等待顶点0的属性数据1生成,可以在生成顶点0的属性数据1之前,通过顶点输出指令输出至顶点缓冲区403中,能够及时释放寄存器资源,提升GPU性能。
关于本申请实施例的更多具体实现方式,请参照前述实施例,此处不再赘述。
请参照图5,图5示出了一种指令编译装置。指令编译装置包括:
指令生成模块501,用于生成顶点输出指令,所述顶点输出指令包括顶点标识,所述顶点输出指令用于指示将属性数据写入所述顶点标识对应的顶点缓冲区中的存储位置;
通信模块502,用于发送所述顶点输出指令。
本发明实施例中,由于顶点输出指令中携带了顶点标识,使得顶点输出指令无需按照顶点标识从小到大的顺序来生成,提升了指令生成的灵活性。
关于上述实施例中描述的各个装置、产品包含的各个模块/单元,其可以是软件模块/单元,也可以是硬件模块/单元,或者也可以部分是软件模块/单元,部分是硬件模块/单元。例如,对于应用于或集成于芯片的各个装置、产品,其包含的各个模块/单元可以都采用电路等硬件的方式实现,或者,至少部分模块/单元可以采用软件程序的方式实现,该软件程序运行于芯片内部集成的处理器,剩余的(如果有)部分模块/单元可以采用电路等硬件方式实现;对于应用于或集成于芯片模组的各个装置、产品,其包含的各个模块/单元可以都采用电路等硬件的方式实现,不同的模块/单元可以位于芯片模组的同一组件(例如芯片、电路模块等)或者不同组件中,或者,至少部分模块/单元可以采用软件程序的方式实现,该软件程序运行于芯片模组内部集成的处理器,剩余的(如果有)部分模块/单元可以采用电路等硬件方式实现;对于应用于或集成于终端设备的各个装置、产品,其包含的各个模块/单元可以都采用电路等硬件的方式实现,不同的模块/单元可以位于终端设备内同一组件(例如,芯片、电路模块等)或者不同组件中,或者,至少部分模块/单元可以采用软件程序的方式实现,该软件程序运行于终端设备内部集成的处理器,剩余的(如果有)部分模块/单元可以采用电路等硬件方式实现。
本申请实施例还公开了一种存储介质,所述存储介质为计算机可读存储介质,其上存储有计算机程序,所述计算机程序运行时可以执行图1中所示方法的步骤。所述存储介质可以包括只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random AccessMemory,RAM)、磁盘或光盘等。存储介质还可以包括非挥发性存储器(non-volatile)或者非瞬态(non-transitory)存储器等。
本申请实施例还公开了一种终端设备,所述终端设备包括前述的图形处理单元;或者,终端设备包括存储器和处理器,存储器上存储有可在处理器上运行的计算机程序,处理器运行计算机程序时执行前述指令编译方法的步骤。
本申请实施例中出现的“多个”是指两个或两个以上。
本申请实施例中出现的第一、第二等描述,仅作示意与区分描述对象之用,没有次序之分,也不表示本申请实施例中对设备个数的特别限定,不能构成对本申请实施例的任何限制。
上述实施例,可以全部或部分地通过软件、硬件、固件或其他任意组合来实现。当使用软件实现时,上述实施例可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令或计算机程序。在计算机上加载或执行所述计算机指令或计算机程序时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以为通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线或无线方式向另一个网站站点、计算机、服务器或数据中心进行传输。
应理解,在本申请的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。
在本申请所提供的几个实施例中,应该理解到,所揭露的方法、装置和系统,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的;例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式;例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理包括,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的部分步骤。
虽然本申请披露如上,但本申请并非限定于此。任何本领域技术人员,在不脱离本申请的精神和范围内,均可作各种更动与修改,因此本申请的保护范围应当以权利要求所限定的范围为准。