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 整体未命中,这超过了在某些热循环中减少循环开销所带来的好处。
没有最佳的 -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 整体未命中,这超过了在某些热循环中减少循环开销所带来的好处。