---
title: llvm-autotune使用步骤
description: "用户可根据自身需求，编写调优脚本。我们将以coremark为示例展示如何运行自动调优，毕昇编译器的发布包里没有自带coremark, 请从社区获取coremark(https://github.com/eembc/coremark)。以下为以20次迭代调优coremark的脚本示例："
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevkithistory/bisheng/hist-bisheng/kunpengbisheng_20_0012_0.html
sourcePath: /source/zh/kunpengdevkithistory/bisheng/hist-bisheng/kunpengbisheng_20_0012_0.html
indexId: 7430b40f1e0bfc4d21e25873ae7c23106e955ed8a9e676a63e0c063c622b0abb82
---
# llvm-autotune使用步骤

用户可根据自身需求，编写调优脚本。我们将以coremark为示例展示如何运行自动调优，毕昇编译器的发布包里没有自带coremark, 请从社区获取coremark(https://github.com/eembc/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;
```


以下为分步说明：

1. 配置环境变量
  使用环境变量AUTOTUNE_DATADIR指定调优相关的数据的存放位置（指定目录需要为空）。

  1 export AUTOTUNE_DATADIR=/tmp/autotuner_data/

2. 初始编译步骤
  添加毕昇编译器选项-fautotune-generate，编译生成可调优代码结构。

  1 2 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的初始化时间长（可长达数分钟）；以及巨大的搜索空间导致的调优效果不显著，收敛时间长等问题。

3. 初始化调优
  运行llvm-autotune命令，初始化调优任务。生成最初的编译配置供下一次编译使用。

  1 llvm-autotune minimize

  minimize表示调优目标，旨在最小化指标（例如程序运行时间）。也可使用maximize，旨在最大化指标（例如程序吞吐量）。

4. 调优编译步骤
  添加毕昇编译器选项-fautotune，读取当前AUTOTUNE_DATADIR配置并编译。

  1 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

5. 性能反馈
  用户运行程序，并根据自身需求获取性能数字，使用llvm-autotune feedback反馈。例如，如果我们想以coremark运行速度为指标进行调优，可以采用如下方式：

  1 time -p ./coremark 0x0 0x0 0x66 300000 2>&1 1>/dev/null | grep real | awk '{print $2}'

  1 llvm-autotune feedback 31.09

  建议在使用 llvm-autotune feedback 之前， 先验证步骤4编译是否正常，及编译好的程序是否运行正确。若出现编译或者运行异常的情况，请输入相应调优目标的最差值（例如, 调优目标为minimize, 可输入llvm-autotune feedback 9999；maximize 可输入 0 或者 -9999）。 若输入的性能反馈不正确，可能会影响最终调优的结果。

6. 调优迭代
  根据用户设定的迭代次数，重复4和5进行调优迭代。

7. 结束调优
  进行多次迭代后，用户可选择终止调优，并保存最优的配置文件。配置文件会被保存在环境变量AUTOTUNE_DATADIR指定的目录下。

  1 llvm-autotune finalize

8. 最终编译
  使用步骤7得到最优配置文件，进行最后编译。在环境变量未改变的情况下，可直接使用-fautotune选项：

  1 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= 直接指向配置文件。

  1 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
