Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C GNU以不同的优化级别并行运行Makefiles_C_Optimization_Makefile_Gnu Parallel - Fatal编程技术网

C GNU以不同的优化级别并行运行Makefiles

C GNU以不同的优化级别并行运行Makefiles,c,optimization,makefile,gnu-parallel,C,Optimization,Makefile,Gnu Parallel,没有最佳的-O级别。为了找到我的特定代码的最快执行速度,我的方法是使用通常的优化级别(即-O0,-Ofast,-O1,-O2,-O3,-march=native)编译相同的代码,并检查哪些标志产生最快的执行速度(随时间) 因此,有一种方法可以检查所有优化级别(在前面列出)在每个优化(-O级别)下运行Makefile 我认为gnupallel可以运行Makefile来更改-O级别,但我不知道该如何解决这个问题 提前感谢。您想使用GNU并行来并行执行多个构建吗?如果希望避免复制整个源代码目录,至少需

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

因此,有一种方法可以检查所有优化级别(在前面列出)在每个优化(-O级别)下运行Makefile

我认为gnupallel可以运行Makefile来更改-O级别,但我不知道该如何解决这个问题


提前感谢。

您想使用GNU并行来并行执行多个构建吗?如果希望避免复制整个源代码目录,至少需要单独的构建目录,以及更复杂的构建设置。如果试图同时在同一目录中执行多个单独的生成,则某些对象文件将使用一组
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有一个构建系统,其目标是构建PGO可执行文件,负责构建/运行/重建周期。所以这是可能的,但IDK如果它使他们的Makefile变得混乱

您可以使用GNUparallel对代码进行计时运行,但是如果在空闲机器上进行计时运行,您将获得更一致的结果

如果您想测试代码的多个副本同时运行、争夺缓存空间和内存带宽(甚至是超线程的执行资源)时的性能,请使用同一代码的多个副本进行测试,而不是让一些运行与gcc竞争,一些运行与
-O0
,还有一些带有
-O3

至于优化选项,您通常会从带有选项的gcc获得最佳结果。使用相同的选项,或者使用来自CPU性能计数器的数据,Clang也可以这样做。(本手册介绍了如何使用工具将Linux
perf record
数据转换为Clang可以使用的数据。)


某些gcc优化仅在使用
-fprofile use
时启用(或手动启用,而不仅仅是使用
-O3
)。e、 g.
-funroll循环
在某些紧循环中有帮助。不要什么都用,因为较大的代码大小会导致整个程序中的I-cache未命中,这超过了在某些热循环中减少循环开销的收益。

为什么设置
CCFLAGS
也不是一个选项?可能是一个选项,但如何使用唯一的生成文件递归编辑CCFLAGS来测试所有优化级别?GnuParallel可能会有帮助,但我不知道如何有效地完成这项任务;使CFLAGS+=“$flag”;完成?时间命令不是很好的程序速度指示器
-Ofast-march=native
应提供最快的程序,即使您忽略了“严格的标准遵从性”,即-ffast数学。NCPUS=
getconf\u-processors\u ONLN
告诉
make
使用比CPU更多的作业,隐藏I/O延迟,实际上是有道理的。或者如果你有其他东西在运行,就少用一些。但是对于
getconf
,这是一个很好的建议。检查代码性能的另一种方法是:
valgrind-tool=callgrind./a.out
,稍后使用kcachegrind或callgrind\u annotate检查周期估算成本进行分析。但是,我不知道推荐哪种选择(perf或valgrind备选方案)