llvm-autotune使用步骤
用户可根据自身需求,编写调优脚本。我们将以coremark为示例展示如何运行自动调优,毕昇编译器的发布包里没有自带coremark, 请从社区获取coremark。以下为以20次迭代调优coremark的脚本示例:
export AUTOTUNE_DATADIR=/tmp/autotuner_data/ CompileCommand="clang -O2 -o coremark core_list_join.c core_main.c core_matrix.c core_state.c core_util.c posix/core_portme.c -DPERFORMANCE_RUN=1 -DITERATIONS=300000 -I. -Iposix -g -DFLAGS_STR=\"\"" $CompileCommand -fautotune-generate; llvm-autotune minimize; for i in $(seq 20) do $CompileCommand -fautotune ; time=`{ /usr/bin/time -p ./coremark 0x0 0x0 0x66 300000; } 2>&1 | grep "real" | awk '{print $2}'`; echo "iteration: " $i "cost time:" $time; llvm-autotune feedback $time; done llvm-autotune finalize;
以下为分步说明:
- 配置环境变量
使用环境变量AUTOTUNE_DATADIR指定调优相关的数据的存放位置(指定目录需要为空)。
export AUTOTUNE_DATADIR=/tmp/autotuner_data/
- 初始编译步骤
添加毕昇编译器选项-fautotune-generate,编译生成可调优代码结构。
cd examples/coremark/ clang -O2 -o coremark core_list_join.c core_main.c core_matrix.c core_state.c core_util.c posix/core_portme.c -DPERFORMANCE_RUN=1 -DITERATIONS=300000 -I. -Iposix -g -DFLAGS_STR=\"\" -fautotune-generate
建议仅将此选项应用于需要重点调优的热点代码文件。若应用的代码文件过多(超过500个文件),则会生成数量庞大的可调优代码结构的文件,进而可能导致步骤3的初始化时间长(可长达数分钟);以及巨大的搜索空间导致的调优效果不显著,收敛时间长等问题。
- 初始化调优
运行llvm-autotune命令,初始化调优任务。生成最初的编译配置供下一次编译使用。
llvm-autotune minimize
minimize表示调优目标,旨在最小化指标(例如程序运行时间)。也可使用maximize,旨在最大化指标(例如程序吞吐量)。
- 调优编译步骤
添加毕昇编译器选项-fautotune,读取当前AUTOTUNE_DATADIR配置并编译。
clang -O2 -o coremark core_list_join.c core_main.c core_matrix.c core_state.c core_util.c posix/core_portme.c -DPERFORMANCE_RUN=1 -DITERATIONS=300000 -I. -Iposix -g -DFLAGS_STR=\"\" -fautotune
- 性能反馈
用户运行程序,并根据自身需求获取性能数字,使用llvm-autotune feedback反馈。例如,如果我们想以coremark运行速度为指标进行调优,可以采用如下方式:
time -p ./coremark 0x0 0x0 0x66 300000 2>&1 1>/dev/null | grep real | awk '{print $2}'
llvm-autotune feedback 31.09
建议在使用 llvm-autotune feedback 之前, 先验证步骤4编译是否正常,及编译好的程序是否运行正确。若出现编译或者运行异常的情况,请输入相应调优目标的最差值(例如, 调优目标为minimize, 可输入llvm-autotune feedback 9999;maximize 可输入 0 或者 -9999)。
若输入的性能反馈不正确,可能会影响最终调优的结果。
- 调优迭代
- 结束调优
进行多次迭代后,用户可选择终止调优,并保存最优的配置文件。配置文件会被保存在环境变量AUTOTUNE_DATADIR指定的目录下。
llvm-autotune finalize
- 最终编译
使用步骤7得到最优配置文件,进行最后编译。在环境变量未改变的情况下,可直接使用-fautotune选项:
clang -O2 -o coremark core_list_join.c core_main.c core_matrix.c core_state.c core_util.c posix/core_portme.c -DPERFORMANCE_RUN=1 -DITERATIONS=300000 -I. -Iposix -g -DFLAGS_STR=\"\" -fautotune
或者使用 -mllvm -auto-tuning-input= 直接指向配置文件。
clang -O2 -o coremark core_list_join.c core_main.c core_matrix.c core_state.c core_util.c posix/core_portme.c -DPERFORMANCE_RUN=1 -DITERATIONS=300000 -I. -Iposix -g -DFLAGS_STR=\"\" -mllvm -auto-tuning-input=/tmp/autotuner_data/config.yaml