一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于异构众核架构的C++融合编程方法与流程

2022-03-22 20:16:51 来源:中国专利 TAG:

一种基于异构众核架构的c 融合编程方法
技术领域
1.本发明涉及一种基于异构众核架构的c 融合编程方法,属于高性能计算技术领域。


背景技术:

2.国产异构众核处理器,适用于高性能计算领域,同时也越来越适用于人工智能领域,两大领域存在大量的c 编程需求,以加快编程节奏,简化编程复杂度,特别是泛型编程和c 库提供的大量基础容器和算法。
3.异构众核架构包含主核和从核两种核心,每种核心的指令集不一致,因此在c 编程中,需要生成两种指令集的目标码,并且将不同指令集的目标码混合链接在一起。由于生成的全局符号存放在核组共享空间,主从核均可以访问到,可能出现符号多重定义的情况;同时,由于每个从核将同时共享一段代码,而代码中的全局变量存放在核组共享空间,每一个从核都可以访问修改该变量,存在读后写、写后读等从核间的访存问题。
4.目前异构众核处理器一般只支持c语言和fortran语言,编程开发难度较大,而众核异构架构和多层次存储结构导致通用的c 语言及c 编译器无法直接应用在国产异构众核芯片上,限制了国产异构芯片编程用户的开发能力,更无法使用国产异构众核芯片的先进特征实现程序的高性能开发。


技术实现要素:

