GNU Parallel 运行 具有不同优化级别的 Makefile

GNU Parallel running Makefiles with different optimization levels

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

所以,有一种方法可以检查所有优化级别(之前列出)运行为每个优化(-O 级别)创建一个 Makefile?

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

提前致谢。

您想使用 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 parallel 来为您的代码计时 运行,但是如果您执行计时 运行,您将获得更一致的结果在闲置的机器上。

如果你想测试你的代码在有多个副本时的表现如何 运行同时竞争缓存 space 和内存带宽(甚至超线程的执行资源) ),然后使用 相同 代码的多个副本进行测试,不要让一些 运行 与 gcc 竞争,一些与 -O0 竞争,一些与 [=15] 竞争=].

就优化选项而言,您通常会通过 -fprofile-generate and -fprofile-use options. Clang can also do profile-guided optimization、使用相同的选项或使用来自 CPU 性能计数器的数据从 gcc 获得最佳结果。 (该手册描述了使用工具将 Linux perf record 数据转换为 Clang 可以使用的内容。)

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