CN111857732A - 一种基于标记的串行程序并行化方法 - Google Patents
一种基于标记的串行程序并行化方法 Download PDFInfo
- Publication number
- CN111857732A CN111857732A CN202010756781.2A CN202010756781A CN111857732A CN 111857732 A CN111857732 A CN 111857732A CN 202010756781 A CN202010756781 A CN 202010756781A CN 111857732 A CN111857732 A CN 111857732A
- Authority
- CN
- China
- Prior art keywords
- parallel
- data
- code
- serial
- program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/51—Source to source
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/73—Program documentation
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Library & Information Science (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明涉及一种基于标记的串行程序并行化方法,包括如下步骤:步骤(1)对串行程序进行标记;步骤(2)代码解析系统对标记进行解析,记录标记子句参数;步骤(3)代码解析系统从基础并行代码库抽取并行代码段,并用标记子句参数进行填充;步骤(4)将填充后的并行代码段进行拼接,得到最终的串行程序所对应的并行程序。本发明的方法降低并行编程开发成本,减轻开发人员负担;提供了多个平台的并行化能力,可由一个串行API得到多个并行平台的并行API;无需单独开发专用编译器,可直接采用成熟编译器,并行编译效率高。基于标记的方法不对原程序进行改写,无需对串行程序有深入的了解,标准化的标记解析过程提高了并行程序的可靠性,降低了出错概率。
Description
技术领域
本发明涉及一种并行程序生成方法,特别是涉及一种串行程序并行化方法。
背景技术
随着并行计算技术的发展和普及,业界存有大量的串行应用程序需要迫切改造为并行程序,来提高数据处理能力。而串行程序并行化面临两个基本问题:(1)并行编程的高成本问题。并行编程需要专业的并行编程能力和丰富的工程经验,开发并行程序需要大量的工程成本和时间。(2)并行平台的多样性问题。随着各种并行硬件平台和并行编程模型数量的增加,并呈现出多样化,需要具备快速生成所需目标并行平台的并行程序的能力。针对上述两个问题,需要通过高效易用的并行化方法来辅助并行编程。
并行平台是并行硬件平台及相对应的并行编程模型的组合。并行硬件平台按其存储结构可分为共享存储结构和分布存储结构两大类。共享存储结构硬件平台有多个CPU共同工作,无主次关系,各CPU共享同一物理内存,通过内存地址操作来进行通信;分布存储结构硬件平台由多个节点组成,每个节点都有独立的一个或多个CPU和独立的物理内存,各节点可以独立运行,通过节点间的网络进行通信。不同并行硬件平台有对应的并行编程模型,共享存储结构硬件平台的典型并行编程模型是OpenMP,它是一种基于制导标记的多线程并行编程模型,通过显式标记描述并行语义。分布存储结构硬件平台的典型并行编程模型是MPI,它提供了丰富的标准API帮助用户完成并行环境搭建、节点通信和同步等操作。
现有的串行程序并行化方法主要有两类,其主要内容及缺点是:(1)自动并行化工具。此类工具通过自动分析原串行程序中的可并行部分并按照一定的编译规则进行并行编译,需要单独开发专用编译器,同时为了保持原有串行程序语义,导致编译器策略保守,并行效率不高。(2)传统并行编程模型。此类工具采用现有的成熟的经典的并行编程框架对原串行程序进行改写,但程序改写需要对原串行程序有深入的了解,需要有经验的设计人员且工作量大,程序改写过程容易出错,程序质量取决于开发人员的专业能力,而且此类工具的平台相关性强,所生成的并行程序大多针对具体并行平台,并行平台更换后需要重新开发
发明内容
为了解决上述技术问题,针对串行程序并行化面临的两个基本问题以及现有并行化方法的缺点,本发明提供了一种串行程序并行化方法,通过对串行程序进行标记,并对标记进行解析生成并行程序的方法,解决串行程序并行化的高成本问题和并行平台的多样性问题。
本发明的技术方案为:一种基于标记的串行程序并行化方法,该方法包括如下步骤:
步骤(1)对串行程序进行标记;
步骤(2)代码解析系统对标记进行解析,记录标记子句参数;
步骤(3)代码解析系统从基础并行代码库抽取并行代码段,并用标记子句参数进行填充;
步骤(4)将填充后的并行代码段进行拼接,得到最终将串行程序转化后所对应的并行程序。
进一步的,对串行API函数的函数名进行标记,所述标记包括标记名和标记子句,标记名用于后续代码解析系统识别,标记子句用于提供并行化所需的参数,包括数据源、数据目的和数据批数,其中,数据源子句提供待并行处理的数据包信息,数据目的子句提供并行处理结束后的结果数据包信息,数据批数子句提供数据源子句里数据包的可拆分批数,可拆分的原则是拆分后的每批数据都能被串行程序单独处理。
进一步的,代码解析系统包括解析模块和代码抽取模,解析模块负责读取并解析标记后的串行程序,当识别到标记名时,解析并记录标记子句参数和标记的串行程序;代码抽取模块负责从基础并行代码库抽取代码段。
进一步的,所述的基础并行代码库记录了共享存储平台和分布存储平台的三个并行阶段,即数据划分和分发、数据计算、数据收集的并行代码片段。
进一步的,所述的代码解析系统将标记子句参数填充到并行代码段的相应的固定点位,得到含标记子句参数的并行代码段。
进一步的,在共享存储平台下,拼接顺序为数据划分和分发、数据收集、数据计算;在分布存储平台下,拼接顺序为数据划分和分发、数据计算、数据收集。
进一步的,拼接后,再加上变量定义的固定代码,得到并行API函数的函数体;将串行API函数名加并行识别后缀作为并行API函数的函数名;将串行API函数参数列表加线程数参数后整体作为并行API函数的参数列表。
本发明的有益成果是:
(1)降低并行编程开发成本,减轻开发人员负担;
(2)提供了多个平台的并行化能力,可由一个串行API得到多个并行平台的并行API;
(3)无需单独开发专用编译器,可直接采用成熟编译器,并行编译效率高;
(4)基于标记的方法不对原程序进行改写,无需对串行程序有深入的了解,标准化的标记解析过程提高了并行程序的可靠性,降低出错概率。
附图说明
图1是本发明的整体流程图;
图2是本发明的代码解析系统的算法流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅为本发明的一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域的普通技术人员在不付出创造性劳动的前提下所获得的所有其他实施例,都属于本发明的保护范围。
图1是本发明一种基于标记的串行程序并行化方法的整体流程图,该方法包括如下步骤:
步骤(1)对串行程序进行标记。
步骤(2)代码解析系统对标记进行解析,记录标记子句参数。
步骤(3)代码解析系统从基础并行代码库抽取并行代码段,并用标记子句参数进行填充。
步骤(4)将填充后的并行代码段进行拼接,得到最终的串行程序所对应的并行程序。
具体的,步骤(1)对串行程序进行标记,包括:
所述串行程序指的是串行API函数。在软件工程领域,API(ApplicationProgramming Interface,应用程序接口)函数是一些预先定义的函数,代表一个可供调用的具体的软件功能模块,是计算机软件的基本组成结构。按照软件工程规范,一个串行API函数由函数名、参数列表和函数体三部分构成。
所述标记是一种标识字段,用于表达并行语义并指示并行位置,包括了标记名和标记子句,其中,标记名用于后续代码解析系统识别,是固定的且形式区别于一般程序代码,标记子句用于提供并行化所需的参数,由开发人员填写且与串行程序相关。标记子句包括数据源、数据目的和数据批数,标记子句的参数既可以取自串行程序参数列表也可由开发人员指定,其中,数据源子句提供待并行处理的数据包信息,数据目的子句提供并行处理结束后的结果数据包信息,数据批数子句提供数据源子句里数据包的可拆分批数,可拆分的原则是拆分后的每批数据都可以被串行程序单独处理。
该步骤流程是:开发人员将标记添加到串行程序定义部分的函数名上方。
(2)代码解析系统对标记进行解析,记录标记子句参数。
所述代码解析系统是一个可独立执行的程序,负责读取标记后的串行程序文件,并将其解析为对应的并行程序,是本发明所述方法的重要实现工具。代码解析系统包括解析模块和代码抽取模块。解析模块负责读取并解析标记后的串行程序,代码抽取模块负责从基础并行代码库抽取代码段。
该步骤流程是:代码解析系统读取(1)得到的标记后的串行程序文件,从头至尾扫描,当识别到标记名时,解析并记录标记子句参数和标记的串行程序。
(3)代码解析系统从基础并行代码库抽取并行代码段,并用标记子句参数进行填充。
所述基础并行代码库是一个文件,记录了多个并行平台的多个并行阶段的并行代码片段。基础并行代码库目前覆盖的并行平台包括共享存储结构硬件平台及OpenMP编程模型和分布存储结构硬件平台及MPI编程模型,以下分别简称为共享存储平台和分布存储平台。所述多个并行阶段指的是并行程序执行过程,即并行程序的程序结构,可分为三个并行阶段:数据划分和分发、数据计算、数据收集。总的来说,基础并行代码库包括了共享存储平台和分布存储平台的数据划分和分发、数据计算、数据收集三种类型的代码段。基础并行代码库保留了扩充接口,可扩充到其他并行平台。
所述抽取并行代码段指的是代码解析系统从基础并行代码库中选择所需并行代码段,选择依据是并行平台和并行阶段。以共享存储平台下的数据收集阶段为例,代码解析系统查询基础并行代码库共享存储平台目录下的代码段集合,并返回数据收集阶段代码段。
该步骤流程是:代码解析系统根据并行平台和并行阶段从基础并行代码库中依次查找该并行平台下三个并行阶段(数据划分和分发、数据计算、数据收集)的并行代码段,并将(2)得到的标记子句参数填充到并行代码段的相应固定点位,得到含标记子句参数的各阶段并行代码段。
(4)将填充后的并行代码段进行拼接,得到最终的串行程序所对应的并行程序。
所述并行程序指的是串行API函数对应的并行API函数,可供开发人员调用。按照软件工程规范,同串行API函数一样,一个并行API函数由函数名、参数列表和函数体三部分构成。
该步骤流程是:关于函数体,在共享存储平台下,将(3)所得到的代码段按数据划分和分发、数据收集、数据计算的顺序依次拼接,在分布存储平台下,拼接顺序为数据划分和分发、数据计算、数据收集,得到并行API函数的函数体,需要说明的是共享存储平台与分布存储平台的拼接顺序不同,是因为共享存储平台采用的是内存地址操作进行数据传输,在数据计算之前要计算好数据收集地址,所以要将数据收集阶段放置到数据计算之前。关于函数名,将串行API函数名加_prallel后缀作为并行API函数的函数名。关于参数列表,将串行API函数参数列表加numprocs参数后整体作为并行API函数的参数列表,numprocs参数指的是并行处理单元数,共享存储平台和分布存储平台下分别代表线程数和节点进程数。
根据本发明的一个优选实施例:本发明实施例对串行程序Func_serial(srcname,dstname,num,var1,var2)进行并行化,分别并行化为共享存储平台和分布存储平台下的并行程序。
步骤(1)对串行程序进行标记,具体为:
将标记#sigma parallel_task添加到串行程序函数名上方。标记后如下所示:
#sigma parallel_task src_data(srcname;srcdatatype;srcsize)
dst_data(dstname;dstdatatype;dstsize)
group(num)
Func_serial(srcname,dstname,num,var1,var2)//函数名及参数列表
{
….//函数体
}
其中,标记名#sigma parallel_task用于后续代码解析系统识别,标记子句用于提供代码解析所需的参数,是由开发人员填写的且与串行程序相关。标记子句src_data(srcname;srcdatatype;srcsize)、dst_data(dstname;dstdatatype;dstsize)和group(num)分别代表数据源、数据目的和数据批数,其中,数据源子句参数srcname,srcdatatype,srcsize分别指出了待并行处理的数据包的地址、数据类型和数据量,数据目的子句参数dstname,dstdatatype,stsize分别指出了并行处理结束后的结果数据包的地址、数据类型和数据量,数据批数子句提供数据源的可拆分批数。
步骤(2)代码解析系统对标记进行解析,记录标记参数,具体为:
代码解析系统的算法思想如图2所示。
代码解析系统读取步骤(1)得到的标记后的串行程序文件,从头至尾扫描,当识别到标记名#sigma parallel_task时,解析模块解析并记录各标记子句参数,例如srcname、srcdatatype、srcsize等,同时记录标记的串行程序函数名Func_serial及参数列表(srcname,dstname,num,var1,var2)。非标记部分则不解析。
步骤(3)代码解析系统从基础并行代码库抽取并行代码段,并用标记参数进行填充,具体为:
共享存储平台的实施方式与分布存储平台不同,首先以共享存储平台为例:
(a)数据划分和分发阶段
代码解析系统的代码抽取模块查询基础并行代码库共享存储平台目录下的代码段集合,并返回数据划分和分发代码段。该代码段如下所示:
average_allocation(t_testlocals,step,step_before,numprocs,①);
stepsize=③/①;
DataPartition(numprocs,step,step_before,stepsize,sendrecvcnts,displs);
Data_trans(②,numprocs,displs,②_in);
代码解析系统的解析模块用步骤(2)所得的标记子句参数对相应点位进行填充(所述点位是代码段自带的)其中点位①填充为num,点位②填充为srcname,点位③填充为srcsize,该过程由代码解析系统自动完成,填充后得到代码段如下:
average_allocation(t_testlocals,step,step_before,numprocs,num);
stepsize=srcsize/num;
DataPartition(numprocs,step,step_before,stepsize,sendrecvcnts,displs);
Data_trans(srcname,numprocs,displs,srcname_in);
对该代码段中的几个函数进行介绍:
数据划分函数average_allocation的作用是将num批数据划分到numprocs个线程中,结果存放在step和step_before数组中,t_testlocals为划分比例系数,默认为1。数据划分方式如下:
其中,stepi和step_beforei分别表示线程i所得到的数据批数及批数偏移量,批数偏移量指的是前i-1个线程所得数据量之和。
数据量计算函数DataPartition函数的作用是计算各线程所得的数据量及数据量偏移量,结果存放在sendrecvcnts和displs数组中。计算方式如下:
sendrecvcntsi=stepsize*stepi 0≤i<numprocs
displsi=stepsize*step_beforei 0≤i<numprocs
其中,sendrecvcntsi和displsi表示线程i所得到的数据量及数据量偏移量,数据量偏移量指的是前i-1个线程所得数据量之和。
数据分发函数Data_trans的作用是将数据对各线程分发,将地址为srcname的待处理的数据包分发到各线程。由于共享存储平台的采用的是共享存储结构,各线程共享同一块物理内存,数据的分发操作可以转换为内存地址操作。地址计算方式是:
srcname_ini=srcname+displsi 0≤i<numprocs
其中,srcname_ini表示线程i所分配到的输入数据的地址。
(b)数据计算阶段
代码解析系统的代码抽取模块查询基础并行代码库共享存储平台目录下的代码段集合,并返回数据计算代码段。该代码段如下所示:
omp_set_num_threads(numprocs);
#pragma omp parallel
{
int i=omp_get_thread_num();
Func_serial(①_in[i],②_out[i],step[i],var1,var2);
}
代码解析系统的解析模块用步骤(2)所得的标记子句参数对相应点位进行填充,其中点位①填充为srcname,点位②填充为dstname,该过程由代码解析系统自动完成,填充后得到代码段如下:
omp_set_num_threads(numprocs);
#pragma omp parallel
{
int i=omp_get_thread_num();
Func_serial(srcname_in[i],dstname_out[i],step[i],var1,var2);
}
该代码段中,omp_set_num_threads是OpenMP设置线程数的语句,将并行域线程数设置为numprocs。由#pragma omp parallel开启并行域后,每个线程都并行执行并行域中的代码段,各线程通过调用串行API函数Func_serial进行数据计算,函数参数srcname_in[i]和dstname_out[i]分别表示线程i的所分配到的输入数据地址和输出数据地址。此处srcname_in[i]与上述srcname_ini相同含义,dstname_out[i]亦同理。
(c)数据收集阶段
代码解析系统的代码抽取模块查询基础并行代码库共享存储平台目录下的代码段集合,并返回数据收集代码段。该代码段如下所示:
stepsize=③/①;
DataPartition(numprocs,step,step_before,stepsize,sendrecvcnts,displs);
Data_trans(②,numprocs,displs,②_in);
代码解析系统的解析模块用步骤(2)所得的标记子句参数进行填充,其中点位①填充为num,点位②填充为dstname,点位③填充为dstsize,该过程由代码解析系统自动完成,填充后得到代码段如下:
stepsize=dstsize/num;
DataPartition(numprocs,step,step_before,stepsize,sendrecvcnts,displs);
Data_trans(dstname,numprocs,displs,dstname_out);
该代码段中,Data_trans函数的作用是将数据从各线程收集到输出数据包地址dstname,具体原理已在(a)中介绍,不再赘述,DataPartition函数的说明亦已介绍,不再赘述。
根据本发明的一优选实施例,再以分布存储平台为例:
(a)数据划分和分发阶段
代码解析系统的代码抽取模块查询基础并行代码库分布存储平台目录下的代码段集合,并返回数据划分和分发代码段。该代码段如下所示:
average_allocation(t_testlocals,step,step_before,numprocs,①);
stepsize=③/①;
DataPartition(numprocs,step,step_before,stepsize,sendrecvcnts,displs);
MPI_Scatterv(②,sendrecvcnts,displs,MPI_④,
②_in,sendrecvcnts[myid],MPI_④,0,MPI_COMM_WORLD);
代码解析系统的解析模块用(2)所得的标记子句参数进行填充,其中点位①填充为num,点位②填充为srcname,点位③填充为srcsize,点位④填充为srcdatatype,该过程由代码解析系统自动完成,填充后得到代码段如下:
average_allocation(t_testlocals,step,step_before,numprocs,num);
stepsize=srcsize/num;
DataPartition(numprocs,step,step_before,stepsize,sendrecvcnts,displs);
MPI_Scatterv(srcname,sendrecvcnts,displs,MPI_srcdatatype,srcname_in,
sendrecvcnts[myid],MPI_srcdatatype,0,MPI_COMM_WORLD);
该代码段中的average_allocation和DataPartition已介绍,在此不赘述。MPI数据分发函数MPI_Scatterv是MPI的标准分发函数。
(b)数据计算阶段
代码解析系统的代码抽取模块查询基础并行代码库分布存储平台目录下的代码段集合,并返回数据计算代码段。该代码段如下所示:
Func_serial(①_in,②_out,step[myid],var1,var2);
代码解析系统的解析模块用(2)所得的标记子句参数进行填充,其中点位①填充为srcname,点位②填充为dstname,该过程由代码解析系统自动完成,填充后得到代码段如下:
Func_serial(srcname_in,dstname_out,step[myid],var1,var2);
分布存储平台的各节点均通过调用串行程序Func_serial进行数据计算。
(c)数据收集阶段
代码解析系统的代码抽取模块查询基础并行代码库分布存储平台目录下的代码段集合,并返回数据收集代码段。该代码段如下所示:
stepsize=③/①;
DataPartition(numprocs,step,step_before,stepsize,sendrecvcnts,displs);
MPI_Allgatherv(②_out,sendrecvcnts[myid],MPI_④,②,sendrecvcnts,
displs,MPI_④,MPI_COMM_WORLD);
Data_trans(②,numprocs,displs,②_in);
代码解析系统的解析模块用(2)所得的标记子句参数进行填充,其中点位①填充为num,点位②填充为dstname,点位③填充为dstsize,点位④填充为dstdatatype,该过程由代码解析系统自动完成,填充后得到代码段如下:
stepsize=dstsize/num;
DataPartition(numprocs,step,step_before,stepsize,sendrecvcnts,displs);
MPI_Allgatherv(dstname_out,sendrecvcnts[myid],MPI_dstdatatype,dstname,
endrecvcnts,displs,MPI_dstdatatype,MPI_COMM_WORLD);
该代码段中,MPI数据收集函数MPI_Allgatherv是MPI标准函数,其作用是将数据从各节点收集到输出数据包地址dstname。DataPartition函数的具体原理已在上述介绍,不再赘述。
步骤(4)将填充后的并行代码段进行拼接,得到最终将串行程序转化后所对应的并行程序,具体为:
以共享存储平台为例,代码解析系统的解析模块将步骤(3)所得到的代码段按数据划分和分发、数据收集、数据计算的顺序依次拼接,再加上变量定义等固定代码,得到并行API函数的函数体。将串行API函数名加_prallel后缀作为并行API函数的函数名。将串行API函数参数列表加numprocs参数后整体作为并行API函数的参数列表,numprocs参数是线程数。
得到的并行程序如下所示:
1.Func_serial_parallel(srcname,dstname,num,var1,var2,numprocs)
2.{
3.......//临时变量定义
4.//数据划分
5.average_allocation(t_testlocals,step,step_before,numprocs,num);
6.stepsize=srcsize/num;
7.DataPartition(numprocs,step,step_before,stepsize,sendrecvcnts,displs);
8.//数据分发
9.Data_trans(srcname,numprocs,displs,srcname_in);
10.//数据收集
11.stepsize=dstsize/num;
12.DataPartition(numprocs,step,step_before,stepsize,sendrecvcnts,displs);
13.Data_trans(dstname,numprocs,displs,dstname_out);
14.//数据计算
15.omp_set_num_threads(numprocs);
16.#pragma omp parallel
17.{
18.int i=omp_get_thread_num();
19.Func_serial(srcname_in[i],dstname_out[i],step[i],var1,var2);
20.}
21.}
以分布存储平台为例,将步骤(3)所得到的代码段按数据划分和分发、数据计算、数据收集的顺序依次拼接,再加上变量定义等固定代码,得到并行API函数的函数体。将串行API函数名加_prallel后缀作为并行API函数的函数名。将串行API函数参数列表加numprocs参数后整体作为并行API函数的参数列表,numprocs参数是节点进程数。
得到的并行程序如下所示:
1.Func_serial_parallel(srcname,dstname,num,var1,var2,numprocs)
2.{
3.......//临时变量定义
4.//数据划分
5.average_allocation(t_testlocals,step,step_before,numprocs,num);
6.stepsize=srcsize/num;
7.DataPartition(numprocs,step,step_before,stepsize,sendrecvcnts,displs);
8.//数据分发
9.MPI_Scatterv(srcname,sendrecvcnts,displs,MPI_srcdatatype,srcname_in,sendrecvcnts[myid],MPI_srcdatatype,0,MPI_COMM_WORLD);
//数据计算
10.Func_serial(srcname_in,dstname_out,step[myid],var1,var2);
11.//数据收集
12.stepsize=dstsize/num;
13.DataPartition(numprocs,step,step_before,stepsize,sendrecvcnts,displs);
14.MPI_Allgatherv(dstname_out,sendrecvcnts[myid],MPI_dstdatatype,dstname,sendrecvcnts,displs,/MPI_dstdatatype,MPI_COMM_WORLD);
15.}
尽管上面对本发明说明性的具体实施方式进行了描述,以便于本技术领域的技术人员理解本发明,且应该清楚,本发明不限于具体实施方式的范围,对本技术领域的普通技术人员来讲,只要各种变化在所附的权利要求限定和确定的本发明的精神和范围内,这些变化是显而易见的,一切利用本发明构思的发明创造均在保护之列。
Claims (7)
1.一种基于标记的串行程序并行化方法,其特征在于,该方法包括如下步骤:
步骤(1)对串行程序进行标记;
步骤(2)代码解析系统对标记进行解析,记录标记子句参数;
步骤(3)代码解析系统从基础并行代码库抽取并行代码段,并用标记子句参数进行填充;
步骤(4)将填充后的并行代码段进行拼接,得到最终的串行程序所对应的并行程序。
2.根据权利要求1所述的一种基于标记的串行程序并行化方法,其特征在于:
对串行API函数的函数名进行标记,所述标记包括标记名和标记子句,标记名用于后续代码解析系统识别,标记子句用于提供并行化所需的参数,包括数据源、数据目的和数据批数,其中,数据源子句提供待并行处理的数据包信息,数据目的子句提供并行处理结束后的结果数据包信息,数据批数子句提供数据源子句里数据包的可拆分批数,可拆分的原则是拆分后的每批数据都能被串行程序单独处理。
3.根据权利要求1所述的一种基于标记的串行程序并行化方法,其特征在于:
代码解析系统包括解析模块和代码抽取模,解析模块负责读取并解析标记后的串行程序,当识别到标记名时,解析并记录标记子句参数和标记的串行程序;代码抽取模块负责从基础并行代码库抽取代码段。
4.根据权利要求3所述的一种基于标记的串行程序并行化方法,其特征在于:
所述的基础并行代码库记录了共享存储平台和分布存储平台的三个并行阶段,即数据划分和分发、数据计算、数据收集的并行代码片段。
5.根据权利要求1所述的一种基于标记的串行程序并行化方法,其特征在于:
所述的代码解析系统将标记子句参数填充到并行代码段的相应的固定点位,得到含标记子句参数的并行代码段。
6.根据权利要求1所述的一种基于标记的串行程序并行化方法,其特征在于:
在共享存储平台下,拼接顺序为数据划分和分发、数据收集、数据计算;在分布存储平台下,拼接顺序为数据划分和分发、数据计算、数据收集。
7.根据权利要求6所述的一种基于标记的串行程序并行化方法,其特征在于:
拼接后,再加上变量定义的固定代码,得到并行API函数的函数体;将串行API函数名加并行识别后缀作为并行API函数的函数名;将串行API函数参数列表加线程数参数后整体作为并行API函数的参数列表。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202010756781.2A CN111857732B (zh) | 2020-07-31 | 2020-07-31 | 一种基于标记的串行程序并行化方法 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202010756781.2A CN111857732B (zh) | 2020-07-31 | 2020-07-31 | 一种基于标记的串行程序并行化方法 |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| CN111857732A true CN111857732A (zh) | 2020-10-30 |
| CN111857732B CN111857732B (zh) | 2021-10-22 |
Family
ID=72952524
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| CN202010756781.2A Active CN111857732B (zh) | 2020-07-31 | 2020-07-31 | 一种基于标记的串行程序并行化方法 |
Country Status (1)
| Country | Link |
|---|---|
| CN (1) | CN111857732B (zh) |
Cited By (1)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| TWI888110B (zh) * | 2023-04-24 | 2025-06-21 | 瑞士商邁納提克斯有限公司 | 具有多處理管線靜態排程的用於最佳化的多核心和/或多處理器積體電路架構的設計和製造系統和方法 |
Citations (6)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| SU433482A1 (ru) * | 1972-02-28 | 1974-06-25 | ДИвакин , В.Н.Тресоруков | УСТРОЙСТВО mi GOiymmwAШЧИСЖТЕЛЬНОЙ ivlAMIt-Ш С KAHAJIAI'M СВЯЗИ |
| CN1123930A (zh) * | 1994-04-28 | 1996-06-05 | 东芝株式会社 | 支援并行程序设计的装置以及设计并行程序的方法 |
| JP2004192139A (ja) * | 2002-12-09 | 2004-07-08 | Sharp Corp | デバッグ装置、デバッグ方法および記録媒体 |
| CN1932766A (zh) * | 2006-10-12 | 2007-03-21 | 上海交通大学 | 面向串行程序代码量大的领域的半自动并行化方法 |
| CN101799762A (zh) * | 2010-04-07 | 2010-08-11 | 中国科学院对地观测与数字地球科学中心 | 面向遥感图像处理算法的快速并行化编程模板方法 |
| CN101944040A (zh) * | 2010-09-15 | 2011-01-12 | 复旦大学 | 一种基于谓词的自动并行优化方法 |
-
2020
- 2020-07-31 CN CN202010756781.2A patent/CN111857732B/zh active Active
Patent Citations (6)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| SU433482A1 (ru) * | 1972-02-28 | 1974-06-25 | ДИвакин , В.Н.Тресоруков | УСТРОЙСТВО mi GOiymmwAШЧИСЖТЕЛЬНОЙ ivlAMIt-Ш С KAHAJIAI'M СВЯЗИ |
| CN1123930A (zh) * | 1994-04-28 | 1996-06-05 | 东芝株式会社 | 支援并行程序设计的装置以及设计并行程序的方法 |
| JP2004192139A (ja) * | 2002-12-09 | 2004-07-08 | Sharp Corp | デバッグ装置、デバッグ方法および記録媒体 |
| CN1932766A (zh) * | 2006-10-12 | 2007-03-21 | 上海交通大学 | 面向串行程序代码量大的领域的半自动并行化方法 |
| CN101799762A (zh) * | 2010-04-07 | 2010-08-11 | 中国科学院对地观测与数字地球科学中心 | 面向遥感图像处理算法的快速并行化编程模板方法 |
| CN101944040A (zh) * | 2010-09-15 | 2011-01-12 | 复旦大学 | 一种基于谓词的自动并行优化方法 |
Non-Patent Citations (1)
| Title |
|---|
| FM镄: ""【并行计算】基于OpenMP的并行编程(#pragma omp parallel for)"", 《HTTPS://BLOG.CSDN.NET/WEIXIN_39568744/ARTICLE/DETAILS/88576576》 * |
Cited By (1)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| TWI888110B (zh) * | 2023-04-24 | 2025-06-21 | 瑞士商邁納提克斯有限公司 | 具有多處理管線靜態排程的用於最佳化的多核心和/或多處理器積體電路架構的設計和製造系統和方法 |
Also Published As
| Publication number | Publication date |
|---|---|
| CN111857732B (zh) | 2021-10-22 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| CN110187885B (zh) | 一种量子程序编译的中间代码生成方法及装置 | |
| CN108614960B (zh) | 一种基于前端字节码技术的JavaScript虚拟化保护方法 | |
| US6859810B2 (en) | Declarative specification and engine for non-isomorphic data mapping | |
| CN110633076B (zh) | 一种自动生成Solidity智能合约Java客户端程序的方法 | |
| CN106371887A (zh) | 一种msvl语言的编译系统及方法 | |
| JP3047998B2 (ja) | 並列計算機におけるプロセッサ割り当て方法、及び装置 | |
| CN112379917A (zh) | 浏览器兼容性提升方法、装置、设备及存储介质 | |
| CN114217886A (zh) | 一种函数调用方法、计算设备及存储介质 | |
| EP0520708B1 (en) | Method and apparatus for converting high level form abstract syntaxes into an intermediate form | |
| CN107168795A (zh) | 基于cpu‑gpu异构复合式并行计算框架的密码子偏差系数模型方法 | |
| US20230116546A1 (en) | Method for compilation, electronic device and storage medium | |
| CN119621074A (zh) | 一种代码转换方法、装置、计算机设备及存储介质 | |
| CN120803527A (zh) | 一种辅助移植Android语言到鸿蒙ArkTS语言的系统 | |
| CN118312153A (zh) | 编译器后端代码生成方法、装置、存储介质 | |
| CN119862833A (zh) | 基于物联网的异构芯片设计方法及系统 | |
| CN118034662A (zh) | 一种基于大模型的OpenMP全自动并行性能优化方法及装置 | |
| CN115469860B (zh) | 基于指令集的需求到软件领域模型的自动生成方法及系统 | |
| CN111857732A (zh) | 一种基于标记的串行程序并行化方法 | |
| CN116755769A (zh) | 一种源代码注释生成方法、装置、存储介质及计算机设备 | |
| CN118916031B (zh) | 一种用于互联网医疗平台的多终端代码映射转译方法 | |
| CN114791808A (zh) | 一种数据流图生成方法及装置 | |
| CN119311289A (zh) | 基于编译器进行代码自动升级的方法、装置以及存储介质 | |
| CN120215908A (zh) | 基于人工智能的编译器后端开发辅助方法及装置 | |
| Hoeller et al. | Efficient XML usage within wireless sensor networks | |
| CN113094040B (zh) | 一种小程序编译方法和装置 |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| PB01 | Publication | ||
| PB01 | Publication | ||
| SE01 | Entry into force of request for substantive examination | ||
| SE01 | Entry into force of request for substantive examination | ||
| GR01 | Patent grant | ||
| GR01 | Patent grant |