【问题标题】:GNU Parallel running Makefiles with different optimization levelsGNU 并行运行具有不同优化级别的 Makefile
【发布时间】:2015-07-31 20:24:31
【问题描述】:

没有最佳的 -O 级别。为了找到我的特定代码的最快执行速度,我的方法是使用通常的优化级别(即 -O0、-Ofast、-O1、-O2、-O3、-march=native)编译相同的代码并检查产生哪些标志我是最快的执行(随着时间的推移)。

那么,有一种方法可以检查所有优化级别(前面列出的)运行一个 Makefile 的每个优化(-O 级别)吗?

我认为 Gnu Parallel 可以运行 Makefile 更改 -O 级别,但我不知道如何解决?

提前致谢。

【问题讨论】:

  • 为什么又不能设置CCFLAGS
  • 可能是一个选项,但如何递归地编辑 CCFLAGS 以使用唯一的 Makefile 测试所有优化级别? GnuParallel 可能会有所帮助,但我不知道如何有效地完成这项任务。
  • for flag in -O0 -Ofast -O1 -O2 -O3 -march=native; do make CFLAGS+="$flag"; done?
  • time 命令不是一个很好的程序速度指标。 ncsu.edu/hpc/Documents/sprofile.php
  • -Ofast -march=native 应该提供最快的程序,即使您无视“严格的标准合规性”,即 -ffast-math。 gcc.gnu.org/onlinedocs/gcc-5.2.0/gcc/…

标签: c optimization makefile gnu-parallel


【解决方案1】:

您想使用 GNU Parallel 并行执行多个构建吗?如果您想避免复制整个源代码目录,您至少需要单独的构建目录,以及更复杂的构建设置。如果您尝试在同一目录中同时进行多个单独的构建,则某些目标文件将使用一组 CFLAGS 构建,而其他目标文件将使用其他。

使用@Etan 的循环建议:

NJOBS=$(getconf _NPROCESSORS_ONLN)  # adjust as desired
for flag in -O{0..3} -O{3,fast}" -march=native"; do
    make clean
    make -j"$NJOBS" CFLAGS+="$flag -fprofile-generate"
    ./a.out  # feed it some input that exercises different options and code paths
    make clean
    make -j"$NJOBS" CFLAGS+="$flag -fprofile-use"
    perf stat ./a.out | tee "perfstat$flag.txt"
done

注意make -j 用于并行,而不是 GNU 并行。还要注意配置文件引导优化的使用。 x264 有一个带有make fprofiled 目标的构建系统,用于构建PGO 可执行文件,它负责构建/运行/重建周期。所以这是可能的,但如果 IDK 会使他们的 Makefile 变得混乱。

可以将 GNU 并行用于代码的计时运行,但如果您在空闲机器上进行计时运行,您将获得更一致的结果。

如果你想测试你的代码在有多个副本同时运行时的表现,竞争缓存空间和内存带宽(甚至是超线程的执行资源),然后用多个副本来测试

em>相同代码,没有一些运行与 gcc 竞争,一些与-O0 竞争,还有一些与-O3 竞争。

就优化选项而言,您通常会从带有-fprofile-generate and -fprofile-use 选项的gcc 中获得最佳结果。 Clang 也可以使用相同的选项或使用来自 CPU 性能计数器的数据来执行 profile-guided optimization。 (手册描述了使用工具将 Linux perf record 数据转换为 Clang 可以使用的东西。)

某些 gcc 优化只能通过 -fprofile-use 启用(或手动启用,而不是仅使用 -O3)。例如-funroll-loops 可以帮助一些紧密的循环。不要用于所有事情,因为较大的代码大小会导致整个程序中的 I-cache 未命中,这超过了在某些热循环中减少循环开销所带来的收益。

【讨论】:

  • NCPUS=getconf _NPROCESSORS_ONLN
  • 告诉make 使用比 CPU 更多的作业来隐藏 I/O 延迟实际上是有意义的。或者使用更少,如果你有其他东西正在运行。但对getconf 的好建议。
  • 检查代码性能的另一种方法是:valgrind —tool=callgrind ./a.out,稍后使用 kcachegrind 或 callgrind_annotate 检查周期估计成本进行分析。但是我不知道推荐哪个选项(perf 或 valgrind 替代)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 2012-05-26
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多