鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

细粒度调优

此处我们以 GCC 内循环展开优化 pass 的细粒度调优为例,展开调优工具的使用流程。

当前的细粒度调优模块,由两部分输入组成:

  • 应用的调优配置文件(.ini):处理应用的编译流程、执行流程。
  • 搜参空间配置文件(YAML):Autotuner 阶段配置的选项调优搜参空间,可替换默认搜参空间。

当前细粒度调优基于 Autotuner 实现:

  1. 在编译器的generate阶段,生成一组可调优的编译数据结构与可调优系数集合,保存在opp/*.yaml内。
  2. 根据额外提供的编译搜参空间(search_space.yaml)与可调优数据结构,Autotuner 通过调优算法针对每个可调优数据结构生成下一组调优系数,保存在input.yaml中。
  3. 在编译器的autotune阶段,根据input.yaml内数据结构的 hash 值,将调优系数标注到对应的数据结构里,完成调优。

下列测试例中,我们将调优 CoreMark 的循环展开参数。首先,我们将准备CoreMark的调优配置文件coremark_sample.ini。用户需要

  • 提供应用路径、应用的编译与运行命令。
  • 在基础编译命令中加入细粒度调优的动态库-fplugin=%(PluginPath)s/rtl_unroll_autotune_plugin_gcc12.so。
    • 在generate和autotune阶段,分别加入-fplugin-arg-rtl_unroll_autotune_plugin_gcc12-<stage>的相应输入文件。
  • 可自定义可调优结构配置文件的路径(./opp/*.yaml)、Autotuner 生成的编译器输入文件路径(input.yaml)等。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[DEFAULT] # optional
# PluginPath = /path/to/gcc-plugins

[Environment Setting]  # optional
# prepend a list of paths into the PATH in order.
# PATH = /path/to/bin# you can also set other enviroment variables here too [Compiling Setting] # required
# NOTE: ConfigFilePath is set to the path to the current config file automatically by default.
CompileDir = /path/to/coremark
LLVMInputFile = %(CompileDir)s/input.yaml

# OppDir and OppCompileCommand are optional,
# do not have to specify this if not using auto_run sub-command
OppDir = autotune_datadir/opp

CompilerCXX = /path/to/bin/gcc
BaseCommand = %(CompilerCXX)s -I. -I./posix -DFLAGS_STR=\""  -lrt"\" \
                                               -DPERFORMANCE_RUN=1 -DITERATIONS=10000 -g            \
                                               core_list_join.c  core_main.c core_matrix.c          \
                                               core_state.c core_util.c posix/core_portme.c         \
                                               -funroll-loops -O2 -o coremark                       \
                                               -fplugin=%(PluginPath)s/rtl_unroll_autotune_plugin_gcc12.so

# auto-tuning
CompileCommand = %(BaseCommand)s \
    -fplugin-arg-rtl_unroll_autotune_plugin_gcc12-autotune=%(LLVMInputFile)s
RunDir = %(CompileDir)s=
RunCommand = ./coremark 0x0 0x0 0x66 100000 # run 300000 iterations for coremark

# generate
OppCompileCommand = %(BaseCommand)s \
     -fplugin-arg-rtl_unroll_autotune_plugin_gcc12-generate=%(OppDir)s 

其次,我们可以准备一份额外的参数搜索空间文件search_space.yaml,自定义缩小参数空间。例如,动态库默认选择循环展开系数空间为

1
2
3
4
5
6
7
CodeRegion:
    CodeRegionType: loop
    Pass: loop2_unroll
    Args:
      UnrollCount:
        Value: [0, 1, 2, 4, 8, 16, 32]
        Type: enum

最终我们将 coremark,coremark_sample.ini,和search_space.yaml 放在同一个文件夹下,并运行以下脚本:

1
2
3
ai4c-autotune autorun coremark_sample.ini \
   -scf search_space.yaml --stage-order loop \
   --time-after-convergence=100 

其中,参数time-after-convergence代表历史最佳值后多少秒未发现新的最优配置时,即提早结束调优。

调优完成后,最佳调优配置将保存在loop.yaml内,并可通过重新调用autotune阶段编译命令,同时修改autotune选项的输入文件(i.e., -fplugin-arg-rtl_unroll_autotune_plugin_gcc12-autotune=loop.yaml),复现该调优组合的性能值。

用户可以通过以下方式调取历史调优配置文件(autotune_config.csv)与性能数据文件(autotune_data.csv):

1
ai4c-autotune dump -c coremark/input.yaml \     --database=opentuner.db/localhost.localdomain.db -o autotune 
  • 当前默认支持程序运行时间作为性能值。