本发明涉及计算机技术领域,尤其涉及一种优化核函数的方法和装置。
背景技术:
图像处理器(Graphic Processing Unit,简称GPU)的强大计算能力和低廉的价格,使其日益成为程序并行硬件加速的主流。NVIDIA提出的通用并行计算架构(Compute Unified Device Architecture,简称CUDA)编程语言在一定程度上简化了GPU的编程难度,但是GPU在执行按照CUDA编程语言编写的(优化后的)核函数的过程中,至少还存在如下问题:
核函数中的全局内存访问语句需要通过访问GPU的全局内存来存取数据,由于全局内存是GPU的片外存储器,导致访问全局内存所需的时间较长,从而导致核函数性能较差。
技术实现要素:
本发明实施例提供一种优化核函数的方法和装置,用以缩短访问时间,从而提高核函数的性能。
为达到上述目的,本发明的实施例采用如下技术方案:
第一方面,提供一种优化核函数的方法,包括:
确定源核函数中全局内存访问语句对应的可复用访存空间;
将所述可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数。
结合第一方面,在第一种可能的实现方式中,所述确定源核函数中全局内存访问语句对应的可复用访存空间,包括:
将第一类全局内存访问语句对应的访存空间和/或第二类全局内存访问语句对应的访存空间作为源核函数中全局内存访问语句对应的可复用访存空间;其中,所述第一类全局内存访问语句是指所述源核函数中的、在同一线程中对应的访存空间有重叠的、至少两个全局内存访问语句;所述第二类全局内存访问语句是指所述源核函数中的、在不同线程中对应的访存空间有重叠的、至少一个全局内存访问语句。
结合第一方面的第一种可能的实现方式,在第二种可能的实现方式中,所述方法还包括:
确定所述源核函数中的第一全局内存访问语句和第二全局内存访问语句;
获取所述第一全局内存访问语句对应的第一访存空间和所述第二全局内存访问语句对应的第二访存空间;
在所述第一访存空间和所述第二访存空间有重叠的情况下,将所述第一全局内存访问语句和所述第二全局内存访问语句作为所述第一类全局内存访问语句。
结合第一方面的第一种可能的实现方式,在第三种可能的实现方式中,所述方法还包括:
确定针对所述源核函数中的第三全局内存访问语句;
分别获取针对所述第三全局内存访问语句的线程块中各线程对应的访存空间和所述线程块对应的访存空间,所述线程块包括至少两个线程;
在所述线程块中各线程对应的访存空间之和大于所述线程块对应的访存空间的情况下,将所述线程块对应的全局内存访问语句作为所述第二类全局内存访问语句。
结合第一方面,在第四种可能的实现方式中,所述将所述可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数,包括:
以合并访问的方式将所述可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数。
结合第一方面,在第五种可能的实现方式中,所述将所述可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数,包括:
根据所述可复用访存空间的大小,在所述源核函数中加入对所述可复用访存空间中的可复用数据的共享内存的声明,生成中间核函数;
依次对所述可复用数据执行从全局内存到共享内存的赋值操作;
在所述中间核函数中,将所述可复用数据的访问方式由全局内存访问修改为共享内存访问,生成第一目标核函数。
结合第一方面的第五种可能的实现方式,在第六种可能的实现方式中,所述根据所述可复用访存空间的大小,在所述源核函数中加入对所述可复用访存空间中的可复用数据的共享内存的声明,生成中间核函数,包括:
在所述可复用访存空间的大小大于共享内存的容量的情况下,对所述可复用访存空间进行循环分块,生成K个循环子访存空间;每个所述循环子访存空间小于或者等于共享内存的容量;K≥2,K为整数;
根据所述循环子访存空间的大小,在所述源核函数中加入对所述可复用访存空间中的可复用数据的共享内存的声明,生成中间核函数。
结合第一方面、第一方面的第一种可能的实现方式至第六种可能的实现方式任一种,在第七种可能的实现方式中,所述方法还包括:
确定所述第一目标核函数中的、与线程号相关的变量和/或语句;
根据所述与线程号相关的变量和/或语句将针对所述第一目标核函数的N个线程融合为同一线程,生成第二目标核函数;其中,所述第二目标核函数包含针对所述N个线程中的M个线程的所述与线程号相关的变量和/或语句,N≥M≥2,M、N为整数。
第二方面,提供一种优化核函数的装置,包括:
第一确定单元,用于确定源核函数中全局内存访问语句对应的可复用访存空间;
载入单元,用于将所述可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数。
结合第二方面,在第一种可能的实现方式中,所述第一确定单元具体用于,将第一类全局内存访问语句对应的访存空间和/或第二类全局内存访问语句对应的访存空间作为源核函数中全局内存访问语句对应的可复用访存空间;其中,所述第一类全局内存访问语句是指所述源核函数中的、在同一线程中对应的访存空间有重叠的、至少两个全局内存访问语句;所述第二类全局内存访问语句是指所述源核函数中的、在不同线程中对应的访存空间有重叠的、至少一个全局内存访问语句。
结合第二方面的第一种可能的实现方式,在第二种可能的实现方式中,所述装置还包括:第一获取单元,用于执行以下动作:
确定所述源核函数中的第一全局内存访问语句和第二全局内存访问语句;
获取所述第一全局内存访问语句对应的第一访存空间和所述第二全局内存访问语句对应的第二访存空间;
在所述第一访存空间和所述第二访存空间有重叠的情况下,将所述第一全局内存访问语句和所述第二全局内存访问语句作为所述第一类全局内存访问语句。
结合第二方面的第一种可能的实现方式,在第三种可能的实现方式中,所述装置还包括:第二获取单元,用于执行以下动作:
确定针对所述源核函数中的第三全局内存访问语句;
分别获取针对所述第三全局内存访问语句的线程块中各线程对应的访存空间和所述线程块对应的访存空间,所述线程块包括至少两个线程;
在所述线程块中各线程对应的访存空间之和大于所述线程块对应的访存空间的情况下,将所述线程块对应的全局内存访问语句作为所述第二类全局内存访问语句。
结合第二方面,在第四种可能的实现方式中,所述载入单元具体用于,以合并访问的方式将所述可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数。
结合第二方面,在第五种可能的实现方式中,所述载入单元包括:
声明子单元,用于根据所述可复用访存空间的大小,在所述源核函数中加入对所述可复用访存空间中的可复用数据的共享内存的声明,生成中间核函数;
赋值子单元,用于依次对所述可复用数据执行从全局内存到共享内存的赋值操作;
修改子单元,用于在所述中间核函数中,将所述可复用数据的访问方式由全局内存访问修改为共享内存访问,生成第一目标核函数。
结合第二方面的第五种可能的实现方式,在第六种可能的实现方式中,所述声明子单元具体用于:
在所述可复用访存空间的大小大于共享内存的容量的情况下,对所述可复用访存空间进行循环分块,生成K个循环子访存空间;每个所述循环子访存空间小于或者等于共享内存的容量;K≥2,K为整数;
根据所述循环子访存空间的大小,在所述源核函数中加入对所述可复用访存空间中的可复用数据的共享内存的声明,生成中间核函数。
结合第二方面、第二方面的第一种可能的实现方式至第六种可能的实现方式任一种,在第七种可能的实现方式中,所述装置还包括:
第二确定单元,用于确定所述第一目标核函数中的、与线程号相关的变量和/或语句;
融合单元,用于根据所述与线程号相关的变量和/或语句将针对所述第一目标核函数的N个线程融合为同一线程,生成第二目标核函数;其中,所述第二目标核函数包含针对所述N个线程中的M个线程的所述与线程号相关的变量和/或语句,N≥M≥2,M、N为整数。
本发明实施例提供的一种优化核函数的方法和装置,通过确定源核函数中全局内存访问语句对应的可复用访存空间,并将可复用访存空间中的可复用数据载入共享内存,生成目标核函数。本方案实现了将核函数对全局内存的访问转化为对共享内存的访问,这样,能够减少核函数对全局内存的访问量,进而提升核函数的性能;解决了现有技术中,由于访问全局内存所需的时间较长,导致的核函数性能较差的问题。
第三方面,提供一种优化核函数的方法,包括:
确定源核函数中的、与线程号相关的变量和/或语句;
根据所述与线程号相关的变量和/或语句将针对所述源核函数的N个线程融合为同一线程,生成第一目标核函数;其中,所述第一目标核函数包含针对所述N个线程中的M个线程的所述与线程号相关的变量和/或语句,N≥M≥2,M、N为整数。
结合第三方面,在第一种可能的实现方式中,所述源核函数包括:赋值语句、和/或控制流语句、和/或第三类语句,所述第三类语句是指除赋值语句和控制流语句之外的语句;其中,所述赋值语句由右值表达式和左值变量构成,所述控制流语句包括判断条件和左值变量;所述确定源核函数中的、与线程号相关的变量和/或语句,包括:
若所述赋值语句的右值表达式中包含线程号,则确定所述赋值语句为与线程号相关的语句,并确定所述赋值语句的左值变量为与线程号相关的变量;
或者,若所述控制流语句的判断条件中包含线程号,则确定所述控制流语句为与线程号相关的语句,并确定所述控制流语句的左值变量为与线程号相关的变量;
或者,若所述第三类语句中包含线程号,则将所述第三类语句作为与线程号相关的语句。
结合第三方面,在第二种可能的实现方式中,所述M与所述N相等,所述根据所述与线程号相关的变量和/或语句将针对所述源核函数的N个线程融合为同一线程,生成第一目标核函数,包括:
在所述源核函数中加入对所述与线程号相关的变量和/或语句的N个版本的声明;
将所述与线程号相关的变量和/或语句复制t次,生成t组变量和/或语句;所述t为N或者N-1;
当t为N时,将所述N组变量和/或语句分别修改为与所述N个版本对应的变量和/或语句,生成第一目标核函数;或者,当t为N-1时,将所述N-1组变量和/或语句分别修改为与所述N个版本中的N-1个版本对应的变量和/或语句,并将所述与线程号相关的变量和/或语句修改为剩余的1个版本对应的变量和/或语句。
结合第三方面、第三方面的第一种可能的实现方式至第二种可能的实现方式任一种,所述方法还包括:
确定所述第一目标核函数中全局内存访问语句对应的可复用访存空间;
将所述可复用访存空间中的可复用数据载入共享内存,生成第二目标核函数。
第四方面,提供一种优化核函数的装置,包括:
第一确定单元,用于确定源核函数中的、与线程号相关的变量和/或语句;
融合单元,用于根据所述与线程号相关的变量和/或语句将针对所述源核函数的N个线程融合为同一线程,生成第一目标核函数;其中,所述第一目标核函数包含针对所述N个线程中的M个线程的所述与线程号相关的变量和/或语句,N≥M≥2,M、N为整数。
结合第四方面,在第一种可能的实现方式中,所述源核函数包括:赋值语句、和/或控制流语句、和/或第三类语句,所述第三类语句是指除赋值语句和控制流语句之外的语句;其中,所述赋值语句由右值表达式和左值变量构成,所述控制流语句包括判断条件和左值变量;
所述第一确定单元具体用于,若所述赋值语句的右值表达式中包含线程号,则确定所述赋值语句为与线程号相关的语句,并确定所述赋值语句的左值变量为与线程号相关的变量;
或者,若所述控制流语句的判断条件中包含线程号,则确定所述控制流语句为与线程号相关的语句,并确定所述控制流语句的左值变量为与线程号相关的变量;
或者,若所述第三类语句中包含线程号,则将所述第三类语句作为与线程号相关的语句。
结合第四方面,在第二种可能的实现方式中,所述M与所述N相等,所述融合单元包括:
声明子单元,用于在所述源核函数中加入对所述与线程号相关的变量和/或语句的N个版本的声明;
复制子单元,用于将所述与线程号相关的变量和/或语句复制t次,生成t组变量和/或语句;所述t为N或者N-1;
修改子单元,用于当t为N时,将所述N组变量和/或语句分别修改为与所述N个版本对应的变量和/或语句,生成第一目标核函数;或者,当t为N-1时,将所述N-1组变量和/或语句分别修改为与所述N个版本中的N-1个版本对应的变量和/或语句,并将所述与线程号相关的变量和/或语句修改为剩余的1个版本对应的变量和/或语句。
结合第四方面、第四方面的第一种可能的实现方式至第二种可能的实现方式任一种,在第三种可能的实现方式中,所述装置还包括:
第二确定单元,用于确定所述第一目标核函数中全局内存访问语句对应的可复用访存空间;
载入单元,用于将所述可复用访存空间中的可复用数据载入共享内存,生成第二目标核函数。
本发明实施例提供的另一种优化核函数的方法和装置,通过确定源核函数中的、与线程号相关的变量和/或语句;根据与线程号相关的变量和/或语句将针对源核函数的N个线程融合为同一线程,生成第一目标核函数;其中,第一目标核函数包含针对N个线程中的M个线程的与线程号相关的变量和/或语句,N≥M≥2,M、N为整数。本方案在线程融合时,为核函数中、与线程号相关的变量和/或语句保留不同的版本;与现有技术方案相比,扩大了应用范围,以及提高了核函数的正确性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例一提供的一种优化核函数的方法的流程示意图;
图2为本发明实施例二提供的一种优化核函数的方法的流程示意图;
图3为本发明实施例1提供的一种优化核函数的方法的流程示意图;
图4为本发明实施例2提供的一种优化核函数的方法的流程示意图;
图5为本发明实施例3提供的一种优化核函数的方法的流程示意图;
图6为本发明实施例4提供的一种优化核函数的方法的流程示意图;
图7为本发明实施例三提供的一种优化核函数的装置的结构示意图;
图8为本发明实施例三提供的另一种优化核函数的装置的结构示意图;
图9为本发明实施例四提供的一种优化核函数的装置的结构示意图;
图10为本发明实施例五提供的一种优化核函数的装置的结构示意图;
图11为本发明实施例五提供的另一种优化核函数的装置的结构示意图;
图12为本发明实施例六提供的一种优化核函数的装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本文中描述的技术方案可以应用于CUDA或者开放运算语言(Open Computing Language,简称OpenCL)等GPU编程架构。
本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。另外,如果不加说明,本文中的“多个”均表示两个或者两个以上。
实施例一
如图1所示,为本发明实施例提供的一种优化核函数的方法,包括:
101:确定源核函数中全局内存访问语句对应的可复用访存空间。
其中,本实施例的执行主体可以为优化器,该优化器可以与GPU集成在一起,也可以单独设置为一个实体。
“核函数”是指上述GPU编程架构中,GPU执行的代码。本发明实施例中将未进行优化的核函数称为源核函数,已经进行优化的核函数称为目标核函数(包括:第一目标核函数和第二目标核函数),生成目标核函数的过程中的核函数称为中间核函数。核函数由不同语句构成,按照语句类型不同可以将构成核函数的语句区分为:赋值语句、控制流语句、访问语句等;其中,访问语句包括用于访问全局内存的全局内存访问语句、以及用于访问共享内存的语句的共享内存访问语句;全局内存和共享内存为GPU的两种主要存储资源。每个访问语句可以对应一个访存空间,访存空间由GPU对应的存储设备上的一个或者多个存储单元构成。
需要说明的是,本实施例中,GPU可以为源核函数分配一个或者多个线程,当GPU为源核函数分配多个线程时,每个线程分别对应源核函数中的全部语句。
“可复用访存空间”是指不同全局内存访问语句在同一线程中对应的访存空间有重叠的情况下,由这些不同的全局内存访问语句在该线程中对应的访存空间构成的集合;或者,同一全局内存访问语句在不同线程中对应的访存空间有重叠的情况下,由该全局内存访问语句在这些不同线程中对应的访存空间构成的集合。
可选的,步骤101可以包括:将第一类全局内存访问语句对应的访存空间和/或第二类全局内存访问语句对应的访存空间作为源核函数中全局内存访问语句对应的可复用访存空间;其中,所述第一类全局内存访问语句是指所述源核函数中的、在同一线程中对应的访存空间有重叠的、至少两个全局内存访问语句;所述第二类全局内存访问语句是指所述源核函数中的、在不同线程中对应的访存空间有重叠的、至少一个全局内存访问语句。需要说明的是,一个全局内存访问语句可以既为第一类全局内存访问语句又为第二类全局内存访问语句。
另外需要说明的是,在GPU为源核函数分配一个线程的场景中,可以仅通过确定第一类全局内存访问语句实现步骤101;在GPU为源核函数分配多个线程的情况下,可以仅通过确定第一类全局内存访问语句实现步骤101,也可以仅通过确定第二类全局内存访问语句实现步骤101,还可以通过确定第一类全局内存访问语句和第二类全局内存访问语句实现步骤101。其中,在通过确定第一类全局内存访问语句和第二类全局内存访问语句实现步骤101的方案中,本发明实施例对确定第一类全局内存访问语句和确定第二类全局内存访问语句的执行顺序不进行限定。
下面示例性地介绍确定第一类/第二类全局内存访问语句的具体实现方法:
在本发明的一个实施例中,该方法还可以包括:确定所述第一类全局内存访问语句,具体可以通过以下步骤1)-3)实现:
1)、确定所述源核函数中的第一全局内存访问语句和第二全局内存访问语句。
其中,“第一全局内存访问语句”是指源核函数中的任一全局内存访问语句。“第二全局内存访问语句”是指源核函数中的、除第一全局内存访问语句之外的任一全局内存访问语句。
示例性的,步骤1)具体可以实现为:获取针对源核函数的抽象语法树,其中,源核函数的抽象语法树是源代码的抽象语法结构的树状表现形式,抽象语法树上的每个节点都表示源代码中的一种结构;在该抽象语法树中确定两个全局内存访问语句,将其中一个作为第一全局内存访问语句,另一个作为第二全局内存访问语句。其中,本发明实施例对获取抽象语法树的方法不进行限定,可以使用现有技术中的方法实现。具体实现时,优化器可以依次将源核函数中的每个全局内存访问语句作为第一全局内存访问语句;针对每个第一全局内存访问语句,通过将该源核函数中的其他全局内存访问语句作为第二全局内存访问语句,从而确定每个第一全局内存访问语句是否为第一类全局内存访问语句。
2)、获取所述第一全局内存访问语句对应的第一访存空间和所述第二全局内存访问语句对应的第二访存空间。
3)、在所述第一访存空间和所述第二访存空间有重叠的情况下,将所述第一全局内存访问语句和所述第二全局内存访问语句作为所述第一类全局内存访问语句。
其中,“第一访存空间和第二访存空间有重叠”可以体现为:第一访存空间的地址和第二访存空间的地址有重叠。
在本发明的另一实施例中,该方法还可以包括:确定所述第二类全局内存访问语句,具体可以通过以下步骤i)-iii)实现:
i)、确定针对所述源核函数中的第三全局内存访问语句。
其中,“第三全局内存访问语句”是指源核函数中的任一全局内存访问语句。具体实现时,优化器可以依次将源核函数中的每个全局内存访问语句作为第三全局内存访问语句,从而确定源核函数中的所有第二类全局内存访问语句;也可以依次将源核函数中的、除第一类全局内存访问语句之外的每个全局内存访问语句作为第三全局内存访问语句,从而确定源核函数中的所有第二类全局内存访问语句。
ii)、分别获取针对所述第三全局内存访问语句的线程块中各线程对应的访存空间和所述线程块对应的访存空间,所述线程块包括至少两个线程。
其中,“针对一全局内存访问语句的线程块”是指GPU为源核函数分配的、针对该全局内存访问语句的多个线程构成的集合。具体的:假设GPU为源核函数分配10个线程,源核函数包括全局内存访问语句1、全局内存访问语句2,则针对全局内存访问语句1的10个线程构成一个线程块,针对全局内存访问语句2的10个线程构成另一个线程块。
iii)、在所述线程块中各线程对应的访存空间之和大于所述线程块对应的访存空间的情况下,将所述线程块对应的全局内存访问语句作为所述第二类全局内存访问语句。
其中,针对一全局内存访问语句的线程块中各线程对应的访存空间之和可能大于/等于该线程块对应的访存空间。具体的:当该线程块中各线程对应的访存空间之和大于该线程块对应的访存空间时,说明:该全局内存访问语句在该线程块中的部分/全部线程中对应的访存空间重叠。当该线程块中各线程对应的访存空间之和等于该线程块对应的访存空间时,说明:该全局内存访问语句在该线程块中全部线程中对应的访存空间均不重叠。
下文中,将“所述线程块中各线程对应的访存空间之和等于所述线程块对应的访存空间”的情况下的全局内存访问语句称为第三类全局内存访问语句。本实施例提供的技术不针对第三全局内存访问语句。
102:将所述可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数。
可选的,步骤102可以包括:以合并访问的方式将所述可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数。其中,“合并访问的方式”是指,访问全局内存时,满足相邻线程访问相邻数据的访问方式。利用合并访问的方式,能够最大化全局内存的访存带宽。另外,具体实现时,优化器还可以在执行上述“载入”操作前后加入同步栅栏,以保证访问(全局内存)的正确性。
可选的,步骤102可以通过以下步骤A)-C)实现:
A)、根据所述可复用访存空间的大小,在所述源核函数中加入对所述可复用访存空间中的可复用数据的共享内存的声明,生成中间核函数。
其中,“对可复用数据的共享内存的声明”,包括:对可复用数据的数据类型的声明和对共享内存的大小的声明。其中,可复用数据的数据类型是指全局内存的数据类型加上共享内存的标识符,共享内存的大小是指可复用访存空间的大小。
示例性的,步骤A)可以包括:在所述可复用访存空间的大小大于共享内存的容量的情况下,对所述可复用访存空间进行循环分块,生成K个循环子访存空间;每个所述循环子访存空间小于或者等于共享内存的容量;K≥2,K为整数;根据所述循环子访存空间的大小,在所述源核函数中加入对所述可复用访存空间中的可复用数据的共享内存的声明,生成中间核函数。
B)、依次对所述可复用数据执行从全局内存到共享内存的赋值操作。
其中,步骤B)具体可以实现为:确定可复用访存空间的基地址;从基地址开始,为可复用访存空间中的每个可复用数据分配一个线程,按照合并访问的方式,进行从全局内存到共享内存的赋值操作。
需要说明的是,本发明实施例对步骤A)和步骤B)的执行顺序不进行限定,具体的,可以先执行步骤A)再执行步骤B),也可以先执行步骤B)再执行步骤A),还可以同时执行步骤A)和步骤B)。
C)、在所述中间核函数中,将所述可复用数据的访问方式由全局内存访问修改为共享内存访问,生成第一目标核函数。
进一步地,在本发明的另一实施例中,所述方法还可以包括:
a)、确定所述第一目标核函数中的、与线程号相关的变量和/或语句。
b)、根据所述与线程号相关的变量和/或语句将针对所述第一目标核函数的N个线程融合为同一线程,生成第二目标核函数;其中,所述第二目标核函数包含针对所述N个线程中的M个线程的所述与线程号相关的变量和/或语句,N≥M≥2,M、N为整数。
其中,针对步骤a)和步骤b)的具体实现和相关解释可以参考下述实施例二中的相关内容。在包含步骤a)和步骤b)的实施例中,GPU为第一目标核函数分配多个线程。进一步地,包含步骤a)和步骤b)的实施例,在线程融合时,为核函数中、与线程号相关的变量和/或语句保留不同的版本;与现有技术方案相比,扩大了应用范围,以及提高了核函数的正确性。
需要说明的是,本实施例提供的优化核函数的方法的具体示例可以包括但不限于下述实施例1和实施例2描述的方法。
本发明实施例提供的优化核函数的方法,通过确定源核函数中全局内存访问语句对应的可复用访存空间,并将可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数。本方案实现了将核函数对全局内存的访问转化为对共享内存的访问,这样,能够减少核函数对全局内存的访问量,进而提升核函数的性能;解决了现有技术中,由于访问全局内存所需的时间较长,导致的核函数性能较差的问题。
实施例二
现有技术方案可以通过将针对核函数的若干线程融合到一个线程实现数据的共享,从而对核函数进行优化。但是,现有技术方案默认核函数中的控制流语句(例如,IF语句、FOR语句等)在各线程的执行方式相同,因此在优化后的核函数中往往只保留一个版本。然而,实际实现时,这种假设并不成立,这在很大程度上限制了现有技术方案的应用范围,甚至影响优化后的核函数的正确性。
本发明实施例还提供了通过线程融合优化核函数的方案,如图2所示,为本发明实施例提供的一种优化核函数的方法,包括:
201:确定源核函数中的、与线程号相关的变量和/或语句。
其中,本实施例的执行主体可以为优化器,该优化器可以与GPU集成在一起,也可以单独设置为一个实体。
“核函数”是指上述GPU编程架构中,GPU执行的代码。本发明实施例中将未进行优化的核函数称为源核函数,已经进行优化的核函数称为目标核函数(包括第一目标核函数和第二目标核函数)。
核函数由不同语句构成,按照语句类型不同可以将构成核函数的语句区分为:赋值语句、控制流语句、访问语句等。每个语句由变量、运算符号等构成。线程号也为一种变量。
示例性的,步骤201具体可以实现为:获取针对源核函数的抽象语法树;分析该抽象语法树,得到核函数中各语句构成的集合;在该集合中确定源核函数中的、与线程号相关的变量和/或语句。其中,本发明实施例对获取抽象语法树、各语句构成的集合的方法均不进行限定,可以使用现有技术中的方法获得。
需要说明的是,本实施例中,GPU为源核函数分配多个线程,每个线程分别对应源核函数中的全部语句。另外,本领域技术人员应当理解,第一目标核函数和第二目标核函数均只表示对源核函数进行优化后生成的一种目标核函数,实施例二中描述的“第一目标核函数”与实施例一中描述的“第一目标核函数”不是同一概念,实施例二中描述的“第二目标核函数”与实施例一中描述的“第二目标核函数”不是同一概念。
可选的,在本发明的一个实施例中,所述源核函数包括:赋值语句、和/或控制流语句、和/或第三类语句,所述第三类语句是指除赋值语句和控制流语句之外的语句;其中,所述赋值语句由右值表达式和左值变量构成,所述控制流语句包括判断条件和左值变量;针对核函数中某一语句的语句类型,步骤201具体可以通过以下几种方式实现:
1)语句类型为:赋值语句
若所述赋值语句的右值表达式中包含线程号,则确定所述赋值语句为与线程号相关的语句,并确定所述赋值语句的左值变量为与线程号相关的变量。
2)语句类型为:控制流语句
若所述控制流语句的判断条件中包含线程号,则确定所述控制流语句为与线程号相关的语句,并确定所述控制流语句的左值变量为与线程号相关的变量。
3)语句类型为:第三类语句
若所述第三类语句中包含线程号,则将所述第三类语句作为与线程号相关的语句。
202:根据所述与线程号相关的变量和/或语句将针对所述源核函数的N个线程融合为同一线程,生成第一目标核函数;其中,所述第一目标核函数包含针对所述N个线程中的M个线程的所述与线程号相关的变量和/或语句,N≥M≥2,M、N为整数。
需要说明的是,具体实现时,一般选择M=N,即为待融合的N个线程中的每个线程分配一个与该线程相关的变量和/或语句。
在本发明的一个实施例中,M=N,步骤202具体可以通过以下步骤A)-C)实现:
A)在所述源核函数中加入对所述与线程号相关的变量和/或语句的N个版本的声明。
B)将所述与线程号相关的变量和/或语句复制t次,生成t组变量和/或语句;所述t为N或者N-1。
C)当t为N时,将所述N组变量和/或语句分别修改为与所述N个版本对应的变量和/或语句,生成第一目标核函数;或者,当t为N-1时,将所述N-1组变量和/或语句分别修改为与所述N个版本中的N-1个版本对应的变量和/或语句,并将所述与线程号相关的变量和/或语句修改为剩余的1个版本对应的变量和/或语句。
针对本实施例,应当理解的是,若步骤201中的“变量和/或语句”仅表示“变量”,则步骤202以及上述具体实现的步骤中的“变量和/或语句”均表示“变量”;若步骤201中的“变量和/或语句”仅表示“语句”,则步骤202以及上述具体实现的步骤中的“变量和/或语句”均表示“语句”;若步骤201中的“变量和/或语句”表示“变量和语句”,则步骤202以及上述具体实现的步骤中的“变量和/或语句”均表示“变量和语句”。
进一步地,在本发明的另一实施例中,所述方法还可以包括:
a)、确定所述第一目标核函数中全局内存访问语句对应的可复用访存空间。
b)、将所述可复用访存空间中的可复用数据载入共享内存,生成第二目标核函数。
其中,针对步骤a)和步骤b)的具体实现和相关解释可以参考上述实施例一中的相关内容。进一步地,包含步骤a)和步骤b)的实施例能够减少核函数对全局内存的访问量,进而提升核函数的性能;解决了现有技术中,由于访问全局内存所需的时间较长,导致的核函数性能较差的问题。
需要说明的是,本实施例提供的优化核函数的方法的具体示例可以包括但不限于下述实施例3和实施例4描述的方法。
本发明实施例提供的优化核函数的方法,通过确定源核函数中的、与线程号相关的变量和/或语句;根据与线程号相关的变量和/或语句将针对源核函数的N个线程融合为同一线程,生成第一目标核函数;其中,第一目标核函数包含针对N个线程中的M个线程的与线程号相关的变量和/或语句。本方案在线程融合时,为核函数中、与线程号相关的变量和/或语句保留不同的版本;与现有技术方案相比,扩大了应用范围,并提高了优化后的核函数的正确性。
下面通过实施例1和实施例2对上述实施例一提供的优化核函数的方法进行说明,并通过实施例3和实施例4对上述实施例二提供的优化核函数的方法进行说明。
实施例1
本实施例中,GPU为源核函数分配多个线程,核函数中既包含第一类全局内存访问语句,又包含第二类全局内存访问语句,通过确定第一类全局内存访问语句和第二类全局内存访问语句确定可复用访存空间。
如图3所示,本发明实施例提供了一种优化核函数的方法,包括:
(一)确定可复用访存空间的过程
具体包括:确定第一类全局内存访问语句的过程和确定第二类全局内存访问语句的过程。
确定第一类全局内存访问语句的过程
301:优化器确定源核函数的抽象语法树。
其中,抽象语法树中共包含R个全局内存访问语句,R≥2,R为整数。
302:在抽象语法树中确定第i个全局内存访问语句和第j个全局内存访问语句。
其中,1≤i≤R,i的初始值为1。当i为1时,2≤j≤R,j的初始值为2;当i为R时,1≤j≤R-1,j的初始值为1;当i为其他值时,1≤j≤R,且j≠i,j的初始值为1。i、j为整数。
第j个全局内存访问语句为:抽象语法树中除第i个全局内存访问语句之外的任一个全局内存访问语句,用于确定第i个全局内存访问语句是否为第一类全局内存访问语句。具体的:当第i个全局内存访问语句对应的访存空间与抽象语法树中除第i个全局内存访问语句之外的任一个全局内存访问语句对应的访存空间有重叠时,说明:第i个全局内存访问语句为第一类全局内存访问语句;当第i个全局内存访问语句对应的访存空间与抽象语法树中除第i个全局内存访问语句之外的所有全局内存访问语句对应的访存空间均不重叠时,说明:i个全局内存访问语句不为第一类全局内存访问语句。
303:获取第i个全局内存访问语句对应的第一访存空间和第j个全局内存访问语句对应的第二访存空间。
304:判断第一访存空间和第二访存空间是否有重叠。
若是,则执行步骤311;若否,则执行步骤305。
其中,若步骤304的判断结果为“是”,说明:第i个全局内存访问语句为第一类全局内存访问语句;若步骤304的判断结果为“否”,可以通过重新确定j的值来确定第i个全局内存访问语句是否为第一类全局内存访问语句。
305:判断j是否大于或者等于R。
若是,则执行步骤308;若否,则执行步骤306。
其中,步骤305中的判断结果为“是”,说明:第i个全局内存访问语句对应的访存空间与核函数中、除该第i个全局内存访问语句之外的其他全局内存访问语句对应的访存空间均不重叠。也就是说,第i个全局内存访问语句不为第一类全局内存访问语句。
306:j自加1。
307:判断j与i是否相等。
若是,则执行步骤306;若否,则执行步骤302。
至此,优化器可以确定第i个全局内存访问语句是否为第一类全局内存访问语句,本实施例中将步骤301-307称为“确定第一类全局内存访问语句的过程”。
确定第二类全局内存访问语句的过程
308:确定针对第i个全局内存访问语句的线程块。
309:分别获取该线程块中的各线程块对应的访存空间和该线程块对应的访存空间。
310:判断该线程块中的各线程块对应的访存空间之和是否大于该线程块对应的访存空间。
若是,则执行步骤311;若否,则结束。
其中,步骤310中的判断结果为“是”,说明:第i个全局内存访问语句在该线程块中的部分/全部线程中对应的访存空间重叠;进一步说明:第i个全局内存访问语句为第二类全局内存访问语句。步骤311中的判断结果为“否”,说明:第i个全局内存访问语句在该线程块中全部线程中对应的访存空间均不重叠;进一步说明第i个全局内存访问语句为第三类全局内存访问语句。
311:将第一访存空间合并到已确定的可复用访存空间中,生成新的可复用访存空间。
其中,第1次执行步骤311时,“已确定的可复用访存空间”中包含的存储单元的个数为0;除第1次之外,每次执行步骤311时,“已确定的可复用访存空间”为上一次执行步骤311时生成的“新的可复用访存空间”。
示例性的,假设第一访存空间为集合a,已确定的可复用访存空间为集合b,其中,集合a和集合b中的元素一般为存储单元的地址,则“将第一访存空间合并到已确定的可复用访存空间”具体为:求集合a和集合b的并集。因此,步骤311中得到的“新的可复用访存空间”为a∪b。
312:判断i是否大于或者等于R。
若否,则执行步骤313;若是,则执行步骤314。
其中,步骤312中的判断结果为“是”,说明:已经对核函数中的所有全局内存进行分析,并确定了核函数中的所有第一类全局内存访问语句、第二类全局内存访问语句,以及第三类全局内存访问语句。
313:i自加1,j初始化。
执行步骤313之后,执行步骤302。
至此,优化器可以确定第i个全局内存访问语句是否为第二类全局内存访问语句,本实施例中将步骤308-311称为“确定第二类全局内存访问语句的过程”。
示例性的,源核函数可以为如下代码1:
其中,gidx和gidy分别是X和Y方向上的线程号,矩阵A、B和C都存储在全局内存。
优化器通过分析对A、B和C三个矩阵的全局内存访问语句可以确定:访问矩阵A的全局内存访问语句A(gidy,i)对应的访存空间与访问矩阵B的全局内存访问语句B(i,gidx)对应的访存空间有重叠,因此,可以将这两个访存空间合并,作为可复用访存空间。其中,A(gidy,i)既是第一类全局内存访问语句又是第二类全局内存访问语句,B(i,gidx)是第二类全局内存访问语句。另外,可知C(gidy,gidx)是第三类全局内存访问语句。
(二)可复用数据载入共享内存的过程
314:根据可复用访存空间的大小,在源核函数中加入对可复用访存空间中的可复用数据的共享内存的声明,生成中间核函数。
可选的,步骤A)可以包括:在可复用访存空间的大小大于共享内存的容量的情况下,对可复用访存空间进行循环分块,生成K个循环子访存空间;每个循环子访存空间小于或者等于共享内存的容量;K≥2,K为整数;根据所述循环子访存空间的大小,在所述源核函数中加入对可复用访存空间中的可复用数据的共享内存的声明,生成中间核函数。
示例性的,按照上述(一)中的示例,对全局内存访问语句A(idy,i)进行分析可以得到与其对应的访存空间的大小为:BDIMY*WA,其中,BDIMY是线程块在Y方向上的大小,WA为循环长度。由于WA是源核函数的输入变量,优化器在编译时不能确定其大小而将其默认为无穷大,因此WA*BDIMY大于共享内存的容量。
该情况下,优化器可以对代码1中的第2行进行循环分块的操作,执行循环分块操作后的源函数可以为如下代码2:
具体的:将代码1中的第2行的循环被分割成TS大小的循环块,每一块由代码2中的第4-6行的循环执行。
循环分块后,优化器确定子访存空间进行计算,例如:A矩阵的访问空间为BDIMY*TS,其中,BDIMY和TS都是编译器确定的固定值,TS小于共享内存的容量。优化器根据TS在源核函数中加入对矩阵A的共享内存的声明,其大小为一次循环访问的访存空间大小TS。其中,加入的共享内存声明可以为:
__shared__float sharedA[DIMY][TS];
315:确定可复用访存空间的基地址;从基地址开始,为可复用访存空间中的每个可复用数据分配一个线程,按照合并访问的方式,进行从全局内存到共享内存的赋值操作。
其中,共享内存的地址是全局内存的访问地址下标减去全局内存的基地址。
316:在中间核函数中,将可复用数据的访问方式由全局内存访问修改为共享内存访问,生成第一目标核函数。
执行步骤316之后,则结束。
至此,优化器实现了对源核函数的优化,本实施例中将步骤314-316称为“可复用数据载入共享内存的过程”。
示例性的,按照上述步骤314中的示例,第一目标核函数可以为如下代码:
本发明实施例提供的优化核函数的方法,通过确定源核函数中全局内存访问语句对应的可复用访存空间,并将可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数。本方案实现了将核函数对全局内存的访问转化为对共享内存的访问,这样,能够减少核函数对全局内存的访问量,进而提升核函数的性能;解决了现有技术中,由于访问全局内存所需的时间较长,导致的核函数性能较差的问题。
实施例2
本实施例中,GPU为源核函数分配多个线程,核函数中既包含第一类全局内存访问语句,又包含第二类全局内存访问语句,通过确定第一类全局内存访问语句和第二类全局内存访问语句确定可复用访存空间。
如图4所示,本发明实施例提供了一种优化核函数的方法,包括:
401:按照实施例1中的步骤301-316对源核函数进行优化,生成第一目标核函数。
402:确定第一目标核函数中的、与线程号相关的变量和语句。
403:根据与线程号相关的变量和语句将针对第一目标核函数的N个线程融合为同一线程,生成第二目标核函数;其中,第二目标核函数包含针对N个线程中的与线程号相关的变量和语句,N≥2,N为整数。
其中,本实施例中,假设GPU为第一目标核函数分配了N个线程。本实施例中的步骤402和步骤403的具体实现步骤可以参考下述实施例3中步骤501-512的实现方法,此处不再赘述。
本发明实施例提供的优化核函数的方法,通过确定源核函数中全局内存访问语句对应的可复用访存空间,并将可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数;进而通过确定第一目标核函数中的、与线程号相关的变量和/或语句;并根据与线程号相关的变量和/或语句将针对第一目标核函数的N个线程融合为同一线程,生成第二目标核函数;其中,第二目标核函数包含针对N个线程的与线程号相关的变量和/或语句。本方案实现了将核函数对全局内存的访问转化为对共享内存的访问,这样,能够减少核函数对全局内存的访问量,进而提升核函数的性能;解决了现有技术中,由于访问全局内存所需的时间较长,导致的核函数性能较差的问题。另外,本方案在线程融合时,为核函数中、与线程号相关的变量和/或语句保留不同的版本;与现有技术方案相比,扩大了应用范围,以及提高了核函数的正确性。
实施例3
本实施例中,GPU为源核函数分配了N个线程,N≥2,N为整数。源核函数中的各语句的语句类型包括:赋值语句、控制流语句、第三类语句。其中,第三类语句是指除赋值语句和控制流语句之外的语句;赋值语句由右值表达式和左值变量构成,控制流语句包括判断条件和左值变量。另外,本实施例中,根据与线程号相关的变量和语句将N个线程融合为一个线程。
如图5所示,本发明实施例提供了一种优化核函数的方法,包括:
(一)确定与线程相关的变量和语句的过程
501:优化器确定源核函数的抽象语法树;分析抽象语法树,得到源核函数中各语句构成的集合。
其中,源核函数中包括R个语句,R≥2,R为整数.
502:在该集合中确定第i个语句的语句类型。
其中,1≤i≤R,i的初始值为1。
当步骤502中确定的语句类型为赋值语句时,执行步骤503;当步骤502中确定的语句类型为控制流语句时,执行步骤504;当步骤502中确定的语句类型为第三类语句时,执行步骤506。
503:判断第i个语句的右值表达式中是否包含线程号。
若是,则执行步骤505;若否,则执行步骤508。
504:判断第i个语句的判断条件中包含线程号。
若是,则执行步骤505;若否,则执行步骤508。
505:将第i个语句加入集合S,将该第i个语句的左值变量加入集合V。
其中,集合S中的元素表示与线程号相关的语句,集合V中的元素表示与线程号相关的语句。第1次执行步骤504时,集合S中的元素的个数为0;第1次执行步骤504时,集合V中的元素为线程号。
执行步骤505之后,执行步骤508。
506:判断第i个语句中是否包含线程号。
若是,则执行步骤507;若否,则执行步骤508。
507:将第i个语句加入集合S。
508:i自加1。
509:判断i是否大于或者等于R。
若是,则执行步骤510;若否,则执行步骤502。
至此,优化器可以确定核函数中所有与线程相关的变量和语句。本实施例中,将步骤501-509称为“确定与线程相关的变量和语句的过程”
示例性的,源核函数可以为如下代码:
优化器根据上述步骤确定的与线程号相关的变量为:v、w和pt与线程号相关,与线程号相关的语句为:对变量v的赋值语句和IF语句。
(二)线程融合的过程
510:在源核函数中加入对集合V中的各语句以及集合S中的各变量的N个版本的声明。
511:将集合V中的各语句以及集合S中的各变量均复制N次,生成N组变量和语句。
512:将该N组变量和语句分别修改为与N个版本对应的变量和语句,生成第一目标核函数。
至此,优化器实现了对源核函数的优化,本实施例中将步骤510-512称为“线程融合的过程”。
示例性的,按照上述(一)中的示例,假设N=2,则步骤510包括:在源核函数中加入对变量v的2个版本的声明(例如,v_0和v_1),对其他与线程号相关的变量和语句的声明不再一一描述。通过执行步骤511和步骤512,得到的第一目标核函数可以为如下代码:
从第一目标核函数中可以看出,通过线程工作汇聚实现了对FOR循环和一些访存语句的共享。
本发明实施例提供的优化核函数的方法,通过确定源核函数中的、与线程号相关的变量和/或语句;根据与线程号相关的变量和/或语句将针对源核函数的N个线程融合为同一线程,生成第一目标核函数;其中,第一目标核函数包含针对N个线程的与线程号相关的变量和/或语句。本方案在线程融合时,为核函数中、与线程号相关的变量和/或语句保留不同的版本;与现有技术方案相比,扩大了应用范围,以及提高了核函数的正确性。
实施例4
本实施例中,GPU为源核函数分配了N个线程,N≥2,N为整数。源核函数中的各语句的语句类型包括:赋值语句、控制流语句、第三类语句。其中,第三类语句是指除赋值语句和控制流语句之外的语句;赋值语句由右值表达式和左值变量构成,控制流语句包括判断条件和左值变量。另外,本实施例中,根据与线程号相关的变量和语句将N个线程融合为一个线程。
如图6所示,本发明实施例提供了一种优化核函数的方法,包括:
601:按照实施例3中的步骤501-512对源核函数进行优化,生成第一目标核函数。
602:确定第一目标核函数中全局内存访问语句对应的可复用访存空间。
603:将可复用访存空间中的可复用数据载入共享内存,生成第二目标核函数。
其中,本实施例中的步骤602和步骤603的具体实现步骤可以参考下述实施例1中步骤301-316的实现方法,此处不再赘述。
本发明实施例提供的优化核函数的方法,通过确定源核函数中的、与线程号相关的变量和/或语句;根据与线程号相关的变量和/或语句将针对源核函数的N个线程融合为同一线程,生成第一目标核函数;其中,第一目标核函数包含针对N个线程的与线程号相关的变量和/或语句;进而通过确定第一核函数中全局内存访问语句对应的可复用访存空间,并将可复用访存空间中的可复用数据载入共享内存,生成第二目标核函数。本方案在线程融合时,为核函数中、与线程号相关的变量和/或语句保留不同的版本;与现有技术方案相比,扩大了应用范围,以及提高了核函数的正确性。另外,本方案实现了将核函数对全局内存的访问转化为对共享内存的访问,这样,能够减少核函数对全局内存的访问量,进而提升核函数的性能;解决了现有技术中,由于访问全局内存所需的时间较长,导致的核函数性能较差的问题。
实施例三
如图7所示,为本发明实施例提供的一种优化核函数的装置1,用以执行图1所示的优化核函数的方法,该装置1包括:
第一确定单元11,用于确定源核函数中全局内存访问语句对应的可复用访存空间;
载入单元12,用于将所述可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数访问方式修改单元14,用于在所述中间核函数中,将所述可复用数据的访问方式由全局内存访问修改为共享内存访问,生成目标核函数。
可选的,所述第一确定单元11具体用于,将第一类全局内存访问语句对应的访存空间和/或第二类全局内存访问语句对应的访存空间作为源核函数中全局内存访问语句对应的可复用访存空间;其中,所述第一类全局内存访问语句是指所述源核函数中的、在同一线程中对应的访存空间有重叠的、至少两个全局内存访问语句;所述第二类全局内存访问语句是指所述源核函数中的、在不同线程中对应的访存空间有重叠的、至少一个全局内存访问语句。
可选的,如图8所示,所述装置1还可以包括:第一获取单元13,用于执行以下动作:
确定所述源核函数中的第一全局内存访问语句和第二全局内存访问语句;
获取所述第一全局内存访问语句对应的第一访存空间和所述第二全局内存访问语句对应的第二访存空间;
在所述第一访存空间和所述第二访存空间有重叠的情况下,将所述第一全局内存访问语句和所述第二全局内存访问语句作为所述第一类全局内存访问语句。
可选的,如图8所示,所述装置1还可以包括:第二获取单元14,用于执行以下动作:
确定针对所述源核函数中的第三全局内存访问语句;
分别获取针对所述第三全局内存访问语句的线程块中各线程对应的访存空间和所述线程块对应的访存空间,所述线程块包括至少两个线程;
在所述线程块中各线程对应的访存空间之和大于所述线程块对应的访存空间的情况下,将所述线程块对应的全局内存访问语句作为所述第二类全局内存访问语句。
可选的,所述载入单元12具体用于,以合并访问的方式将所述可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数。
可选的,如图8所示,所述载入单元12包括:
声明子单元121,用于根据所述可复用访存空间的大小,在所述源核函数中加入对所述可复用访存空间中的可复用数据的共享内存的声明,生成中间核函数;
赋值子单元122,用于依次对所述可复用数据执行从全局内存到共享内存的赋值操作;
修改子单元123,用于在所述中间核函数中,将所述可复用数据的访问方式由全局内存访问修改为共享内存访问,生成第一目标核函数。
可选的,所述声明子单元122具体用于:
在所述可复用访存空间的大小大于共享内存的容量的情况下,对所述可复用访存空间进行循环分块,生成K个循环子访存空间;每个所述循环子访存空间小于或者等于共享内存的容量;K≥2,K为整数;
根据所述循环子访存空间的大小,在所述源核函数中加入对所述可复用访存空间中的可复用数据的共享内存的声明,生成中间核函数。
可选的,如图8所示,所述装置1还可以包括:
第二确定单元15,用于确定所述第一目标核函数中的、与线程号相关的变量和/或语句;
融合单元16,用于根据所述与线程号相关的变量和/或语句将针对所述第一目标核函数的N个线程融合为同一线程,生成第二目标核函数;其中,所述第二目标核函数包含针对所述N个线程中的M个线程的所述与线程号相关的变量和/或语句,N≥M≥2,M、N为整数。
示例性的,本实施例中的优化函数的装置1可以为上述实施例一中描述的“优化器”。
本发明实施例提供的优化核函数的装置,通过确定源核函数中全局内存访问语句对应的可复用访存空间,并将可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数。本方案实现了将核函数对全局内存的访问转化为对共享内存的访问,这样,能够减少核函数对全局内存的访问量,进而提升核函数的性能;解决了现有技术中,由于访问全局内存所需的时间较长,导致的核函数性能较差的问题。
实施例四
本实施例提供一种与实施例三中描述的优化核函数的装置1相对应的优化核函数的实体装置2,用以执行图1所示的优化核函数的方法。如图9所示,该装置2包括:存储器21和处理器22,其中,处理器22对应上述第一确定单元11、载入单元12,可选的对应上述第一获取单元13、第二获取单元14、第二确定单元15、融合单元16。其中,
存储器21,用于存储一组程序代码,该程序代码用于控制处理器22执行以下动作:
确定源核函数中全局内存访问语句对应的可复用访存空间;
将所述可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数。
可选的,处理器22具体用于,将第一类全局内存访问语句对应的访存空间和/或第二类全局内存访问语句对应的访存空间作为源核函数中全局内存访问语句对应的可复用访存空间;其中,所述第一类全局内存访问语句是指所述源核函数中的、在同一线程中对应的访存空间有重叠的、至少两个全局内存访问语句;所述第二类全局内存访问语句是指所述源核函数中的、在不同线程中对应的访存空间有重叠的、至少一个全局内存访问语句。
可选的,处理器22还用于执行以下动作:
确定所述源核函数中的第一全局内存访问语句和第二全局内存访问语句;
获取所述第一全局内存访问语句对应的第一访存空间和所述第二全局内存访问语句对应的第二访存空间;
在所述第一访存空间和所述第二访存空间有重叠的情况下,将所述第一全局内存访问语句和所述第二全局内存访问语句作为所述第一类全局内存访问语句。
可选的,处理器22还用于执行以下动作:
确定针对所述源核函数中的第三全局内存访问语句;
分别获取针对所述第三全局内存访问语句的线程块中各线程对应的访存空间和所述线程块对应的访存空间,所述线程块包括至少两个线程;
在所述线程块中各线程对应的访存空间之和大于所述线程块对应的访存空间的情况下,将所述线程块对应的全局内存访问语句作为所述第二类全局内存访问语句。
可选的,处理器22具体用于,以合并访问的方式将所述可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数。
可选的,处理器22具体用于:
根据所述可复用访存空间的大小,在所述源核函数中加入对所述可复用访存空间中的可复用数据的共享内存的声明,生成中间核函数;
依次对所述可复用数据执行从全局内存到共享内存的赋值操作;
在所述中间核函数中,将所述可复用数据的访问方式由全局内存访问修改为共享内存访问,生成第一目标核函数。
可选的,处理器22具体用于:
在所述可复用访存空间的大小大于共享内存的容量的情况下,对所述可复用访存空间进行循环分块,生成K个循环子访存空间;每个所述循环子访存空间小于或者等于共享内存的容量;K≥2,K为整数;
根据所述循环子访存空间的大小,在所述源核函数中加入对所述可复用访存空间中的可复用数据的共享内存的声明,生成中间核函数。
可选的,处理器22还可以用于:
确定所述第一目标核函数中的、与线程号相关的变量和/或语句;
根据所述与线程号相关的变量和/或语句将针对所述第一目标核函数的N个线程融合为同一线程,生成第二目标核函数;其中,所述第二目标核函数包含针对所述N个线程中的M个线程的所述与线程号相关的变量和/或语句,N≥M≥2,M、N为整数。
示例性的,本实施例中的优化函数的装置2可以上述实施例一中描述的“优化器”,该优化器可以分为两个部分,分别为上述存储器21和处理器22。
本发明实施例提供的优化核函数的装置,通过确定源核函数中全局内存访问语句对应的可复用访存空间,并将可复用访存空间中的可复用数据载入共享内存,生成第一目标核函数。本方案实现了将核函数对全局内存的访问转化为对共享内存的访问,这样,能够减少核函数对全局内存的访问量,进而提升核函数的性能;解决了现有技术中,由于访问全局内存所需的时间较长,导致的核函数性能较差的问题。
实施例五
如图10所示,为本发明实施例提供的一种优化核函数的装置3,用以执行图2所示的优化核函数的方法,该装置3包括:
第一确定单元31,用于确定源核函数中的、与线程号相关的变量和/或语句;
融合单元32,用于根据所述与线程号相关的变量和/或语句将针对所述源核函数的N个线程融合为同一线程,生成第一目标核函数;其中,所述第一目标核函数包含针对所述N个线程中的M个线程的所述与线程号相关的变量和/或语句,N≥M≥2,M、N为整数。
可选的,所述源核函数包括:赋值语句、和/或控制流语句、和/或第三类语句,所述第三类语句是指除赋值语句和控制流语句之外的语句;其中,所述赋值语句由右值表达式和左值变量构成,所述控制流语句包括判断条件和左值变量;
所述第一确定单元31具体用于,若所述赋值语句的右值表达式中包含线程号,则确定所述赋值语句为与线程号相关的语句,并确定所述赋值语句的左值变量为与线程号相关的变量;
或者,若所述控制流语句的判断条件中包含线程号,则确定所述控制流语句为与线程号相关的语句,并确定所述控制流语句的左值变量为与线程号相关的变量;
或者,若所述第三类语句中包含线程号,则将所述第三类语句作为与线程号相关的语句。
可选的,所述M与所述N相等,如图11所示,所述融合单元32包括:
声明子单元321,用于在所述源核函数中加入对所述与线程号相关的变量和/或语句的N个版本的声明;
复制子单元322,用于将所述与线程号相关的变量和/或语句复制t次,生成t组变量和/或语句;所述t为N或者N-1;
修改子单元323,当t为N时,将所述N组变量和/或语句分别修改为与所述N个版本对应的变量和/或语句,生成第一目标核函数;或者,当t为N-1时,将所述N-1组变量和/或语句分别修改为与所述N个版本中的N-1个版本对应的变量和/或语句,并将所述与线程号相关的变量和/或语句修改为剩余的1个版本对应的变量和/或语句。
可选的,如图11所示,该装置3还可以包括:
第二确定单元33,用于确定所述第一目标核函数中全局内存访问语句对应的可复用访存空间;
载入单元34,用于将所述可复用访存空间中的可复用数据载入共享内存,生成第二目标核函数。
示例性的,本实施例中的优化函数的装置3可以为上述实施例三和实施例四中描述的“优化器”。
本发明实施例提供的优化核函数的装置,通过确定源核函数中的、与线程号相关的变量和/或语句;根据与线程号相关的变量和/或语句将针对源核函数的N个线程融合为同一线程,生成第一目标核函数;其中,第一目标核函数包含针对N个线程中的M个线程的与线程号相关的变量和/或语句,N≥M≥2,M、N为整数。本方案在线程融合时,为核函数中、与线程号相关的变量和/或语句保留不同的版本;与现有技术方案相比,扩大了应用范围,以及提高了核函数的正确性。
实施例六
本实施例提供一种与实施例五中描述的优化核函数的装置3相对应的优化核函数的实体装置4,用以执行图2所示的优化核函数的方法,如图12所示,该装置4包括:存储器41和处理器42,其中,处理器42对应上述第一确定单元31、融合单元32,可选的对应上述第二确定单元33、载入单元。具体的:
存储器41,用于存储一组程序代码,该程序代码用于控制处理器42执行以下动作:
确定源核函数中的、与线程号相关的变量和/或语句;
根据所述与线程号相关的变量和/或语句将针对所述源核函数的N个线程融合为同一线程,生成第一目标核函数;其中,所述第一目标核函数包含针对所述N个线程中的M个线程的所述与线程号相关的变量和/或语句,N≥M≥2,M、N为整数。
可选的,所述源核函数包括:赋值语句、和/或控制流语句、和/或第三类语句,所述第三类语句是指除赋值语句和控制流语句之外的语句;其中,所述赋值语句由右值表达式和左值变量构成,所述控制流语句包括判断条件和左值变量;
处理器42具体用于,若所述赋值语句的右值表达式中包含线程号,则确定所述赋值语句为与线程号相关的语句,并确定所述赋值语句的左值变量为与线程号相关的变量;
或者,若所述控制流语句的判断条件中包含线程号,则确定所述控制流语句为与线程号相关的语句,并确定所述控制流语句的左值变量为与线程号相关的变量;
或者,若所述第三类语句中包含线程号,则将所述第三类语句作为与线程号相关的语句。
可选的,所述M与所述N相等,处理器42具体用于:
在所述源核函数中加入对所述与线程号相关的变量和/或语句的N个版本的声明;
将所述与线程号相关的变量和/或语句复制t次,生成t组变量和/或语句;所述t为N或者N-1;
当t为N时,将所述N组变量和/或语句分别修改为与所述N个版本对应的变量和/或语句,生成第一目标核函数;或者,当t为N-1时,将所述N-1组变量和/或语句分别修改为与所述N个版本中的N-1个版本对应的变量和/或语句,并将所述与线程号相关的变量和/或语句修改为剩余的1个版本对应的变量和/或语句。
可选的,处理器42还可以用于:
确定所述第一目标核函数中全局内存访问语句对应的可复用访存空间;
将所述可复用访存空间中的可复用数据载入共享内存,生成第二目标核函数。
示例性的,本实施例中的优化函数的装置4可以为上述实施例三和实施例四中描述的“优化器”,该优化器可以分为两个部分,分别为上述存储器41和处理器42。
本发明实施例提供的优化核函数的装置,通过确定源核函数中的、与线程号相关的变量和/或语句;根据与线程号相关的变量和/或语句将针对源核函数的N个线程融合为同一线程,生成第一目标核函数;其中,第一目标核函数包含针对N个线程中的M个线程的与线程号相关的变量和/或语句,N≥M≥2,M、N为整数。本方案在线程融合时,为核函数中、与线程号相关的变量和/或语句保留不同的版本;与现有技术方案相比,扩大了应用范围,以及提高了核函数的正确性。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理包括,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,简称ROM)、随机存取存储器(Random Access Memory,简称RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。