CN112579088A - 面向异构混合编程的一站式程序编译方法 - Google Patents
面向异构混合编程的一站式程序编译方法 Download PDFInfo
- Publication number
- CN112579088A CN112579088A CN201910920675.0A CN201910920675A CN112579088A CN 112579088 A CN112579088 A CN 112579088A CN 201910920675 A CN201910920675 A CN 201910920675A CN 112579088 A CN112579088 A CN 112579088A
- Authority
- CN
- China
- Prior art keywords
- core
- compiling
- program
- variable
- control
- 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.)
- Withdrawn
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种面向异构混合编程的一站式程序编译方法,编译器总控增加包括扩展关键字和制导语句,在运算核心变量前添加关键字,在运算核心的函数声明及定义点前添加一个编译指示,在控制核心调用运算核心函数的调用点前添加编译指示;经过前端编译,自动分离控制核心与运算核心的变量与函数;编译器中端对分离出的控制核心上与运算核心上的变量和函数分别进行编译和优化,生成控制核心上程序的中间表示和运算核心上程序的中间表示;将控制核心上和运算核心编译和优化的结果编译成异构众核目标代码。本发明通过在一个编译器内一站式完成控制核心和运算核心代码的分离编译和融合编译,能够解决源到源方式实现复杂、调试困难、可扩展性差的问题。
Description
技术领域
本发明属于代码编译领域,尤其涉及一种面向异构混合编程的一站式程序编译方法。
背景技术
异构众核系统通常采用控制核心+运算核心的体系架构,其中控制核心负责处理复杂的逻辑控制任务,运算核心负责处理计算密度高、逻辑分支简单的大规模数据并行任务,两者协同为具体的应用提供高效的计算平台。不同的任务分工导致控制核心与运算核心支持的指令和数据类型均有差异,所以控制核程序源代码与运算核程序源代码需要分开编写(即分布在不同的源文件中),然后调用控制核心编译器编译生成在控制核心上运行的目标码,调用运算核心编译器编译生成在运算核心上运行的目标码,最后再将这两个目标码进行链接,生成最终的可在异构众核系统上运行的可执行文件。这种分开编程、分开编译的方法,给软件设计开发带来极大不便,影响开发效率。
申请号CN201410035089.5,发明名称为《一种分开编译异构混编程序的方法及系统》中,该方法可以屏蔽因运算核心与控制核心的结构不同导致的平台编程差异,解决异构众核编程存在的分开编程、分开编译的问题,使用户看起来像是为同一种类型的处理器编程。然而,这种先将源程序转换为分离的主控处理器程序和受控处理器程序后,再分别编译的异构代码分开编译机制,首先是要实现一个源到源的转换工具,该转换工具需要从头开发,实现复杂且调试困难。当该专利的方法用于提供对另一种编程语言所编程序的支持,就需要重新开发一套相应的源到源转换工具,因此该方法的可扩展性很差。
发明内容
本发明目的在于提供一种面向异构混合编程的一站式程序编译方法,其解决了已有的通过源到源转换工具生成分离的控制核心源代码和运算核心源代码,再调用不同的编译器进行分别编译所带来的实现复杂、调试困难、可扩展性差等问题。
为达到上述目的,本发明采用的技术方案是:一种面向异构混合编程的一站式程序编译方法,包括以下步骤,
S1:编译器总控增加编译流程和控制选项,提供标示运算核心私有变量的关键字和标示运行在运算核心上代码的制导语句,在运算核心变量前添加关键字,区分变量为运算核心私有变量还是运算核心共享变量,在运算核心函数声明及定义点前添加一个特殊的编译指示,与程序中控制核心函数进行区分,在控制核心调用运算核心函数的调用点前添加特殊编译指示,与调用控制核心函数进行区分;
S2:编译器前端根据扩展关键字和制导语句编译程序,自动分离控制核心与运算核心的变量与函数;
S3:编译器中端对分离出的控制核心上与运算核心上的变量和函数分别进行编译和优化,生成控制核心上程序的中间表示和运算核心上程序的中间表示;
S4:异构融合编译阶段,将编译器中端编译优化的控制核心上程序的中间表示和编译器中端编译优化的计算核心上程序的中间表示一起编译为异构众核目标代码。
上述技术方案中进一步改进的技术方案如下:
1. 上述方案中,编译器将控制核心变量写入控制核心程序的符号表,在计算核心程序的符号表中只是标注控制核心变量的属性为extern类型。
2. 上述方案中,编译器编译结束前,扫描控制核心程序和运算核心程序编译时生成的符号表,对于具有static属性的静态变量,取出静态变量符号的变量名,在原有变量名字符串之前添加与变量所在文件名相关的字符串。
3. 上述方案中,所述编译器用于C语言、C++、fortran语言。
由于上述技术方案的运用,本发明与现有技术相比具有下列优点:
1)本发明面向异构混合编程的一站式程序编译方法,通过在一个编译器内一站式完成控制核心和运算核心代码的分离编译和融合编译,能够解决源到源方式实现复杂、调试困难、可扩展性差的问题。
2)本发明面向异构混合编程的一站式程序编译方法,能实现对静态变量的编译器自动换名的方法。
3)本发明面向异构混合编程的一站式程序编译方法,可以很方便地应用于编译器支持的其他语言类型源文件的控制核与运算核的代码分离及编译,具有更好的可扩展性。
附图说明
附图1为本发明面向异构混合编程的一站式程序编译方法的流程图。
具体实施方式
实施例:如图1所示,一种面向异构混合编程的一站式程序编译方法,包括以下步骤,
S1:编译器总控增加编译流程和控制选项,提供标示运算核心私有变量的关键字和标示运行在运算核心上代码的制导语句,在运算核心变量前添加关键字,区分变量为运算核心私有变量还是运算核心共享变量,在运算核心函数声明及定义点前添加一个特殊的编译指示,与程序中控制核心函数进行区分,在控制核心调用运算核心函数的调用点前添加特殊编译指示,与调用控制核心函数进行区分;
S2:编译器前端根据扩展关键字和制导语句编译程序,自动分离控制核心与运算核心的变量与函数;
S3:编译器中端对分离出的控制核心上与运算核心上的变量和函数分别进行编译和优化,生成控制核心上程序的中间表示和运算核心上程序的中间表示;
S4:异构融合编译阶段,将编译器中端编译优化的控制核心上程序的中间表示和编译器中端编译优化的计算核心上程序的中间表示一起编译为异构众核目标代码。
编译器将控制核心变量写入控制核心程序的符号表,在计算核心程序的符号表中只是标注控制核心变量的属性为extern类型。
编译器编译结束前,扫描控制核心程序和运算核心程序编译时生成的符号表,对于具有static属性的静态变量,取出静态变量符号的变量名,在原有变量名字符串前面添加上与变量所在文件名相关的字符串。
所述编译器用于C语言、C++、fortran语言。
实施例进一步解释如下:
使用扩展关键字和制导语句标记运算核心变量和运算核心函数。根据不同的存储层次,在运算核心私有变量前添加关键字,如:关键字__thread用于区分变量为运算核心私有变量还是运算核心共享变量。不同变量类型的使用范围互不相同,如对于运算核心私有变量,每个运算核心在执行时的值都是独立的、互不相关,因此可以直接使用;而对于运算核心共享变量,该变量是所有运算核心可见的,所有的运算核心都可以去读或写,因此需要添加同步或互斥语句以保证运算结果的正确性。在运算核心函数声明及定义点前添加一个特殊的编译指示,其中特殊的编译指示具体不作限定,只要应用程序员能使用即可,如:#pragma ccc th_func。在控制核心函数调用运算核心函数的调用点前添加特殊的编译指示,与调用控制核心函数进行区分,其特殊的编译指示具体不作限定,只要应用程序员能使用即可,如:#pragma ccc sync call。
总控调用编译器分别使用不同的参数编译用户程序,根据扩展关键字和制导语句编译程序,经过编译器前端编译,能自动分离控制核心与运算核心的变量与函数。最开始,编译器的输入源文件为包含控制核心程序和运算核心程序的全部程序,当编译器前端分析到用户源代码中标示为运算核心函数或变量的代码时,即将该函数或者变量从控制核心程序的符号表中丢弃,并加入到运算核心程序的符号表,然后修改控制核心函数调用运算核心函数的调用点处的函数调用,这是因为显式地在控制核心函数中调用运算核心函数需要较为复杂的流程,使用编译指示可以让应用程序员以与普通函数调用相似的方法完成运算核心函数对运算核心函数的调用。应用程序员在使用熟悉的编程方式进行程序开发时,只需要通过扩展的关键字和制导语句,即可在编译阶段完成对控制核心程序和运算核心程序以及控制核心变量和运算核心变量进行分离、换名、追加设置变量属性等操作。
编译器中端对分离出的控制核心上与运算核心上的变量和函数分别进行编译和优化,生成控制核心上程序的中间表示和运算核心上程序的中间表示。在该阶段,编译器可以根据用户使用的编译指示,完成针对运算核心或控制核心代码的分析与优化。
在异构融合编译阶段,将上一阶段产生的编译器中端编译优化的控制核心上程序的中间表示以及编译器中端编译优化的计算核心上程序的中间表示一起编译为异构众核目标代码。编译器前端根据扩展关键字和制导语句,既要分离运算核心与控制核心的变量与函数,还要保证用户按照C语言标准编写代码的语义不被修改。比如:对于控制核心变量,由控制核心对应的运算核心天然共享。在具体实现上,对于普通控制核心变量,编译器采用的方法是将该变量写入控制核心程序的符号表,而在计算核心程序的符号表中只是标注该标量的属性为extern类型。
但是,对于用static关键字声明的控制核心静态变量,由于static类型属性与extern类型属性冲突,因此在强行追加了extern属性后,static属性会消失。当两个用户程序的.c文件中分别用static变量声明了两个同名的控制核心静态变量时,在多个文件的符号表合并阶段,编译器会检查到有重复的变量名而导致冲突。为解决这个问题,采用编译阶段动态换名来编译处理控制核心静态变量,即在每个.c文件编译结束前,扫描整个文件编译时生成的符号表,对于具有static属性的静态变量,取出静态变量符号的变量名,在原有变量名字符串之前添加上与变量所在文件名相关的字符串。例如:在file1.c中通过以下方式声明静态变量a:static int a;在编译过程中将变量a的static属性去除,并将变量名修改为static_20551166543587788963365606592082858209_a,其中,前缀“static”表示静态变量,“20551166543587788963365606592082858209”是根据文件名file1.c得到的校验值,而使用同样方式在file2.c中声明的变量a则会被换名为:static_25698435840431211219668618857573184123_a,即根据文件名file2.c得到的校验值为25698435840431211219668618857573184123。由于根据不同的文件名得到的校验值互不相同,因此即便将文件file.c中定义的静态变量的static属性去掉,该变量也仅能被file.c中的函数(无论该函数为控制核心函数还是运算核心函数)识别,通过这种与文件名绑定的变量换名方式,能够在保持static全局静态变量的语义的同时,又保持了控制核心变量天然被运算核心继承的语义,很好地支持了控制核心静态变量的属性。
在编译器中完成对C语言程序的代码分离和编译,由于可以直接使用编译器前端分析结果与接口,该一站式编程编译方法同样可以应用于编译器支持的其他语言类型源文件的控制核心与运算核心的代码分离及编译,具有更好的可扩展性。其他语言类型可以为如C++、fortran等。
本发明通过基于C语言进行扩展,在编译器总控增加编译流程和控制选项,提供标示运算核心私有变量的关键字和标示运行在运算核心上代码的制导语句,支持在同一个“.c”文件中混合编写控制核心程序和运算程序。应用程序员在使用熟悉的编程方式进行程序开发时,只需要通过扩展的关键字和制导语句,即可在编译阶段完成对控制核心程序和运算核心程序以及控制核心变量和运算核心变量进行分离、换名、追加设置变量属性等操作,将用户程序编译成需要在控制核心上执行的进程目标码和需要在运算核心上执行的线程目标码,从而实现对控制核心与运算核心程序分离编译目的,即在编译器中完成“先分离、后融合”的一站式程序编译方法。
面向异构混合编程的一站式程序编译方法,支持用户在同一个.c文件中进行控制核心与运算核心程序的混合编程,编译器根据编译制导信息识别并编译用户.c程序中的控制核心与运算核心程序。同时,该编译方法是通过修改成熟的编译器完成控制核心和运算核心代码的分离和融合编译,而编译器对用户程序的支持在正确性和完备性两方面较源到源转换工具更完备一些。因此,本专利能在提升用户编程效率的同时,解决已有的先通过源到源转换工具生成分离的控制核心源代码和运算核心源代码、再调用不同的编译器进行分别编译所带来的实现复杂、调试困难、可扩展性差等问题。
上述实施例只为说明本发明的技术构思及特点,其目的在于让熟悉此项技术的人士能够了解本发明的内容并据以实施,并不能以此限制本发明的保护范围。凡根据本发明精神实质所作的等效变化或修饰,都应涵盖在本发明的保护范围之内。
Claims (4)
1.一种面向异构混合编程的一站式程序编译方法,其特征在于:包括以下步骤,
S1:编译器总控增加编译流程和控制选项,提供标示运算核心私有变量的关键字和标示运行在运算核心上代码的制导语句,在运算核心变量前添加关键字,区分变量为运算核心私有变量还是运算核心共享变量,在运算核心函数声明及定义点前添加一个特殊的编译指示,与程序中控制核心函数进行区分,在控制核心调用运算核心函数的调用点前添加特殊编译指示,与调用控制核心函数进行区分;
S2:编译器前端根据扩展关键字和制导语句编译程序,自动分离控制核心与运算核心的变量与函数;
S3:编译器中端对分离出的控制核心上与运算核心上的变量和函数分别进行编译和优化,生成控制核心上程序的中间表示和运算核心上程序的中间表示;
S4:异构融合编译阶段,将编译器中端编译优化的控制核心上程序的中间表示和编译器中端编译优化的计算核心上程序的中间表示一起编译为异构众核目标代码。
2.根据权利要求1所述的面向异构混合编程的一站式程序编译方法,其特征在于:编译器将控制核心变量写入控制核心程序的符号表,在计算核心程序的符号表中只是标注控制核心变量的属性为extern类型。
3.根据权利要求2所述的面向异构混合编程的一站式程序编译方法,其特征在于:编译器编译结束前,扫描控制核心程序和运算核心程序编译时生成的符号表,对于具有static属性的静态变量,取出静态变量符号的变量名,在原有变量名字符串之前添加与变量所在文件名相关的字符串。
4.根据权利要求1-3任意一项所述的面向异构混合编程的一站式程序编译方法,其特征在于:所述编译器用于C语言、C++、fortran语言。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910920675.0A CN112579088A (zh) | 2019-09-27 | 2019-09-27 | 面向异构混合编程的一站式程序编译方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910920675.0A CN112579088A (zh) | 2019-09-27 | 2019-09-27 | 面向异构混合编程的一站式程序编译方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112579088A true CN112579088A (zh) | 2021-03-30 |
Family
ID=75109809
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910920675.0A Withdrawn CN112579088A (zh) | 2019-09-27 | 2019-09-27 | 面向异构混合编程的一站式程序编译方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112579088A (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101794230A (zh) * | 2010-04-07 | 2010-08-04 | 孙斌 | 用于多核的c语言扩充及编译系统支持方法 |
US20140082597A1 (en) * | 2012-09-14 | 2014-03-20 | Hassan Chafi | Unifying static and dynamic compiler optimizations in source-code bases |
CN109933327A (zh) * | 2019-02-02 | 2019-06-25 | 中国科学院计算技术研究所 | 基于代码融合编译框架的OpenCL编译器设计方法和系统 |
-
2019
- 2019-09-27 CN CN201910920675.0A patent/CN112579088A/zh not_active Withdrawn
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101794230A (zh) * | 2010-04-07 | 2010-08-04 | 孙斌 | 用于多核的c语言扩充及编译系统支持方法 |
US20140082597A1 (en) * | 2012-09-14 | 2014-03-20 | Hassan Chafi | Unifying static and dynamic compiler optimizations in source-code bases |
CN109933327A (zh) * | 2019-02-02 | 2019-06-25 | 中国科学院计算技术研究所 | 基于代码融合编译框架的OpenCL编译器设计方法和系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11579856B2 (en) | Multi-chip compatible compiling method and device | |
KR101354803B1 (ko) | 유형 추론 및 유형 지향 후기 바인딩 | |
Mendonça et al. | DawnCC: automatic annotation for data parallelism and offloading | |
JP4822817B2 (ja) | コンパイルシステム | |
JPH08202545A (ja) | ターゲット言語コードを生成するためのオブジェクト指向システム及びその方法 | |
US20090328016A1 (en) | Generalized expression trees | |
Ramsey et al. | Hoopl: a modular, reusable library for dataflow analysis and transformation | |
US11294665B1 (en) | Computerized software version control with a software database and a human database | |
KR102414250B1 (ko) | 전자 장치, 컴파일링 방법 및 컴퓨터 판독가능 기록매체 | |
CN109799971A (zh) | 一种文件生成装置和方法 | |
CN117075909B (zh) | 用于实现并行编程的编译方法、电子设备和介质 | |
Blindell | Instruction Selection | |
US7716656B2 (en) | Nullable and late binding | |
Metcalf | The seven ages of fortran | |
CN111771186A (zh) | 编译器生成的异步可枚举对象 | |
US20170206068A1 (en) | Program optimization based on directives for intermediate code | |
KR20090011974A (ko) | 컴파일 대상 파일 추출 방법 | |
CN112579088A (zh) | 面向异构混合编程的一站式程序编译方法 | |
GB2420638A (en) | Method of substituting code fragments in Internal Representation | |
JP2008243019A (ja) | ソースコード変換装置及びソースコード変換方法 | |
Boyland et al. | Attributed transformational code generation for dynamic compilers | |
KR20060092728A (ko) | 프리-프로세스에서 파일 검색 시간 단축을 통한 컴파일러의컴파일 속도 향상 방법 | |
KR970049508A (ko) | 병렬 컴파일러 및 그 제어 병렬화 설계방법 | |
Gasper et al. | Automatic parallelization of sequential C code | |
Deng et al. | Static analysis intermediate file analysis optimization strategy |
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 | ||
WW01 | Invention patent application withdrawn after publication |
Application publication date: 20210330 |
|
WW01 | Invention patent application withdrawn after publication |