编译方法、装置、设备及存储介质与流程

文档序号:29788488发布日期:2022-04-23 15:58阅读:74来源:国知局
编译方法、装置、设备及存储介质与流程

1.本发明涉及代码编译技术领域,尤其涉及一种编译方法、装置、设备及存储介质。


背景技术:

2.随着大数据和人工智能的不断发展,对大规模数据处理和计算的需求也不断增加,并行计算技术以其优异的处理效率得到了高速发展,并行计算的体系结构从单核、单处理器、单节点发展为多核、多处理器、多节点,即多层次并行计算,多层次并行计算大大提高了数据处理的效率。
3.目前,当采用解释性语言的代码进行并行计算时,由于解释性语言无法被计算机直接理解,将导致并行计算算法的开销较大,计算效率较低,无法满足用户需求。


技术实现要素:

4.本发明的主要目的在于提供一种编译方法、装置、设备及存储介质,针对并行计算的待编译文件,通过待编译文件中的并行计算部分的函数装饰器装饰,提取抽象语法树,进而对函数中的循环部分进行计算逻辑合并,提高了运行效率。
5.第一方面,本发明实施例提供一种编译方法,该编译方法包括:
6.获取待编译文件;根据所述待编译文件中的预设函数装饰器,提取所述待编译文件的各个并行计算函数的源代码;解析各个所述并行计算函数的源代码,确定各个所述并行计算函数的抽象语法树;针对每个所述并行计算函数的抽象语法树,若所述抽象语法树的第一循环函数与所述抽象语法树的第二循环函数满足预设条件,则合并所述第一循环函数和所述第二循环函数,得到合并处理后的各个并行计算函数,以根据各个合并处理后的并行计算函数生成所述待编译文件的执行代码。
7.可选地,所述抽象语法树的第一循环函数与所述抽象语法树的第二循环函数满足预设条件,包括:
8.所述第一循环函数与所述第二循环函数遍历的数据集合相同。
9.可选地,该编译方法,还包括:
10.获取各个所述并行计算函数的数据读取范围;根据各个所述数据读取范围,确定所述待编译文件的读取数据,以通过所述并行计算函数对所述读取数据进行处理。
11.可选地,在生成所述待编译文件的执行代码之前,该编译方法还包括:
12.针对每个所述并行计算函数的抽象语法树,识别所述抽象语法树中的重复读取部分,其中,所述重复读取部分至少存在于所述抽象语法树的第一节点和第二节点;删除所述第二节点中的所述重复读取部分;将从所述第二节点获取所述重复读取部分对应的数据的第三节点与所述第一节点连接,以使所述第三节点从所述第一节点获取所述重复读取部分对应的数据,得到删除重复的并行计算函数;
13.相应的,所述生成所述待编译文件的执行代码,包括:
14.根据各个删除重复的并行计算函数生成所述待编译文件的执行代码。
15.可选地,在生成所述待编译文件的执行代码之前,该编译方法还包括:
16.若各个所述并行计算函数均未指定数据拆分类型,则采用hash函数对各个所述并行计算函数的数据进行拆分;或者,若任一所述并行计算函数未指定数据拆分类型,则获取第二并行计算函数的第二数据拆分类型,并采用所述第二数据拆分类型对所述并行计算函数的数据进行拆分,其中,所述第二并行计算函数为指定数据拆分类型的所述并行计算函数,所述第二数据拆分类型为所述第二并行计算函数的数据拆分类型;
17.相应的,所述生成所述待编译文件的执行代码,包括:
18.根据数据拆分后的各个所述并行计算函数生成待编译文件的执行代码。
19.可选地,在生成所述待编译文件的执行代码之前,该编译方法还包括:
20.针对每个所述并行计算函数,判断所述并行计算函数的抽象语法树的结构是否为预设结构;若是,则在所述并行计算函数中插入merge函数;
21.相应的,所述生成所述待编译文件的执行代码,包括:
22.根据插入merge函数后的并行计算函数生成所述待编译文件的执行代码。
23.可选地,在生成所述待编译文件的执行代码之后,该编译方法,还包括:
24.根据各个服务器的属性,对所述执行代码进行划分,以得到各个执行子代码;
25.将各个所述执行子代码发送至相应的所述服务器中。
26.第二方面,本发明实施例还提供一种编译装置,包括:
27.待编译文件获取模块,用于获取待编译文件;源代码提取模块,用于根据所述待编译文件中的预设函数装饰器,提取所述待编译文件的各个并行计算函数的源代码;源代码解析模块,用于解析各个所述并行计算函数的源代码,确定各个所述并行计算函数的抽象语法树;编译优化模块,用于针对每个所述并行计算函数的抽象语法树,若所述抽象语法树的第一循环函数与所述抽象语法树的第二循环函数满足预设条件,则合并所述第一循环函数和所述第二循环函数,得到合并处理后的各个并行计算函数,以根据各个合并处理后的并行计算函数生成所述待编译文件的执行代码。
28.第三方面,本发明实施例还提供一种编译设备,所述编译设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的编译程序,所述编译程序被所述处理器执行时实现如本发明第一方面对应的任意实施例提供的编译方法的步骤。
29.第四方面,本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有编译程序,所述编译程序被处理器执行时实现如本发明第一方面对应的任意实施例提供的编译方法的步骤。
30.本发明实施例提供的编译方法、装置、设备及存储介质,针对并行计算的待编译文件,通过待编译文件中的并行计算函数的函数装饰器装饰,提取各个并行计算函数的源代码,并根据该源代码得到各个并行计算函数的抽象语法树,进而根据该抽象语法树,将并行计算函数中的循环函数中的计算逻辑进行合并,以简化代码,减少运行开销,提高了代码运行效率和性能,进而提高了数据处理的效率。
附图说明
31.图1是本发明实施例提供的编译方法的一种应用场景图;
32.图2是本发明实施例提供的编译方法的流程图;
33.图3是本发明图2所示实施例提供的计算机集群的结构示意图;
34.图4是本发明另一个实施例提供的编译方法的流程图;
35.图5是本发明图4所示实施例提供的并行计算函数的dag的示意图;
36.图6是本发明图5所示实施例对应的优化后的dag的示意图;
37.图7是本发明实施例提供的编译装置的结构示意图;
38.图8为本发明一个实施例提供的编译设备的结构示意图。
39.本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
40.下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
41.下面对本发明实施例的应用场景进行解释:
42.图1是本发明实施例提供的编译方法的一种应用场景图,如图1所示,在大数据处理领域,用户根据自身业务需求,在用户端110编写并行计算算法120,以将并行计算算法发送至计算机集群120的各个计算节点130,以使各个计算节点130通过运行该并行计算算法对分布式存储的数据进行并行计算,从而得到处理后的数据,并将处理后的数据发送至用户端110,以使用户端110根据处理后的数据进行后续的业务处理。该业务需求可以是确定决策树、神经网络的训练数据,相应的分布式存储的数据可以是训练用的原始数据,处理后的数据则为直接用于模型训练的数据,可以是经过特征提取后的数据。
43.由于计算机不能直接理解解释性语言的语句,若采用解释性语言作为大数据并行计算算法代码的编程语言,如python语言,则需要将并行计算算法的代码翻译为机器语言,因此,解释性语言的计算开销较大,并不适用于编写大数据领域的并行计算算法。若基于解释性语言编写上述并行计算算法,则将会导致并行计算算法代码的计算开销较大,从而使得并行计算的计算效率较低,无法满足用户需求。
44.为了提高应用于大数据并行计算的基于解释性语言编写的算法的性能,本发明实施例提供了一种编译方法,针对并行计算算法,通过该编译方法对其进行编译,从而大大降低了算法的计算开销,提高了并行计算的效率,该编译方法的主要构思为:通过在待编译文件的并行计算函数中添加函数装饰器,并基于该函数装饰器探查函数代码,得到抽象语法树,进而基于该抽象语法树将并行计算函数中的满足预设条件的第一循环函数和第二循环函数合并,即将并行函数中具有类似计算逻辑的循环函数进行合并,通过函数逻辑合并的方式,降低函数的复杂度,并减少循环函数的计算开销,从而减少并行函数的计算开销,优化了并行算法的性能,提高了并行算法的运行效率,进而提高了并行计算的效率。
45.图2是本发明实施例提供的编译方法的流程图,如图2所示,该编译方法包括以下步骤:
46.步骤s201,获取待编译文件。
47.其中,所述待编译文件可以是基于解释性语言编写的程序,如基于python语言编辑的程序。待编译文件可以是多层次并行计算的文件。
48.python作为一种解释性语言,以其简单易学的特点,得到了广泛的应用。然而,由于其内部开销较大,通常并不适合用于高性能的数据计算。本发明则通过对基于python语言的程序进行改进,将其转换为高性能的底层实现方式。
49.具体的,该待编译文件可以是来自用户端的需要进行编译的程序。该程序为采用python语言编辑的采用多层次并行计算模式的程序。
50.其中,多层次并行计算模式指的是一个算法需要在多台服务器上执行,且每台服务器包括多个cpu(central processing unit,中央处理器),每个cpu有多个核心(core)。
51.示例性的,该待编译文件可以是用来统计企业员工的平均收入以及收入分布情况的文件、程序或数据,还可以是统计企业某项产品的产品参数的分布情况的文件、程序或数据。
52.步骤s202,根据所述待编译文件中的预设函数装饰器,提取所述待编译文件的各个并行计算函数的源代码。
53.其中,预设函数装饰器为设置在待编译文件中的各个需要并行计算的函数前的装饰器。这样设置的好处在于,待编译文件中需要并行计算的部分采用该预设函数装饰器装饰,从而不会对其他部分代码的运行造成干扰,采用其对应的python解释器进行编译即可。并行计算函数即为需要并行计算的各个函数。
54.具体的,函数装饰器本质也是一种函数,可以让其所装饰的函数在不需要做任何代码变动的前提下,增加额外的功能。预设函数装饰器@par可以由手动方式添加在待编译文件的各个并行计算函数的之前,以通过@par装饰各个并行计算函数。
55.示例性的,包含上述预设函数装饰器@par的待编译文件的部分代码的具体内容如下:
[0056][0057]
可知,需要并行计算的函数avg()、histo()和program()均被预设函数装饰器@
par装饰,从而可以根据该预设函数装饰器@par,自动获取相应的并行计算函数,即函数avg()、histo()和program()的源代码。
[0058]
步骤s203,解析各个所述并行计算函数的源代码,确定各个所述并行计算函数的抽象语法树。
[0059]
其中,抽象语法树(abstract syntax tree,ast)是源代码的抽象语法结构的树状表现形式。
[0060]
具体的,可以基于ast编辑器,根据并行计算函数的源代码,生成并行计算函数的抽象语法树。
[0061]
步骤s204,针对每个所述并行计算函数的抽象语法树,若所述抽象语法树的第一循环函数与所述抽象语法树的第二循环函数满足预设条件,则合并所述第一循环函数和所述第二循环函数,得到合并处理后的各个并行计算函数,以根据各个合并处理后的并行计算函数生成所述待编译文件的执行代码。
[0062]
其中,第一循环函数和第二循环函数为该并行计算函数中两个不同的循环函数。具体可以是基于for、in、while、range等语句或函数的循环函数。
[0063]
具体的,第二循环函数的个数可以是一个也可以是多个,即若存在三个或三个以上的循环函数均满足预设条件,则将满足预设条件的各个循环函数合并。
[0064]
具体的,预设条件可以是第一循环函数和第二循环函数所对应的数据集合相同。还可以包括第一循坏函数和第二循环函数的循环类型相同,如都是基于for语句的循环函数,或者都是基于while语句的循环函数。
[0065]
可选地,所述抽象语法树的第一循环函数与所述抽象语法树的第二循环函数满足预设条件,包括:
[0066]
所述第一循环函数与所述第二循环函数遍历的数据集合相同。
[0067]
其中,循环函数对应的数据集合指的是在循环函数遍历时,所需要使用的数据的集合。
[0068]
具体的,若第一循环函数和第二循环函数遍历的数据集合相同,则将第一循环函数和第二循环函数的计算逻辑合并,从而组成一个新的循环函数,且该新的循环函数具备第一循环函数和第二循环函数的功能。
[0069]
通过合并循环函数,减少了待编译函数运行的开销,优化了代码编译的性能,提高了代码的运行效率。
[0070]
具体的,所生成的执行代码可以是c语言代码、fortran语言代码、cuda语言代码、openmp语言代码或者opencl语言代码。
[0071]
可选地,在生成所述待编译文件的执行代码之后,该方法还包括:
[0072]
将所述执行代码发送至至少两个服务器,以使所述至少两个服务器执行所述执行代码。
[0073]
其中,该至少两个服务器组成计算机集群,计算机集群中的服务器为多核服务器,多核服务器又称为多核cpu服务器,为包括多个核心的服务器。
[0074]
具体的,在生成执行代码之后,还包括将该执行代码划分为若干个并行子代码,以将各个并行子代码发送至相应的服务器进行运行,以得到运行结果。
[0075]
具体的,经由编译系统将所生成的执行代码发送至计算机集群,进而该计算机集
群通过网络进行数据交互,以完成对执行代码的运行,输出运行结果。
[0076]
示例性的,图3是本发明图2所示实施例提供的计算机集群的结构示意图,如图3所示,当计算机集群接收到执行代码之后,会对该执行代码进行划分,进而由各个多核cpu服务器分别执行,而当不同的服务器需要数据交互时,则通过网络进行数据交互,而对于每个多核cpu服务器,其所运行的执行代码的任务又会有不同的cpu执行,各个cpu通过访问本地文件、共享内存的方式运行。
[0077]
在本实施例中,针对并行计算的待编译文件,通过待编译文件中的并行计算函数的函数装饰器装饰,提取各个并行计算函数的源代码,并根据该源代码得到各个并行计算函数的抽象语法树,进而根据该抽象语法树,将并行计算函数中的循环函数中的计算逻辑进行合并,以简化代码,减少运行开销,提高了代码运行效率和性能,进而提高了数据处理的效率。
[0078]
图4是本发明另一个实施例提供的编译方法的流程图,本实施例是在图2所示实施例的基础上,增加了数据读取以及重复读取优化的步骤,如图4所示,本实施例提供的编译方法包括以下步骤:
[0079]
步骤s401,获取待编译文件,其中,所述待编译文件为基于python语言编辑的程序。
[0080]
步骤s402,根据所述待编译文件中的预设函数装饰器,提取所述待编译文件的各个并行计算函数的源代码。
[0081]
步骤s403,获取各个所述并行计算函数的数据读取范围。
[0082]
具体的,可以根据并行计算函数的各个语句对应的数据读取范围,确定并行函数的数据读取范围。
[0083]
示例性的,若并行函数的某条语句为:counter(field(0),field(1)),则其对应的数据读取范围便为field(0)和field(1)对应的数据范围。
[0084]
步骤s404,根据各个所述数据读取范围,确定所述待编译文件的读取数据,以通过所述并行计算函数对所述读取数据进行处理。
[0085]
具体的,为了提高代码的运行效率,需要裁剪各个并行计算函数的读取数据。由于待编译文件的数据往往是采用按列存储的方式存储,因此,可以根据各个并行计算函数所需读取的列,确定待编译文件的读取数据的起止范围。
[0086]
具体的,对读取数据进行处理,可以是任意一种计算处理方式,如求和、取平均、排序等。
[0087]
示例性的,待编译文件包括并行计算函数f1和并行计算函数f2,待编译文件的数据的初始读取范围为范围a、范围b和范围c,根据各个函数的语句,确定f1的初始数据读取范围为范围a和范围b,f2的初始数据读取范围为范围b,则将该并行函数的数据读取范围设置为范围a和范围b,即将删除待编辑文件的数据中的范围c对应的数据,从而避免执行不必要的遍历步骤,以减少程序的开销。
[0088]
步骤s405,解析各个所述并行计算函数的源代码,确定各个所述并行计算函数的抽象语法树。
[0089]
步骤s406,针对每个所述并行计算函数的抽象语法树,若所述抽象语法树的第一循环函数与所述抽象语法树的第二循环函数遍历的数据集合相同,则合并所述第一循环函
数和所述第二循环函数。
[0090]
步骤s407,针对每个所述并行计算函数的抽象语法树,识别所述抽象语法树中的重复读取部分。
[0091]
其中,重复读取部分为并行计算函数中需要读取至少两次的部分。重复读取部分至少存在于抽象语法树的第一节点和第二节点。第一节点和第二节点为抽象语法树中的任意两个不同的节点。
[0092]
步骤s408,删除所述第二节点中的所述重复读取部分;并将从所述第二节点获取所述重复读取部分对应的数据的第三节点与所述第一节点连接,以使所述第三节点从所述第一节点获取所述重复读取部分对应的数据,得到删除重复的并行计算函数。
[0093]
其中,第三节点是需要从第二节点中获取该重复读取部分对应的数据的节点。
[0094]
示例性的,若在函数a的第一节点需要读取数据d的第一列,在函数a的第二节点需要读取数据d的第一列和第二列,而函数a的第三节点需要对第二节点中涉及的数据进行处理,如取平均、求和等,则确定数据d的第一列为重复读取部分,则可以将第二节点中的读取数据d的第一列对应的代码删除,并使得第三节点根据第一节点中的读取数据d的第一列和第二节点中的读取数据d的第二列实现其数据处理。
[0095]
步骤s409,根据各个删除重复的并行计算函数生成所述待编译文件的执行代码。
[0096]
具体的,可以根据删除重复以及合并第一循环函数和第二循环函数后的各个并行计算函数,生成待编译文件的执行代码。
[0097]
具体的,步骤s407至步骤s408可以在步骤s406之前执行。
[0098]
可选地,在生成待编译文件的执行代码之前,还包括:若各个所述并行计算函数均未指定数据拆分类型,则采用hash函数对各个所述并行计算函数的数据进行拆分;相应的,在生成待编译文件的执行代码,包括:根据数据拆分后的各个所述并行计算函数生成待编译文件的执行代码。
[0099]
具体的,数据拆分类型具体可以根据并行函数中的split()的调用语句确定。若所有的并行计算函数中均不包含split()的调用语句,则可以基于hash()函数对各个并行计算函数的数据进行拆分。
[0100]
可选地,在生成待编译文件的执行代码之前,还包括:若任一所述并行计算函数未指定数据拆分类型,则获取第二并行计算函数的第二数据拆分类型,并采用所述第二数据拆分类型对所述并行计算函数的数据进行拆分;相应的,在生成待编译文件的执行代码,包括:根据数据拆分后的各个所述并行计算函数生成待编译文件的执行代码。
[0101]
其中,所述第二并行计算函数为指定数据拆分类型的所述并行计算函数,所述第二数据拆分类型为所述第二并行计算函数的数据拆分类型。
[0102]
具体的,对于没有指定数据拆分类型的并行计算函数,根据任意一个指定了数据拆分类型的并行计算函数的数据拆分类型进行数据拆分。
[0103]
可选地,在生成待编译文件的执行代码之前,还包括:针对每个所述并行计算函数,判断所述并行计算函数的抽象语法树的结构是否为预设结构;若是,则在所述并行计算函数中插入merge函数;相应的,在生成待编译文件的执行代码,包括:根据插入merge函数后的并行计算函数生成所述待编译文件的执行代码。
[0104]
其中,merge函数是一种数据合并函数,用于对数据进行合并。通过插入merge函数
进行数据合并,可以提高数据传输和处理的效率。预设结构可以是抽象语法树中包括至少两个分支,第一分支和第二分支,第一分支包括第一父节点和第一子节点,第二分支包括第二父节点,若第一分支的第一子节点需要与第二分支的第二父节点连接或合并,则表示该抽象语法树满足预设结构。
[0105]
具体的,可以通过模式匹配,判断所述并行计算函数的抽象语法树的结构是否为预设结构。
[0106]
进一步地,若待编译文件的并行计算函数的数据流为单指令流多数据流(single instruction multiple data,simd)时,还可以基于预设simd优化算法对并行计算函数进行优化。
[0107]
其中,基于预设simd优化算法可以是针对加法指令的simd优化方法。
[0108]
具体的,当识别到当前指令为数组加法指令时,基于该预设simd优化算法对指令进行优化。
[0109]
示例性的,当识别到一个数组加上另一个数组的指令时(如数组为整数数组int32),常规的计算过程为:新建一个结果数组,长度与两个输入数组长度相等,依次遍历成对的两个输入数组,依次将两个数组对应索引的元素相加,并将结果存入结果数组。基于预设simd优化算法优化后的计算过程为(设simd位宽为256位,即8个int32):首先根据数组的总长度,先将各个数组在逻辑上分成多组:组数具体为数组的总长度整除8的商再加1,如17个元素,则为3组。对于前面两组,每组调用simd 256位加法指令,可以在芯片层面依次对两个输入组(每个输入组都是8个元素)一次性完成加法,并存储结果;对于第三组,调用simd 256位加法指令,但指定位长为32位特殊处理最后一个元素;最终结果与非simd优化结果相同,都是对于两个输入的数组,依次对应相加,存入结果数组。可见,采用预设simd优化算法优化后的加法计算过程,计算效率更高,减少了计算开销。
[0110]
当然,预设simd优化算法还可以包括针对其他运算指令进行的优化方法,本发明对此不进行限定。
[0111]
示例性的,图5是本发明图4所示实施例提供的并行计算函数的dag的示意图,图6是本发明图5所示实施例对应的优化后的dag的示意图。图5与图6为同一个待编译文件的不同编译方法下对应的dag的示意图。该待编译文件主要用于计算数据第一列和第二列的平均值和生成数据第一列、第二列的统计直方图,结合图5和图6可知,图5中提供的dag(directed acyclic graph,有向无环图)在遍历数据时,重复获取了第一列数据,同时,生成counter时,没有进行merge计算,导致需要重复读取数据,进而得到直方图。而图6中,优化了重复读取部分,使得遍历时,仅读取一次第一列和第二列对应的数据即可。同时,在生成counter时,插入了merge逻辑,进行了数据合并,简化了数据传输,提高了运行和处理效率。
[0112]
具体的,执行代码的并行计算框架可以是基于mpi(message passing interface,消息传递接口)和openmp(open multiprocessing)框架、基于模拟器或者基于异构计算实现。
[0113]
具体的,基于模拟器实现,可以是基于python的多线程或多进程池实现。基于mpi和openmp框架实现,可以是将并行任务提供和通信适配至mpi的消息通信和共享内存框架,将指令级优化翻译为openmp的预处理指令,交由openmp编译器进一步实现多核、simd和cpu
缓存优化。基于异构计算实现具体为:将通信部分适配至nvlink、rdma(remote direct memory access,远程直接数据存取)实现,将计算分布映射到opencl(open computing language,开放运算语言)的编译器实现,该实现方式可支持gpu(graphics processing unit,图形处理器)、rdma等设备。
[0114]
具体的,可以是在合并处理的基础上,进一步将数据拆分、删除重复处理和插入merge函数等处理中的至少一项处理后的各个并行计算函数,以及未进行任何处理的各个并行计算函数,生成待编译文件的执行代码。
[0115]
进一步地,还包括:将所述执行代码发送至计算机集群,以得到执行结果。
[0116]
进一步地,在得到执行结果之后还包括:显示该执行结果,或者将该执行结果发送至客户端。
[0117]
可选地,在生成所述待编译文件的执行代码之后,还包括:
[0118]
根据各个服务器的属性,对所述执行代码进行划分,以得到各个执行子代码;将各个所述执行子代码发送至相应的所述服务器中。
[0119]
其中,服务器的属性可以包括服务器所包括的cpu的数量,以及各个cpu的核心的数量。各个服务器可以是计算机集群的各个计算节点。
[0120]
在本实施例中,对基于python编辑的多层次并行计算的待编译文件,通过待编译文件中的并行计算函数的函数装饰器装饰,提取各个并行计算函数的源代码,裁剪其数据读取,减少非必要的便利步骤;并根据该源代码得到各个并行计算函数的抽象语法树,进而根据该抽象语法树,将并行计算函数中的循环函数中的计算逻辑进行合并,以及优化并行计算函数中的重复读取部分,避免出现重复读取,以简化代码,同时,基于hash拆分和merge合并对数据的拆分和合并进行优化,实现了从多个维度对代码的编译进行优化,减少运行开销,提高了代码运行效率和性能,进而提高了数据处理的效率。
[0121]
图7是本发明实施例提供的编译装置的结构示意图,如图7所示,该编译装置包括:待编译文件获取模块710、源代码提取模块720、源代码解析模块730和编译优化模块740。
[0122]
其中,待编译文件获取模块710,用于获取待编译文件;源代码提取模块720,用于根据所述待编译文件中的预设函数装饰器,提取所述待编译文件的各个并行计算函数的源代码;源代码解析模块730,用于解析各个所述并行计算函数的源代码,确定各个所述并行计算函数的抽象语法树;编译优化模块740,用于针对每个所述并行计算函数的抽象语法树,若所述抽象语法树的第一循环函数与所述抽象语法树的第二循环函数满足预设条件,则合并所述第一循环函数和所述第二循环函数,得到合并处理后的各个并行计算函数,以根据各个合并处理后的并行计算函数生成所述待编译文件的执行代码。
[0123]
可选地,编译优化模块740,具体用于:
[0124]
针对每个所述并行计算函数的抽象语法树,若所述抽象语法树的第一循环函数与所述抽象语法树的第二循环函数遍历的数据集合相同,则合并所述第一循环函数和所述第二循环函数,以生成所述待编译文件的执行代码。
[0125]
可选地,该编译装置,还包括:
[0126]
读取范围裁剪模块,用于获取各个所述并行计算函数的数据读取范围;并根据各个所述数据读取范围,确定所述待编译文件的读取数据,以通过所述并行计算函数对所述读取数据进行处理。
[0127]
可选地,该编译装置还包括:
[0128]
重复读取优化模块,用于在生成所述待编译文件的执行代码之前,针对每个所述并行计算函数的抽象语法树,识别所述抽象语法树中的重复读取部分,其中,所述重复读取部分至少存在于所述抽象语法树的第一节点和第二节点;删除所述第二节点中的所述重复读取部分;将从所述第二节点获取所述重复读取部分对应的数据的第三节点与所述第一节点连接,以使所述第三节点从所述第一节点获取所述重复读取部分对应的数据,得到删除重复的并行计算函数;第一执行代码生成模块,用于根据各个删除重复的并行计算函数生成所述待编译文件的执行代码。
[0129]
可选地,该编译装置还包括:
[0130]
数据拆分优化模块,用于在生成所述待编译文件的执行代码之前,若各个所述并行计算函数均未指定数据拆分类型,则采用hash函数对各个所述并行计算函数的数据进行拆分;或者,若任一所述并行计算函数未指定数据拆分类型,则获取第二并行计算函数的第二数据拆分类型,并采用所述第二数据拆分类型对所述并行计算函数的数据进行拆分,其中,所述第二并行计算函数为指定数据拆分类型的所述并行计算函数,所述第二数据拆分类型为所述第二并行计算函数的数据拆分类型;第二执行代码生成模块,用于根据数据拆分后的各个所述并行计算函数生成待编译文件的执行代码。
[0131]
可选地,该编译装置还包括:
[0132]
数据合并优化模块,用于在生成所述待编译文件的执行代码之前,针对每个所述并行计算函数,判断所述并行计算函数的抽象语法树的结构是否为预设结构;若是,则在所述并行计算函数中插入merge函数;第三执行代码生成模块,用于根据插入merge函数后的并行计算函数生成所述待编译文件的执行代码。
[0133]
可选地,该编译装置,还包括:
[0134]
执行代码发送模块,用于在生成所述待编译文件的执行代码之后,将所述执行代码发送至至少两个服务器,以使所述至少两个服务器执行所述执行代码,其中,所述服务器为多核服务器。
[0135]
可选地,该编译装置,还包括:
[0136]
执行代码划分模块,用于在生成所述待编译文件的执行代码之后,根据各个服务器的属性,对所述执行代码进行划分,以得到各个执行子代码;子代码发送模块,用于将各个所述执行子代码发送至相应的所述服务器中。
[0137]
本发明实施例所提供的编译装置可执行本发明任意实施例所提供的编译方法,具备执行方法相应的功能模块和有益效果。
[0138]
图8为本发明一个实施例提供的编译设备的结构示意图,如图8所示,该编译设备包括:存储器810,处理器820以及计算机程序。
[0139]
其中,计算机程序存储在存储器810中,并被配置为由处理器820执行以实现本发明图2-图4所对应的实施例中任意实施例提供的编译方法。
[0140]
其中,存储器810和处理器820通过总线830连接。
[0141]
相关说明可以对应参见图2-图4的步骤所对应的相关描述和效果进行理解,此处不做过多赘述。
[0142]
本发明一个实施例提供一种计算机可读存储介质,其上存储有计算机程序,计算
机程序被处理器执行以实现本发明图2-图4所对应的实施例中任意实施例提供的编译方法。
[0143]
其中,计算机可读存储介质可以是rom、随机存取存储器(ram)、cd-rom、磁带、软盘和光数据存储设备等。
[0144]
在本发明所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。例如,以上所描述的设备实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0145]
所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。
[0146]
另外,在本发明各个实施例中的各功能模块可以集成在一个处理单元中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个单元中。上述模块成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
[0147]
上述以软件功能模块的形式实现的集成的模块,可以存储在一个计算机可读取存储介质中。上述软件功能模块存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(英文:processor)执行本发明各个实施例所述方法的部分步骤。
[0148]
应理解,上述处理器可以是中央处理单元(central processing unit,简称cpu),还可以是其他通用处理器、数字信号处理器(digital signal processor,简称dsp)、专用集成电路(application specific integrated circuit,简称asic)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合发明所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
[0149]
存储器可能包含高速ram存储器,也可能还包括非易失性存储nvm,例如至少一个磁盘存储器,还可以为u盘、移动硬盘、只读存储器、磁盘或光盘等。
[0150]
总线可以是工业标准体系结构(industry standard architecture,简称isa)总线、外部设备互连(peripheral component,简称pci)总线或扩展工业标准体系结构(extended industry standard architecture,简称eisa)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,本发明附图中的总线并不限定仅有一根总线或一种类型的总线。
[0151]
上述存储介质可以是由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(sram),电可擦除可编程只读存储器(eeprom),可擦除可编程只读存储器(eprom),可编程只读存储器(prom),只读存储器(rom),磁存储器,快闪存储器,磁盘或光盘。存储介质可以是通用或专用计算机能够存取的任何可用介质。
[0152]
一种示例性的存储介质耦合至处理器,从而使处理器能够从该存储介质读取信息,且可向该存储介质写入信息。当然,存储介质也可以是处理器的组成部分。处理器和存
储介质可以位于专用集成电路(application specific integrated circuits,简称asic)中。当然,处理器和存储介质也可以作为分立组件存在于电子设备或主控设备中。需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
[0153]
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
[0154]
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
[0155]
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1