具体实施方式
在处理具有依赖关系的伪指令,如读之后读(Read After Read,RAR)、读之后写(Write After Read,WAR)、写之后写(Write After Write,WAW)等类型的伪指令时,通常的做法是在伪指令对应的相关寄存器上加锁,以保证伪指令正确执行。
对于如下伪指令:
SMP r5, [r0],ts#0 //从ts#0和r0寄存器共同确定的纹理位置采样数据并返回到r5寄存器。
SMP r6, [r0],ts#1 //从ts#1和r0寄存器共同确定的纹理位置采样数据并返回到r6寄存器。
SMP r7, [r0],ts#2 //从ts#2和r0寄存器共同确定的纹理位置采样数据并返回到r7寄存器。
MOV r0, r1 //把r1寄存器的值赋值给r0寄存器。
在上述伪指令中,由于在上述伪伪指令发射之后r0寄存器中的值可能会被MOV伪指令改写,因此,在每一条SMP伪指令执行时,都需要给r0寄存器加锁,以保证执行结果的一致性。
可见,上述伪指令中,每条SMP伪指令都需要等待前一条SMP伪指令执行完成,且解除对r0寄存器的锁定状态才能执行。对于SMP伪指令而言,因为需要从纹理存储器中读取数据,而解除r0寄存器的锁定状态通常需要几十个到数百个时钟周期,导致伪指令处理所耗费的时长较长,伪指令处理效率较差。
此外,对于内存的连续读取的应用场景,也同样因为寄存器的锁定,需要前一条伪指令解除相同寄存器的锁定状态后,才能执行下一条伪指令,因此,也存在上述同样的问题。
在本发明实施例中,检测待处理的目标伪指令中的指示位,若目标伪指令中的指示位指示无需对源寄存器进行锁定,则直接执行目标伪指令,故而无需等待目标伪指令执行完成之后才能执行下一条伪指令,从而可以有效降低执行伪指令所耗费的时长,提高伪指令执行的效率。
为使本发明的上述目的、特征和有益效果能够更为明显易懂,下面结合附图对本发明的具体实施例做详细的说明。
本发明实施例提供了一种伪指令处理方法,参照图1,以下通过具体步骤进行详细说明。
步骤S101,检测待处理的目标伪指令中的指示位。
在具体实施中,待处理的目标伪指令可以为连续的存在依赖关系的多条伪指令中的任一条伪指令。上述的存在依赖关系的多条伪指令,可以是指存在依赖关系的多条应用于图形处理领域的伪指令。
在本发明实施例中,存在依赖关系的多条伪指令可以是指:对同一寄存器进行相同操作的多条伪指令。本发明实施例中所述的同一寄存器,可以是指同一源寄存器,也可以是指同一目的寄存器。
也就是说,若多条连续的伪指令对同一源寄存器执行相同的操作,则可以将上述多条连续的伪指令认定为存在依赖关系的多条伪指令。或者,若多条连续的伪指令对同一目的寄存器执行相同的操作,则可以将上述多条连续的伪指令认定为存在依赖关系的多条伪指令。
例如,如下连续的三条伪伪指令中,伪指令1为:SMP r5, [r0],ts#0,表征从ts#0和r0寄存器共同确定的纹理位置采样数据并返回到r5寄存器;伪指令2为:SMP r6, [r0],ts#1,表征从ts#1和r0寄存器共同确定的纹理位置采样数据并返回到r6寄存器;伪指令3为SMP r7, [r0],ts#2,表征ts#2和r0寄存器共同确定的纹理位置采样数据并返回到r7寄存器。
可见,上述伪指令1、伪指令2以及伪指令3中,均对源寄存器(r0寄存器)进行数据读取操作,因此,上述伪指令1、伪指令2以及伪指令3为存在依赖关系的伪指令。
在本发明实施例中,在指令集(ISA)中,针对每一条伪指令,可以在该伪指令中设置指示位,该指示位可以用于指示该伪指令涉及的寄存器是否需要进行锁定。通过指示位的不同取值,来确定该伪指令涉及的寄存器需要进行锁定,或者不需要进行锁定。
在本发明实施例中,指示位的长度可以为n比特,n为正整数且n≥1。
在本发明一实施例中,n=1,也即通过1比特的指示位来指示该伪指令涉及的寄存器是否需要进行锁定。当指示位的取值为1时,表征指示位有效,该伪指令涉及的寄存器不需要进行锁定;当指示位的取值为0时,表征指示位无效,该伪指令涉及的寄存器需要进行锁定。
可以理解的是,也可以设置当指示位的取值为0时,表征指示位有效,该伪指令涉及的寄存器不需要进行锁定;当指示位的取值为1时,表征指示位无效,该伪指令涉及的寄存器需要进行锁定。
在具体实施中,编译器在接收到伪指令后,可以对伪指令进行相应的编译操作。若编译器检测到存在依赖关系的N条待处理的命令,则编译器可以对N条待处理的伪指令对应的指示位分别进行配置。
在本发明实施例中,编译器可以配置前N-1条待处理的伪指令对应的指示位有效,配置第N条待处理的伪指令对应的指示位无效。
步骤S102,若指示位指示无需对寄存器进行锁定,则直接执行目标伪指令。
在具体实施中,若目标伪指令中的指示位有效,也即指示位指示无需对寄存器进行锁定,故可以直接执行目标伪指令。
在本发明实施例中,直接执行目标伪指令,可以是指在执行目标伪指令之前,不需要检测寄存器的锁定状态。换言之,无论寄存器是否处于锁定状态,均可以直接执行目标伪指令。
在具体应用中,可以存在相应的锁定标志,来表征寄存器是否处于锁定状态。
在本发明实施例中,若目标伪指令的指示位指示无需对寄存器进行锁定,则在执行目标伪指令之前,不对寄存器的锁定状态进行更新。在完成目标伪指令的执行之后,也可以不对寄存器的锁定状态进行更新。
在具体实施中,若目标伪指令中的指示位无效,也即指示位指示需要对寄存器进行锁定,此时,需要检测寄存器当前是否处于锁定状态。
若检测到寄存器当前未处于锁定状态,则先将寄存器锁定,之后再执行目标伪指令,在目标伪指令执行完成之后,解除寄存器的锁定状态。也就是说,在目标伪指令执行完成之后,寄存器从锁定状态恢复为未锁定状态。
若检测到寄存器当前处于锁定状态,则等待寄存器解除锁定状态。在寄存器解除锁定状态之后,先对寄存器进行加锁,并在寄存器进入锁定状态后,执行目标伪指令。在目标伪指令执行完成之后,解除寄存器的锁定状态。
下面通过具体示例,对本发明实施例中提供的伪指令处理方法进行详细说明。
本发明实施例中提供的伪指令处理方法,可以应用于存在依赖关系的伪指令为读之后写(Write After Read,WAR)的场景。
对于如下现有的伪指令:
SMP r5, [r0],ts#0 //从ts#0和r0寄存器共同确定的纹理位置采样数据并返回到r5寄存器。
SMP r6, [r0],ts#1 //从ts#1和r0寄存器共同确定的纹理位置采样数据并返回到r6寄存器。
SMP r7, [r0],ts#2 //从ts#2和r0寄存器共同确定的纹理位置采样数据并返回到r7寄存器。
MOV r0, r1 //把r1寄存器的值赋值给r0寄存器。
采用本发明实施例提供的伪指令处理方法,可以得到如下伪指令:
SMP r5, [r0.no_lock],ts#0 //不锁定r0寄存器。
SMP r6, [r0.no_lock],ts#1 //不锁定r0寄存器。
SMP r7, [r0],ts#2 //锁定r0寄存器。
MOV r0, r1 //把r1寄存器的值赋值给r0寄存器。
将现有的伪指令与本发明实施例中提供的伪指令进行比较,可见,采用本发明实施例提供的技术方案,第二条SMP伪指令(即SMP r6, [r0.no_lock],ts#1)与第三条SMP伪指令(即SMP r7, [r0],ts#2)无需等待前一条SMP伪指令执行完成,即可从源寄存器r0中读取数据。
对于如下伪指令:
LD r5, [r0.no_lock],u#1 //不锁定r0寄存器。
LD r6, [r0.no_lock],u#1 //不锁定r0寄存器。
LD r7, [r0],ts#1 //最后一条伪指令不打no lock模块,锁定r0寄存器。
MOV r0, r1 //把r1寄存器的值赋值给r0寄存器。
可见,采用本发明实施例提供的伪指令处理方法,第二条LD伪指令(即LD r6,[r0.no_lock],u#1)与第三条LD伪指令(LD r7, [r0],ts#1)的执行,也无需等待前一条LD伪指令执行完成之后才执行。换言之,在由于前两条LD伪指令在执行过程中,均未对源寄存器进行锁定,因此,第三条伪指令可以直接从源寄存器读取数据,而无需等待源寄存器解锁。
对于WAR类型的伪指令,本发明实施例提供的伪指令处理方法,能够有效节省读取源寄存器的等待时间,每条伪指令可以节省10多个时钟周期。
本发明实施例中提供的伪指令处理方法,也可以应用于存在依赖关系的伪指令为写之后写(Write After Write,WAW)的场景。
现有的伪指令如下:
@P1 SMP r5, [r0] //从r0寄存器对应的纹理位置采样数据并返回到r5寄存器。
@!P1 SMP r5, [r1] //从r1寄存器对应的纹理位置采样数据并返回到r5寄存器。
采用本发明实施例中提供的伪指令处理方法,得到如下伪指令:
@P1 SMP r5.no_lock, [r0] //不锁定源寄存器r5
@!P1 SMP r5, [r1] //锁定r5寄存器。
可见,在本发明实施例中,第2条SMP伪指令无需等待第1条SMP伪指令执行完成后才执行,而是可以在第1条SMP伪指令执行时,并行地执行第2条SMP伪指令。
下面示例为另一个写之后写的场景。
在WAW场景下,当加载标量内容至向量寄存器的某条lane时,本发明实施例提供的一种伪指令如下:
CLD r5.7.nolock, [sr0] //把sr0对应的标量内容加载到向量寄存器r5的第7条lane上。
CLD r5.8 [sr1] //把sr1对应的标量内容加载到向量寄存器r5的第8条lane上。
可见,在本发明实施例中,第2条CLD伪指令无需等待第1条CLD伪指令执行完成后才执行,而是可以在第1条CLD伪指令执行时,并行地执行第2条CLD伪指令。
对于WAW类型的伪指令,节省了向源寄存器进行写入数据的时间,每条伪指令平均可以节省数百个时钟周期。
下面对本发明上述实施例中提供的伪指令处理方法的具体执行过程进行说明。
参照图2,给出了本发明实施例中的另一种伪指令处理方法的流程图。
步骤S201,伪指令预取。
步骤S202,伪指令译码。
步骤S203,伪指令检查。
步骤S204,伪指令仲裁。
在本发明实施例中,上述步骤S201~步骤S204的具体执行过程可以参照现有技术,此处不做赘述。上述所进行处理的伪指令,可以为本发明上述实施例中所提及的目标伪指令。
步骤S205,伪指令发射。
在本发明实施例中,可以先判断待发射的目标伪指令中是否存在指示位。若待发射的目标伪指令中存在指示位,则判断指示位是指示对寄存器进行锁定,还是指示无需对寄存器进行锁定。
若指示位指示无需对寄存器进行锁定,则直接将待发射的目标伪指令发射;若指示位指示需要对寄存器进行锁定,则先判断寄存器的锁定状态,若寄存器处于锁定状态,则等待寄存器解锁后,再一次对相应的寄存器进行加锁,再将待发射的目标伪指令发射。
步骤S206,伪指令执行。
在本发明实施例中,以SMP执行引擎对目标伪指令进行处理为例。
SMP执行引擎在接收到目标伪指令之后,读取源寄存器。SMP执行引擎可以判断目标伪指令中的指示位是否有效。
若目标伪指令中的指示位有效,则不需要解除源寄存器锁定状态,直接执行目标伪指令,从纹理单元/内存中读取数据。
若目标伪指令中的指示位无效,则需要对源寄存器进行解锁之后,从纹理单元/内存中读取数据。
在本发明实施例中,源寄存器处于锁定状态、未锁定状态的具体判断原理及过程,可以对应参照上述实施例,此处不做赘述。
在完成数据读取操作后,需要将读取到的数据写入到目标寄存器。
在将读取到的数据写入到目标寄存器之后,若目标伪指令中的指示位有效,则结束伪指令执行;若目标伪指令中的指示位无效,则解除目标寄存器的锁定状态之后,结束伪指令执行。
综上可见,在本发明实施例中,检测待处理的目标伪指令中的指示位,若目标伪指令中的指示位指示无需对源寄存器进行锁定,则直接执行目标伪指令,故而无需等待目标伪指令执行完成之后才能执行下一条伪指令,从而可以有效降低执行伪指令所耗费的时长,提高伪指令执行的效率。
本发明实施例还提供了另一种伪指令处理方法,参照图3,以下通过具体步骤进行说明。
步骤S301,读取伪指令并检测其相互之间的依赖关系。
步骤S302,检测到存在依赖关系的N条伪指令时,对N条伪指令各自的指示位进行配置。
在具体实施中,存在依赖关系的多条伪指令可以是指:对同一源寄存器进行相同操作的多条伪指令。
也就是说,若多条连续的伪指令对同一源寄存器执行相同的操作,则可以将上述多条连续的伪指令认定为存在依赖关系的多条伪指令。
例如,如下连续的三条伪伪指令中,伪指令1为:SMP r5, [r0],ts#0,表征从ts#0和r0寄存器共同确定的纹理位置采样数据并返回到r5寄存器;伪指令2为:SMP r6, [r0],ts#1,表征从ts#1和r0寄存器共同确定的纹理位置采样数据并返回到r6寄存器;伪指令3为SMP r7, [r0],ts#2,表征ts#2和r0寄存器共同确定的纹理位置采样数据并返回到r7寄存器。
可见,上述伪指令1、伪指令2以及伪指令3中,均对源寄存器(r0寄存器)进行数据读取操作,因此,上述伪指令1、伪指令2以及伪指令3为存在依赖关系的伪指令。
在本发明实施例中,在指令集(ISA)中,针对每一条伪指令,可以在该伪指令中设置指示位,该指示位可以用于指示该伪指令涉及的寄存器是否需要进行锁定。通过指示位的不同取值,来确定该伪指令涉及的寄存器需要进行锁定,或者不需要进行锁定。
在本发明实施例中,指示位的长度可以为n比特,n为正整数且n≥1。
在本发明一实施例中,n=1,也即通过1比特的指示位来指示该伪指令涉及的寄存器是否需要进行锁定。当指示位的取值为1时,表征指示位有效,该伪指令涉及的寄存器不需要进行锁定;当指示位的取值为0时,表征指示位无效,该伪指令涉及的寄存器需要进行锁定。
可以理解的是,也可以设置当指示位的取值为0时,表征指示位有效,该伪指令涉及的寄存器不需要进行锁定;当指示位的取值为1时,表征指示位无效,该伪指令涉及的寄存器需要进行锁定。
在具体实施中,编译器在接收到伪指令后,可以对伪指令进行相应的编译操作。若编译器检测到存在依赖关系的N条待处理的命令,则编译器可以对N条待处理的伪指令对应的指示位分别进行配置。
在本发明实施例中,编译器可以配置前N-1条待处理的伪指令对应的指示位有效,配置第N条待处理的伪指令对应的指示位无效。
通过编译器对存在依赖关系的N条伪指令进行指示位的配置,使得GPU在执行伪指令的过程中,确定是否需要对源寄存器进行锁定,进而确定是否直接执行目标伪指令,从而可以有效降低执行伪指令所耗费的时长,提高伪指令执行的效率。
参照图4,给出了本发明实施例中的一种图形处理器40,包括:伪指令发射模块41以及伪指令执行引擎42,其中:
伪指令发射模块41,用于发射待处理的目标伪指令,目标伪指令中具有指示位,所述指示位用于指示目标伪指令涉及的寄存器是否需要进行锁定;
伪指令执行引擎42,从伪指令发射模块41接收所述目标伪指令并检测其中的指示位,若指示位指示无需对所述寄存器进行锁定,则直接执行所述目标伪指令。
在具体实施中,上述伪指令发射模块41以及伪指令执行引擎42的具体执行过程可以对应参照步骤S101~步骤S102,此处不做赘述。
参照图5,给出了本发明实施例中的一种伪指令编译装置50,包括:读取单元51以及配置单元52,其中:
读取单元51,用于读取伪指令并检测其相互之间的依赖关系;
配置单元52,用于检测到存在依赖关系的N条伪指令时,对所述N条伪指令各自的指示位进行配置,所述指示位用于指示所述伪指令被执行时涉及的寄存器是否需要进行锁定,其中,N为正整数且N≥2。
在具体实施中,上述读取单元51以及配置单元52的具体执行过程可以对应参照步骤S301~步骤S302,此处不做赘述。
本发明实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质为非易失性存储介质或非瞬态存储介质,其上存储有计算机程序,所述计算机程序被处理器运行时执行上述任一实施例提供的伪指令编译方法的步骤。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指示相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:ROM、RAM、磁盘或光盘等。
虽然本发明披露如上,但本发明并非限定于此。任何本领域技术人员,在不脱离本发明的精神和范围内,均可作各种更动与修改,因此本发明的保护范围应当以权利要求所限定的范围为准。