鲲鹏社区首页
EN
注册
使用毕昇编译器进行Autotuner自动调优,完成程序性能优化

使用毕昇编译器进行Autotuner自动调优,完成程序性能优化

DevKit

发表于 2023/07/22

0

实验简介

尊敬的鲲鹏开发者你好,毕昇编译器是基于开源LLVM优化的高性能编译器,可以帮助开发者快速提升应用性能,您可以阅读本文进行毕昇编译器的快速入门。

本文主要介绍了以下知识:

(1)毕昇编译器的基础知识

(2)Autotuner自动调优实验原理

(3)探究如何基于毕昇编译器使能Autotuner自动调优功能,更细粒度地进行程序性能优化。

基础技能:

(1)了解常用的Linux操作命令

毕昇编译器基础知识

1.什么是编译器

编译器是一种计算机程序,它将用编程语言编写的源代码(源语言)转换为另一种计算机语言(目标语言),后者通常具有称为目标代码的二进制形式。将源代码转换的最常见原因是创建可执行程序。编译器是一种能够将文本翻译为另一个文本的程序,例如C语言和C++。编译器将代码翻译为可执行程序,实现代码到程序的转变。

编译也可以理解为“翻译”,类似于将中文翻译成英文、将英文翻译成象形文字,它是一个复杂的过程,包括词法分析、语法分析、语义分析、性能优化、生成可执行文件五个步骤,期间涉及到复杂的算法和硬件架构。

2.毕昇编译器

毕昇编译器基于开源LLVM开发,并进行了优化和改进,同时支持Fortran语言前端,是针对鲲鹏平台的高性能编译器。除LLVM通用功能和优化外,对中端及后端的关键技术点进行了深度优化,并集成Auto-tuner特性支持编译器自动调优。想要了解毕昇编译器的更多详细信息,可以点击链接:更多相关资讯

3.AutoTuner

AutoTuner是一个命令行工具,与毕昇编译器交互使用。它管理搜索空间的生成和参数操作,并驱动整个调优过程。AutoTuner目前推荐使用命令行工具llvm-autotune,llvm-auotune采用让用户主导调优过程的方式,提供辅助功能与编译器合作使用。

Autotuner自动调优实验原理

调优流程(如下图 Autotuner调优流程所示)由两个阶段组成:初始编译阶段 (initial compilation)和调优阶段 (tuning process)。


1.初始编译阶段

初始编译阶段发生在调优开始之前,Autotuner首先会让编译器对目标程序代码做一次编译,在编译的过程中,毕昇编译器会生成一些包含所有可调优结构的YAML文件,告诉我们在这个目标程序中哪些结构可以用来调优,比如文件(module)、函数(function)、循环(loop)。例如,循环展开是编译器中最常见的优化方法之一,它通过多次复制循环体代码,达到增大指令调度的空间,减少循环分支指令的开销等优化效果。若以循环展开次数(unroll factor)为对象进行调优,编译器会在YAML文件中生成所有可被循环展开的循环作为可调优结构。

2.调优阶段

当可调优结构顺利生成之后,调优阶段便会开始:Autotuner首先读取生成好的可调优结构的YAML 文件,从而产生对应的搜索空间,也就是生成针对每个可调优代码结构的具体的参数和范围;调优阶段会根据设定的搜索算法尝试一组参数的值,生成一个YAML格式的编译配置文件(compilation config),从而让编译器编译目标程序代码产生二进制文件;最后Autotuner将编译好的文件以用户定义的方式运行并取得性能信息作为反馈;经过一定数量的迭代之后,Autotuner将找出最终的最优配置,生成最优编译配置文件,以YAML的形式储存。

毕昇编译器AutoTuner自动调优

毕昇编译器AutoTuner自动调优实验需要在鲲鹏平台上完成,待调优代码为CoreMark,是业内进行性能对比的基准代码,实验过程如下:获取CoreMark源码,之后通过执行脚本的方式进行迭代调优,获取调优后的最优配置文件,最后调用最优配置文件进行性能对比。

