【发布时间】:2017-12-27 22:24:04
【问题描述】:
我正在尝试让一些代码运行得更快。它是浮点密集型代码——作为输入:
- 参数(常量、双精度、整数)
- 输入值数组(常量、双精度)
输出是
- 值数组(双精度)
- 雅可比矩阵
目前我正在使用
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
似乎有任何效果——在使用或不使用这个参数之间。忽略参数值的变化。
我对更好代码的标准是与 vmul[sp]d 指令相比,代码中 vmov/mov 指令的数量。更好的代码应该包含更少的 [v]mov 指令。
使用时
--param max-gcse-memory=1
与没有此参数的 11325 相比,我得到 10766 [v]mov 指令。 这与 1000 vmulpd 和 1900 vmulsd 相比——两次尝试之间的数字或多或少是恒定的。
再次——我不介意编译时间。我想获得更好的代码,并且根据我在过去(2010 年)的记忆,我得到了更好的代码,包括更长的编译时间。
【问题讨论】:
-
您不能尝试安装旧版本并进行比较吗?还有,原生架构不变吗?
-
在这个级别,计算 mov 与 mul 是一种非常粗略的启发式方法,您需要比较代表性数据的运行时间。
标签: gcc optimization g++ compiler-optimization simd