5.本发明的目的是提供一种基于异构众核架构的c 融合编程方法,以解决不同架构的指令集混合链接符号多重定义问题、从核间的全局变量访存问题,以及主核之间、主核与从核之间的单向调用困难,填补了国产异构众核芯片生态链中c 编程的空白。
6.为达到上述目的,本发明采用的技术方案是:提供一种基于异构众核架构的c 融合编程方法,包括以下步骤:s1、主核以头文件“athreadcxx.h”的形式提供athreadcxx类的对象,并将该对象存放在核组共享空间中,使得符号地址不同的主核互不影响;s2、athreadcxx类的对象通过构造函数进行从核资源的初始化,通过析构函数进行从核资源的回收;athreadcxx类的对象提供成员变量cgid,用于保存当前核组的核组号;athreadcxx类的对象提供成员结构体变量core.info,用于保存主从核传递参数的符号地址;athreadcxx类的对象提供成员函数spawn,用于调用从核函数,具体为:s21、将从核函数名添加slave_前缀,作为成员函数spawn的第一个指针参数传递给从核;s22、将要传递的参数打包成结构体,将结构体指针作为成员函数spawn的第二个参数,传递给从核;
s3、编译器通过选项-mhost将使用athreadcxx类的对象编程的主核程序进行编译,在处理符号地址的过程中,c 编译器根据通用规则对函数名进行换名,换名结束后,通过识别slave_前缀,将换名后的函数名进行信息提取,生成包含slave_前缀且不影响原函数信息的符号地址,以去除slave_前缀对换名的影响;s4、从核以头文件“slavecxx.h”的形式提供线程私有全局变量pen、col和row,用于保存当前从核的编号和行列信息;从核以头文件“slavecxx.h”的形式提供全局函数getarg,该函数的返回值为s22中主核传递给从核的第二个参数指针,通过对该返回值的解构,获取到主核要传递给从核的参数;从核使用thread_local关键字对从核私有的全局变量进行声明,声明该变量存放在从核私有空间中,而普通的全局变量存放在核组共享空间中;s5、编译器通过选项-mslave将包含头文件“slavecxx.h”的从核程序进行编译,当识别到thread_local关键字时,将该全局变量的符号地址添加section信息,链接时对包含该section信息的变量符号地址编址为从核私有空间的地址格式,在处理符号地址的过程中,对所有的从核符号,c 编译器根据通用规则对函数名进行换名,换名结束后,添加slave_前缀,以区别主核符号地址;s6、编译器通过选项-mhybrid将主核程序符号地址、主核程序中包含slave_前缀的符号地址和从核程序中所有包含slave_地址进行链接处理,生成不同指令集的混合可执行码,使得主核只通过前缀slave_方式调用从核。
7.由于上述技术方案的运用,本发明与现有技术相比具有下列优点:本发明采用语言扩展的方式,最大程度的保留了c 语言本身的语言特征,为程序开发和移植降低了难度,同时提供了扩展语言将硬件支持的众核特征进行了有效的使用;在多层次存储的国产异构众核架构下,充分利用了不同空间的存储结构,将两种不同指令集的架构代码,有效的融合在一起,可以确保程序正确的情况下,同时利用好主核和从核的计算资源。
附图说明
8.附图1为本发明一种基于异构众核架构的c 融合编程方法的示意图。
具体实施方式
9.实施例:本发明提供一种基于异构众核架构的c 融合编程方法,具体包括以下步骤:s1、主核以头文件“athreadcxx.h”的形式提供athreadcxx类的对象,并将该对象存放在核组共享空间中,使得符号地址不同的主核互不影响;s2、athreadcxx类的对象通过构造函数进行从核资源的初始化,通过析构函数进行从核资源的回收;athreadcxx类的对象提供成员变量cgid,用于保存当前核组的核组号;athreadcxx类的对象提供成员结构体变量core.info,用于保存主从核传递参数的符号地址;
athreadcxx类的对象提供成员函数spawn,用于调用从核函数,具体为:s21、将从核函数名添加slave_前缀,作为成员函数spawn的第一个指针参数传递给从核,前缀方式用来区别主核函数或从核函数;s22、将要传递的参数打包成结构体,将结构体指针作为成员函数spawn的第二个参数,传递给从核;s3、编译器通过选项-mhost将使用athreadcxx类的对象编程的主核程序进行编译,在处理符号地址的过程中,c 编译器根据通用规则对函数名进行换名,换名结束后,通过识别slave_前缀,将换名后的函数名进行信息提取,生成包含slave_前缀且不影响原函数信息的符号地址,以去除slave_前缀对换名的影响;s4、从核以头文件“slavecxx.h”的形式提供线程私有全局变量pen、col和row,用于保存当前从核的编号和行列信息;从核以头文件“slavecxx.h”的形式提供全局函数getarg,该函数的返回值为s22中主核传递给从核的第二个参数指针,通过对该返回值的解构,获取到主核要传递给从核的参数;从核使用thread_local关键字对从核私有的全局变量进行声明,声明该变量存放在从核私有空间中,而普通的全局变量存放在核组共享空间中;s5、编译器通过选项-mslave将包含头文件“slavecxx.h”的从核程序进行编译,当识别到thread_local关键字时,将该全局变量的符号地址添加section信息,链接时对包含该section信息的变量符号地址编址为从核私有空间的地址格式,在处理符号地址的过程中,对所有的从核符号,c 编译器根据通用规则对函数名进行换名,换名结束后,添加slave_前缀,以区别主核符号地址;s6、编译器通过选项-mhybrid将主核程序符号地址、主核程序中包含slave_前缀的符号地址和从核程序中所有包含slave_地址进行链接处理,生成不同指令集的混合可执行码,使得主核只通过前缀slave_方式调用从核。
10.对上述实施例的进一步解释如下:本发明通过语言扩展支持,实现软硬件结合,在国产异构众核架构芯片上实现了c 众核融合编程,填补了生态链的空白,为国产异构众核架构的应用开发提供了一种新型的编程方式。
11.通过将c 语言及编程模型扩展,将编程语言与芯片底层设计相呼应,设计出一种同时可利用c 特性和异构众核芯片的c 融合编程方法,在现实的高性能与人工智能应用中具有重要意义。
12.本发明通过将c 语言特征和编程模式进行扩展,将语言特征与芯片架构进行有效的映射,使得编程语言与芯片底层设计相呼应,通过对架构的特征的应用,实现扩展编程模式的实现;设计出一种同时可利用c 特性和异构众核芯片的c 融合编程方法,从而在国产异构众核芯片上可以使用c 特征进行编程,并且保证充分使用国产异构众核芯片的架构特征,使得程序具有一定的性能优势,在现实的高性能与人工智能应用中具有重要意义。
13.具体流程如下:1、主核以头文件“athreadcxx.h”的形式提供athreadcxx类的对象,该对象存放在
核组共享空间中,符号地址不同的主核互不影响。
14.2、athreadcxx类通过构造函数进行从核资源的初始化,通过析构函数进行从核资源的回收。
15.3、athreadcxx提供成员变量cgid保存当前核组相关信息,如核组号。
16.4、athreadcxx提供成员结构体变量core.info,保存主从核传递参数的符号地址。
17.5、athreadcxx提供成员函数spawn调用从核函数。将从核函数名添加slave_前缀,作为成员函数spawn的第一个指针参数传递给从核,前缀方式用来区别主核函数或从核函数。要传递的参数通过打包成结构体,将结构体指针作为成员函数spawn的第二个参数,传递给从核。
18.6、编译器通过选项-mhost将使用athreadcxx对象编程的主核程序进行编译,处理符号地址过程中,c 编译器需要根据通用规则对函数名进行换名,换名结束后,通过识别slave_前缀,将换名后的函数名进行信息提取,去除slave_前缀对换名的影响,生成包含slave_前缀且不影响原函数信息的符号地址。
19.7、从核以头文件“slavecxx.h”的形式提供线程私有全局变量pen、col、row,保存当前从核的编号和行列信息。
20.8、从核以头文件“slavecxx.h”的形式提供全局函数getarg,该函数的返回值为步骤5中主核传递的第二个参数指针。通过对结构体指针的解构,获取到具体的信息。
21.9、从核使用thread_local关键字对全局变量进行声明,声明该变量存放在从核私有空间中,而普通的全局变量存放在核组共享空间中。
22.10、编译器通过选项-mslave将包含头文件“slavecxx.h”的从核程序进行编译,当识别到thread_local关键字时,将该全局变量的符号地址添加section信息,链接时对包含该section信息的变量符号地址编址为从核私有空间的地址格式。在处理符号地址的过程中,所有的从核符号,c 编译器根据通用规则对函数名进行换名,换名结束后,添加slave_前缀,以区别主核符号地址。
23.11、编译器通过选项-mhybrid将主核程序符号地址,主核程序中包含slave_前缀的符号地址,和从核程序中所有包含slave_地址进行链接处理,保证主核只能通过前缀slave_方式进行调用从核。最终生成一种不同指令集的混合可执行码。
24.从上述步骤可以发现,其中步骤1-5通过头文件的形式确定了主核的编程方式,步骤6用编译器换名的方法解决了主核调用从核符号地址不一致的问题,步骤7-8提供了从核的信息管理和参数传递的机制,步骤9提供了多层次存储关键字的实现,步骤10解决了主从核符号地址多重定义的问题,实现了混合链接的基础,步骤10通过链接方式将不同指令集的代码融合成一个可执行码。
25.采用上述一种基于异构众核架构的c 融合编程方法时,其采用语言扩展的方式,最大程度的保留了c 语言本身的语言特征,为程序开发和移植降低了难度,同时提供了扩展语言将硬件支持的众核特征进行了有效的使用;在多层次存储的国产异构众核架构下,充分利用了不同空间的存储结构,将两种不同指令集的架构代码,有效的融合在一起,可以确保程序正确的情况下,同时利用好主核和从核的计算资源。
26.为了便于更好的理解本发明,下面将对本文中使用的术语进行简要的解释:异构众核架构:在芯片设计中,每个架构将决定一种指令集,在同一款芯片同时拥
有两种及以上的架构,拥有两种及以上的指令集,这样的设计称为异构架构,在一款芯片设计中,如果包含上百个核心,这样的设计称为众核架构。
27.国产异构众核芯片:将少量承担管理、通信和运算功能的通用主核核心和大量承担运算功能的精简从核核心集成在一颗完整芯片上的高性能异构中央处理器;通用主核核心运行通用的操作系统,主要承担整个芯片的管理和控制功能,也承担一定的运算功能和芯片与外部的通信功能;从核核心起到加速计算的功能;主核和从核的架构不同,使用不同的指令集。
28.核组:一个异构众核芯片包含若干个核组,每个核组包含一个主核和若干个从核,核组共享核组共享空间。
29.多层次存储空间:分为全片空间、核组全局空间、从核私有空间三个层次的存储空间;全片空间分为若干个核组全局空间,各个核组空间独享相应核组空间的访问权限;核组全局空间由核组一个主核和若干个从核共享访问权限;从核私有空间每个从核一份,由每个从核独享访问权限。
30.符号地址:指编译器为程序中全局变量、函数名等类型生成的地址标识,在链接成一个可执行码时,符号地址必须是唯一确定的。
31.上述实施例只为说明本发明的技术构思及特点,其目的在于让熟悉此项技术的人士能够了解本发明的内容并据以实施,并不能以此限制本发明的保护范围。凡根据本发明精神实质所作的等效变化或修饰,都应涵盖在本发明的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献