1.准备工作

步骤一:申请鲲鹏远程实验室资源

实验过程需要在鲲鹏平台上完成,为了方便开发者在鲲鹏环境上进行开发,鲲鹏在鲲鹏社区中提供了鲲鹏远程实验室资源供各位开发者免费申请。

为了兼顾所有鲲鹏开发者的开发体验,鲲鹏远程实验室中提供了云开发环境(开发态模式)和远程服务器(黑框模式)。本文涉及案例会在云开发环境上进行,开发者在申请云开发环境后可以直接通过在线IDE的方式打开页面进行操作。降低了开发者在鲲鹏上的开发门槛。

首先我们访问鲲鹏社区的远程实验室页面https://www.hikunpeng.com/zh/developer/cloud-lab,申请云开发环境:


之后输入自己的邮箱地址,选择openEuler 20.03 LTS-SP1系统,申请成功后点击“打开在线IDE”按钮,进入云开发环境中,云开发环境为开发者提供了在线Vscode页面,方便开发者直接在鲲鹏上进行开发。


步骤二:安装Python 3.10.0版本

Autotuner的安装使用依赖Python 3.10.0版本,当前云开发环境的python版本为3.7.9,为了顺利的进行Autotuner自动调优实验,需要开发者手动完成Python 3.10.0版本的安装。进入在线IDE页面后,点击侧边栏第一个图标后依次点击“终端”、“新建终端”。

首先输入命令安装Python的依赖软件

yum -y groupinstall "Development Tools" --nogpgcheck
yum -y install gcc openssl-devel bzip2-devel libffi-devel python3-devel sqlite-devel --nogpgcheck

之后进入/opt目录,Python 3.10.0压缩包已经预置在opt目录下

cd /opt

之后对Python 3.10.0压缩包进行解压编译(以下每行命令分步执行),并升级pip库

tar -xvJf Python-3.10.0.tar.xz
cd Python-3.10.0
./configure --prefix=/usr/local/ --with-openssl=/usr 2>&1|tee configure.log
make -j4 2>&1|tee make.log
make install 2>&1|tee makeinstall.log
python3 -m pip install --upgrade pip

执行完上述命令后,关闭当前终端,重新打开终端,并在终端中输入命令查看当前使用的python版本,如果输出3.10.0即代表安装成功

python3 -V


步骤三:安装Autotuner

在云开发服务的环境中已经安装了2.5.0版本的毕昇编译器,开发者可以在终端中直接输入如下命令安装Autotuner,安装过程预计持续3~5分钟,请开发者耐心等待:

install-autotuner.sh

安装结束后在终端中输入命令,查看Autotuner安装是否成功,当终端中输出相应的帮助信息则表示安装成功

llvm-autotune -h


2.AutoTuner自动调优准备工作

步骤一:准备待调优代码

CoreMark是衡量中央处理器(CPU)和嵌入式微控制器(MCU)性能的行业标准基准。

我们这里以CoreMark为例展示如何运行自动调优,CoreMark代码可从社区获取:https://github.com/eembc/coremark

CoreMark的源码压缩包已经预置在云开发环境的实验文件夹中,首先进入实验文件夹,在这里进行AutoTuner调优实践的各项操作:

cd /opt/compiler/bisheng_compiler_demo

执行以下命令解压CoreMark源码包:

unzip -q master.zip

解压成功,执行以下命令查看解压后的文件:

cd coremark-main && ll


步骤二:执行调优脚本

本次实验将20次迭代调优coremark代码并对比调优效果,为了更方便的进行实验操作,实验提供了执行脚本来完成调优操作,执行脚本run_autotuner.sh位于/opt/compiler/bisheng_compiler_demo下,首先执行命令将run_autotuner.sh拷贝到coremark-main目录下:

cp ../run_autotuner.sh .

