我想让一些代码运行得更快。它是浮点密集型代码--以其作为输入:
输出是
目前我正在使用
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似乎有任何效果--使用还是不使用这个论点。忽略参数值的更改。
与vmulspd指令相比,我获得更好代码的标准是代码中vmov/mov指令的数量。更好的代码应该包含更少的vmov指令。
在使用时
--param max-gcse-memory=1我得到了10766条vmov指令,而没有这个参数的是11325条。相比之下,1000 vmulpd和1900 vmulsd --这两个尝试之间的数字或多或少是恒定的。
再说一次-我不介意编译时间。我想得到更好的代码,从我记得的过去(2010年),我有更好的代码,包括更长的编译时间。
发布于 2017-12-27 23:46:28
SIMD指令通常需要对齐数据。听起来,GCC正在生成大量代码,以防止数据对齐不足。
如果您可以修改代码,听起来您将受益于aligned属性的某些使用,或者更好的是使用OpenMP SIMD语用。
根据程序的结构方式,LTO (-flto)可以产生很大的不同,限制功能可见性(即-fvisibility=hidden)也是如此。
基本上,您希望给优化器尽可能多的工作空间,这样它就可以删除大量额外的代码来使SIMD指令正确地对齐。
您还可以考虑启用更多ISA扩展。AVX支持256位矢量,这意味着你可以用一条指令做两倍的工作,而且你的CPU很有可能支持它。如果要在其他计算机上运行可执行文件,请考虑使用target_clones属性生成针对多个ISA扩展优化的代码。
https://stackoverflow.com/questions/47999344
复制相似问题