本发明涉及一种面向多目标的细粒度编译自调优方法,属于编译优化技术领域。
背景技术:
为了充分发挥计算机系统的性能优势,用户往往需要针对目标体系结构对应用程序进行调优。主流编译器提供了多种优化技术,对代码进行编译优化,实现提高代码执行性能、减小目标代码大小、降低代码执行功耗等目的。然而,主流的编译优化遍数量众多,不同的优化遍对不同的代码结构产生的影响不同,且优化遍之间存在相互作用关系,如何为目标程序选取编译优化选项也成为了一个优化问题。
主流编译器内部编译优化选项高达上百个,而且编译优化选项之间的相互作用关系复杂,导致编译优化组合的解空间巨大,用户很难有效地针对目标应用程序使能编译优化选项。主流的编译器依靠编译优化等级辅助用户使用编译优化选项,例如,-o0/-o1/-o2/-o3/-ofast等编译优化等级。这种粗粒度的等级划分能够有效地降低用户利用编译器对代码调优的学习曲线,满足一般用户需求,将用户从浩如烟海的解空间中解放出来。但是,特定的编译优化技术是根据特定的代码特征进行开发,只针对特定的代码结构产生较为明显的优化效果。粗粒度的编译优化等级没有考虑到代码结构特征,并没有充分发挥编译优化选项的性能优势,无法满足高性能用户需求。
在高性能计算领域,人们对于系统性能的需求尤为迫切。一方面,编译优化组合的解空间巨大,难以针对特定应用进行细粒度调优;另一方面,传统的编译优化等级划分粒度过于粗放,难以满足高性能用户需求。因此,如何提供一种细粒度的编译选项组合策略,辅助高性能需求用户形成更好的编译优化决策,成为本领域技术人员努力的方向。
技术实现要素:
本发明的目的是提供一种面向多目标的细粒度编译自调优方法,该面向多目标的细粒度编译自调优方法能够挖掘编译优化选项的性能潜力,提高编译器的用户友好性,缩短用户进行应用调优的学习曲线。
为达到上述目的,本发明采用的技术方案是:一种面向多目标的细粒度编译自调优方法,包括以下步骤:
s1、根据调优需求q,确定编译优化的目标,具体如下:
s11、用户指定调优代码p和调优需求q;
s12、根据调优需求q,在性能分析工具的配置文件中,通过脚本查找调优需求q与性能计数器的对应关系表,确定编译优化的目标,设置自调优的反馈参数;
s2、进行代码核心段标识,即识别执行时间较长的核心段函数,具体如下:
s21、调用目标系统软件栈中配置的性能分析工具对调优代码p进行动态特征分析,得到调优代码p中函数的调用关系和调优代码p中函数的执行时间;
s22、根据s21中获得的函数的调用关系、函数的执行时间,性能分析工具对调优代码p中的函数按照执行时间的长短进行排序;
s23、根据设定的阈值k,选取调优代码p中执行时间最长的前n个函数,并将此前n个函数记为核心段函数,此前n个函数满足
s3、对调优代码p中的核心段函数进行插桩,根据编译优化的目标,选择对应的性能计数器插桩接口,用于量化评估编译优化效果,具体如下:
s31、根据s1中确定的编译优化的目标,选取对应的性能计数器的插桩接口函数;
s32、根据s2中标识的核心段函数,采用s31中选定的性能计数器的插桩接口函数,对调优代码p进行插桩,统计核心段函数对应的性能计数器的值,根据性能计数器的值量化编译优化效果;
s4、修改配置文件,并启动自调优操作,具体如下:
s41、用户根据目标机的系统环境和代码编译配置,修改配置文件的系统环境信息,包括编译器接口、编译选项集合、基准编译选项和链接选项;
s42、用户根据调优需求q,修改自调优信息,此自调优信息包括自调优迭代次数、待调优的文件、待调优的核心段函数和迭代过程的启发式策略;
s43、用户启动自调优操作,调优代码p进入迭代反馈的编译运行过程,根据用户调优需求q,自调优方法从该过程中选取最优的编译选项配置作为调优结果;
s5、对调优结果的历史信息进行聚类分析,具体如下:
s51、对进行自调优的核心段函数进行静态分析,并将核心段函数的静态特征与调优结果写入外部数据库,此外部数据库中数据供下一步聚类分析使用;
s52、根据s51所述外部数据库中新收录的数据数量判断是否进行聚类分析,若数据增量不小于100,则进行聚类分析,若数据增量小于100,则不进行聚类分析,转到s1继续进行数据收集;
s53、通过聚类分析,外部数据库中的核心段函数被分成了若干类,每一类对应着不同的编译优化组合,根据s52中聚类分析的结果,修改迭代过程的启发式策略,针对不同类的核心段函数,采用不同的编译优化组合进行迭代。
上述技术方案中进一步改进的方案如下:
1.上述方案中,所述编译优化的目标包括用户代码性能、运行用户代码时的系统功耗、目标文件大小、cache访问失效率、tlb访问失效率和全局存储访问次数。
2.上述方案中,所述迭代过程的启发式策略包括随机枚举策略、基于聚类分析的策略以及基于深度学习的策略。
由于上述技术方案的运用,本发明与现有技术相比具有下列优点:
本发明面向多目标的细粒度编译自调优方法,其能够根据代码运行的反馈信息,以迭代的方式实现对编译选项组合的全自动调优,挖掘编译优化选项的性能潜力,提高编译器的用户友好性,缩短用户进行应用调优的学习曲线;以迭代反馈作为基本思路,辅助高性能用户形成更好的编译选项组合方案,对应用程序进行调优,既能够将代码结构特征融入到编译选项选择过程,进一步挖掘编译优化选项的性能潜力,又能够使调优以全自动方式运行,一定程度解放人力资源,辅助高性能用户利用编译器对应用程序进行调优。
附图说明
附图1为本发明面向多目标的细粒度编译自调优方法流程图。
具体实施方式
实施例:一种面向多目标的细粒度编译自调优方法,包括以下步骤:
s1、根据调优需求q,确定编译优化的目标,具体如下:
s11、用户指定调优代码p和调优需求q;
s12、根据调优需求q,在性能分析工具的配置文件中,通过脚本查找调优需求q与性能计数器的对应关系表,确定编译优化的目标,设置自调优的反馈参数;
s2、进行代码核心段标识,即识别执行时间较长的核心段函数,具体如下:
s21、调用目标系统软件栈中配置的性能分析工具对调优代码p进行动态特征分析,得到调优代码p中函数的调用关系和调优代码p中函数的执行时间;
s22、根据s21中获得的函数的调用关系、函数的执行时间,性能分析工具对调优代码p中的函数按照执行时间的长短进行排序;
s23、根据设定的阈值k,选取调优代码p中执行时间最长的前n个函数,并将此前n个函数记为核心段函数,此前n个函数满足
s3、对调优代码p中的核心段函数进行插桩,根据编译优化的目标,选择对应的性能计数器插桩接口,用于量化评估编译优化效果,具体如下:
s31、根据s1中确定的编译优化的目标,选取对应的性能计数器的插桩接口函数;
s32、根据s2中标识的核心段函数,采用s31中选定的性能计数器的插桩接口函数,对调优代码p进行插桩,统计核心段函数对应的性能计数器的值,根据性能计数器的值量化编译优化效果,性能计数器的值与编译优化效果的对应关系由性能计数器的类型决定,例如cache访问失效率越低,编译优化效果越好,tlb访问命中率越高,编译优化效果越好;
s4、修改配置文件,并启动自调优操作,具体如下:
s41、用户根据目标机的系统环境和代码编译配置,修改配置文件的系统环境信息,包括编译器接口、编译选项集合、基准编译选项和链接选项;
s42、用户根据调优需求q,修改自调优信息,此自调优信息包括自调优迭代次数、待调优的文件、待调优的核心段函数和迭代过程的启发式策略;
s43、用户启动自调优操作,调优代码p进入迭代反馈的编译运行过程,根据用户调优需求q,自调优方法从该过程中选取最优的编译选项配置作为调优结果;
s5、对调优结果的历史信息进行聚类分析,具体如下:
s51、对进行自调优的核心段函数进行静态分析,并将核心段函数的静态特征与调优结果写入外部数据库,此外部数据库中数据供下一步聚类分析使用;
s52、根据s51所述外部数据库中新收录的数据数量判断是否进行聚类分析,若数据增量不小于100,则进行聚类分析,若数据增量小于100,则不进行聚类分析,转到s1继续进行数据收集;
s53、通过聚类分析,外部数据库中的核心段函数被分成了若干类,每一类对应着不同的编译优化组合,根据s52中聚类分析的结果,修改迭代过程的启发式策略,针对不同类的核心段函数,采用不同的编译优化组合进行迭代。
上述编译优化的目标包括性能、功耗、目标文件大小、cache失效率等。
上述迭代过程的启发式策略包括随机枚举策略、基于聚类分析的策略或者其他策略。
实施例进一步解释如下:
本发明主要包括三方面内容:一是性能分析工具,支持用户自定义目标(目标组合)优化,例如性能、功耗、目标代码长度、cache命中率、访存带宽等;二是利用插桩机制,对核心段代码进行随机迭代编译,实现对应用程序的分段细粒度调优;三是基于核心段静态特征对代码进行分类,利用聚类分析,加速自调优过程。
本发明具体流程如图1所示,包括优化目标定义、核心段标识、代码插桩、环境配置、聚类分析五部分的工作。
s1:首先,根据用户需求,确定编译优化的目标,例如性能、功耗、目标文件大小、cache失效率等,具体如下:
1、输入用户需求p;
2、根据用户需求p,确定回归模型的反馈参数。
s2:其次,进行代码核心段标识,标记执行时间较长的核心段函数,为用户进行代码优化提供辅助,具体如下:
1、调用性能分析工具对程序进行分析;
2、拆分程序执行时间,按照执行时间长短对程序内的核心段函数进行排序;
3、根据阈值n大小,选取执行时间最长的若干核心段函数,满足这些核心段函数执行时间之和>=n。
s3:接着,对代码进行插桩,根据编译优化目标,选择不同的插桩接口,以量化评估编译优化效果,具体如下:
1、根据s1确定的编译优化目标,选取不同的插桩接口函数;
2、根据s2标识的核心段函数,对程序进行插桩,以统计相应核心段函数的性能计数器的值。
s4:修改配置文件,并启动自调优过程,具体如下:
1、修改系统环境信息,包括编译器接口、编译选项集合、基准编译选项、链接选项等参数;
2、修改自调优相关信息,包括自调优迭代次数、待调优的文件与核心段函数、迭代过程的启发式策略(包括随机枚举策略、基于聚类分析的策略或者其他策略)等等;
3、启动自调优过程。
s5:最后,对调优结果的历史信息进行聚类分析,具体如下:
1、对当前核心段代码进行静态分析,将代码静态特征与调优结果写入数据库;
2、根据数据库中数据数量判断是否进行聚类分析,若数据数量满足一定条件,则进行聚类分析;
3、修改迭代过程的启发式策略。
采用上述面向多目标的细粒度编译自调优方法时,其能够根据代码运行的反馈信息,以迭代的方式实现对编译选项组合的全自动调优,挖掘编译优化选项的性能潜力,提高编译器的用户友好性,缩短用户进行应用调优的学习曲线;以迭代反馈作为基本思路,辅助高性能用户形成更好的编译选项组合方案,对应用程序进行调优,既能够将代码结构特征融入到编译选项选择过程,进一步挖掘编译优化选项的性能潜力,又能够使调优以全自动方式运行,一定程度解放人力资源,辅助高性能用户利用编译器对应用程序进行调优。
为了便于更好的理解本发明,下面将对本文中使用的术语进行简要的解释:
编译优化:通过代码变换等手段,消除高级语言翻译中可能引入的低效率,改进目标程序的性能、功耗、大小等指标。
编译优化遍:对源程序或其等价的中间语言程序从头到尾扫视并完成规定优化任务的过程。
迭代反馈:指重复反馈过程的活动,目的是为了逼近所需目标或结果。每一次对过程的重复称为一次迭代,每一次迭代得到的结果指导下一次迭代的过程称为反馈。
用户友好性:指用户操作系统时主观操作的复杂性,例如,主观操作复杂性越低,系统越容易被使用,说明系统的用户友好性越好。
随机枚举:从一个固定大小的集合中,随机地枚举出一部分个体形成一个子集。
启发式函数:一个基于直观或者经验构造的函数,在可接受的花费(指计算时间和空间)下给出待解决组合优化问题每一个实例的一个可行解,该可行解与最优解的偏离程度一般不能被预计。
上述实施例只为说明本发明的技术构思及特点,其目的在于让熟悉此项技术的人士能够了解本发明的内容并据以实施,并不能以此限制本发明的保护范围。凡根据本发明精神实质所作的等效变化或修饰,都应涵盖在本发明的保护范围之内。