点击左上角按钮,选“文件”-“打开文件夹”,在页面上方弹出的输入框中输入路径/opt/compiler/bisheng_compiler_demo,点击确定,进入文件夹bisheng_compiler_demo下,单击左侧run_autotuner.sh文件查看脚本源码,您可以通过脚本源码中的注释了解调优操作的主要过程。

之后在终端中输入命令执行脚本,开始进行Autotuner迭代调优,进行20次循环迭代,并获取每次的性能数据作为反馈,执行过程约5~10分钟。

./run_autotuner.sh

打印内容如下所示,完成20次迭代后,将迭代获取的最优编译配置文件到脚本设置的AUTOTUNE_DATADIR目录:/tmp/autotuner_data/config.yaml,各位开发者可以通过在线IDE打开config.yaml文件,查看最优配置文件的具体内容。


3 AutoTuner自动调优实践及结果对比

步骤一:调用最优配置文件进行自动调优

为了进行后续的优化编译,首先配置AUTOTUNE_DATADIR环境变量:

export AUTOTUNE_DATADIR=/tmp/autotuner_data/

直接使用-fautotune选项调用最优配置文件config.yaml进行优化编译,执行如下命令,编译生成优化后的coremark可执行文件coremark_autotuner:

clang -Iposix -I. -g -DFLAGS_STR=\"\" -DITERATIONS=300000 core_list_join.c core_main.c core_matrix.c core_state.c core_util.c posix/core_portme.c -O2 -g -o coremark_autotuner -fautotune

执行如下命令,获取优化后coremark可执行文件的运行时间(单位为秒):

( time -p ./coremark_autotuner 0x0 0x0 0x66 300000 ) 2> time.log


从图中可以看出,经过Autotuner优化后的coremark300000次迭代的执行时间为18.64s。

步骤二:自动调优前后结果比对

使用毕昇编译器编译coremark用户代码,执行如下命令,生成未调优的coremark可执行文件进行对比,通过运行coremark可执行文件的时间差异来测试调优性能是否有提升,软件运行时间越短表示性能越好:

clang -Iposix -I. -g -DFLAGS_STR=\"\" -DITERATIONS=300000 core_list_join.c core_main.c core_matrix.c core_state.c core_util.c posix/core_portme.c -O2 -g -o coremark

之后执行如下命令,获取优化前coremark可执行文件的运行时间(单位为秒):

( time -p ./coremark_autotuner 0x0 0x0 0x66 300000 ) 2> time.log


从图中可以看出,未经过Autotuner优化后的coremark300000次迭代的执行时间为19.90s。经比较可以发现,调优后的性能可以提升6%~7%(优化前时间/优化后时间-100%)左右,说明使用Autotuner编译调优对性能有较大改善,至此实验已全部完成。

恭喜

到这里整个实验流程就已经结束了,通过上面的实验我们可以了解毕昇编译器的安装过程,以及Autotuner自动调优步骤。除了上述学习内容,我们还提供了很多辅助学习资源(课程/实验/文档/文章),希望能帮助到您更好的使用毕昇编译器:

基于毕昇编译器实现鲲鹏架构下编译性能提升25%(课程):https://www.hikunpeng.com/learn/courses-list/detail/381811335166300160

沙箱实验:https://www.hikunpeng.com/learn/experiments/detail/T221127001

毕昇编译器用户指南(文档):https://www.hikunpeng.com/document/detail/zh/kunpengdevps/compiler/ug-bisheng/kunpengbisheng_06_0001.html

毕昇编译器Autotuner特性指南(文档):https://www.hikunpeng.com/document/detail/zh/kunpengdevps/compiler/fg-autotuner/kunpengbisheng_20_0002.html

关注“毕昇编译”公众号,阅读更多编译领域技术文章;添加小助手微信,备注“单位+姓名+技术方向”,可以进入Compiler SIG微信交流群,与编译技术领域的学者、专家、学术等同行,共同推进编译相关技术的发展。

本页内容