首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >浮点码的g++优化开关

浮点码的g++优化开关
EN

Stack Overflow用户
提问于 2017-12-27 22:24:04
回答 1查看 333关注 0票数 1

我想让一些代码运行得更快。它是浮点密集型代码--以其作为输入:

  • 参数(常数、双值、整数)
  • 输入值数组(常量、双值)

输出是

  • 值数组(双)
  • 雅可比矩阵

目前我正在使用

代码语言:javascript
复制
g++-7 (Ubuntu 7.2.0-1ubuntu1~16.04) 7.2.0

和下面的命令行:

代码语言:javascript
复制
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++编译器在过去产生了更好的代码--而且对这些代码的咀嚼时间也更长了。我试过各种选择,但只有

代码语言:javascript
复制
--param max-gcse-memory=1

似乎有任何效果--使用还是不使用这个论点。忽略参数值的更改。

与vmulspd指令相比,我获得更好代码的标准是代码中vmov/mov指令的数量。更好的代码应该包含更少的vmov指令。

在使用时

代码语言:javascript
复制
--param max-gcse-memory=1

我得到了10766条vmov指令,而没有这个参数的是11325条。相比之下,1000 vmulpd和1900 vmulsd --这两个尝试之间的数字或多或少是恒定的。

再说一次-我不介意编译时间。我想得到更好的代码,从我记得的过去(2010年),我有更好的代码,包括更长的编译时间。

EN

回答 1

Stack Overflow用户

发布于 2017-12-27 23:46:28

SIMD指令通常需要对齐数据。听起来,GCC正在生成大量代码,以防止数据对齐不足。

如果您可以修改代码,听起来您将受益于aligned属性的某些使用,或者更好的是使用OpenMP SIMD语用。

根据程序的结构方式,LTO (-flto)可以产生很大的不同,限制功能可见性(即-fvisibility=hidden)也是如此。

基本上,您希望给优化器尽可能多的工作空间,这样它就可以删除大量额外的代码来使SIMD指令正确地对齐。

您还可以考虑启用更多ISA扩展。AVX支持256位矢量,这意味着你可以用一条指令做两倍的工作,而且你的CPU很有可能支持它。如果要在其他计算机上运行可执行文件,请考虑使用target_clones属性生成针对多个ISA扩展优化的代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47999344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档