我正在尝试让一些代码运行得更快。它是浮点密集型代码 - 作为输入:
输出
目前我正在使用
g++-7 (Ubuntu 7.2.0-1ubuntu1~16.04) 7.2.0
和以下命令行:
g++-7 -S -fPIC -O3 -DNDEBUG -funroll-loops -march=native -ffast-math \
-I $BOOST_DIR tmp.cpp -std=c++17 \
-D__forceinline='__attribute__((always_inline))' \
-frecord-gcc-switches -Wno-attributes
从我的记忆中,G ++编译器在过去产生了更好的代码 - 并且还在更长时间地咀嚼这样的代码。我试过玩各种选项,但只有
--param max-gcse-memory=1
似乎有任何影响 - 使用或不使用此参数。忽略参数值的变化。
我对更好代码的标准是代码中的vmov / mov指令与vmul [sp] d指令相比的数量。更好的代码应该包含更少的[v] mov指令。
使用时
--param max-gcse-memory=1
与没有此参数的11325相比,我得到10766 [v] mov指令。 相比之下,1000 vmulpd和1900 vmulsd - 两次尝试之间的数字或多或少保持不变。
再次 - 我不介意编译时间。我希望得到更好的代码,从过去(2010年)我记得的,我有更好的代码,包括更长的编译时间。
答案 0 :(得分:1)
SIMD指令通常需要对齐数据。听起来GCC正在生成大量代码来防止数据不完全对齐。
如果你可以修改代码,听起来好像你可以使用aligned
属性,或者更好的是,使用OpenMP SIMD编译指示。
根据程序的结构,LTO(-flto)可能会产生很大的不同,因为限制功能可见性(即-fvisibility = hidden)。
基本上,您希望为优化器提供尽可能多的工作空间,以便它可以删除大量额外的代码,以便为SIMD指令正确对齐。
您可能还需要考虑启用更多ISA扩展... AVX支持256位向量,这意味着您可以使用指令执行两倍的工作,并且您的CPU很有可能支持它。如果您要运送可执行文件以在其他计算机上运行,请考虑使用target_clones属性,以便轻松生成针对多个ISA扩展而优化的代码。