- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
问题
我们有一个用于模拟任务的中型程序,我们需要对其进行优化。我们已经尽最大努力将源代码优化到我们编程技能的极限,包括使用 Gprof 和 Valgrind 进行分析。
最终完成后,我们希望在多个系统上运行该程序可能几个月。因此,我们非常有兴趣将优化推向极限。
所有系统都将在相对较新的硬件(Intel i5 或 i7)上运行 Debian/Linux。
问题
除了 -O3/-Ofast 之外,使用最新版本的 g++ 有哪些可能的优化选项?
我们也对代价高昂的小优化感兴趣,从长远来看,这将带来返回。
我们现在使用的
现在我们使用以下 g++ 优化选项:
-Ofast
:最高“标准”优化级别。包含的 -ffast-math
没有在我们的计算中造成任何问题,因此我们决定采用它,尽管不符合标准。 -march=native
:启用所有 CPU 特定指令的使用。 -flto
允许跨不同编译单元的链接时间优化。 最佳答案
大多数答案都提出了替代解决方案,例如不同的编译器或外部库,这很可能会带来大量的重写或集成工作。我将尝试坚持问题所问的问题,并专注于单独使用 GCC 可以完成的工作,根据 OP 的要求,通过激活编译器标志或对代码进行最少的更改。这不是“您必须这样做”的答案,而是更多 GCC 调整的集合,这些调整对我来说效果很好,如果它们与您的特定上下文相关,您可以尝试一下。
关于原始问题的警告
在进入细节之前,关于这个问题的一些警告,通常是对于那些会来的人,阅读问题并说“OP 正在优化超出 O3,我应该使用与他相同的标志!”。
-march=native
允许使用特定于给定 CPU 架构 的 指令,这些指令不一定在不同的架构上可用。如果在具有不同 CPU 的系统上运行,该程序可能根本无法运行,或者速度明显变慢(因为这也会启用 mtune=native
),因此如果您决定使用它,请注意这一点。更多信息here。 -Ofast
,如您所说,启用了一些 不符合标准的 优化,因此也应谨慎使用。更多信息here。 -Ofast
启用 -ffast-math
,进而启用 -fno-math-errno
、 -funsafe-math-optimizations
、 -ffinite-math-only
、 -fno-rounding-math
、 {91046} 和 {91045} 7}您可以通过选择性地添加一些 额外标志 (例如 -fno-signaling-nans
、-fcx-limited-range
等)来进一步进行 浮点计算优化 。这些不包括在 -fno-signed-zeros
中,可以在计算上提供一些额外的性能提升,但您必须检查它们是否真的对您有益并且不会破坏任何计算。 -fno-trapping-math
,此选项从未对我产生不需要的结果,并且往往会显着提高性能(即可以在基准测试时进行测量)。不过,这是一种非常依赖于您的处理器的标志类型。 -Ofast
有时也会给出很好的结果(也暗示 -frename-registers
),但这取决于您的实际代码。 -funroll-loops
编译你的程序。 -frename-registers
重新编译程序。如果您的应用程序是多线程的,还要添加 -fprofile-generate
标志。 -fprofile-use
和 -fprofile-correction
标志。您还可以在需要时有选择地启用每个算法,但这将需要一些小的代码更改。-fopenmp
的并行实现,但为了给出一个粗略的想法,我设法将我的一个应用程序中的排序时间从 14 秒减少到 4 秒(测试环境:包含 1 亿个对象的 vector )自定义比较器功能和 8 核机器)。-D_GLIBCXX_PARALLEL
等结构可以通过向编译器提供 分支预测 信息来帮助编译器进行更好的优化。其他构造(例如 sort
)在数据被访问之前将数据带入缓存,有助于减少 缓存未命中 。 __builtin_expect
和 __builtin_prefetch
属性;前者会向编译器表明该函数是程序的热点,并更加积极地优化该函数并将其放置在文本段的特殊子段中,以获得更好的局部性;后者将优化函数的大小并将其放置在文本部分的另一个特殊子部分中。 关于c++ - 超出 -O3/-Ofast 的 G++ 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14492436/
我正在优化一个简单的遗传算法和神经网络,我正在 GCC 中摆弄一些选项以生成更快的可执行文件。 在我的代码中,我有一些断言,例如 mat mat_add(mat a, mat b) { ass
我在我的程序中使用 -Ofast gcc 选项导致延迟要求。我写了一个简单的测试程序: #include #include static double quiet_NaN = std::numer
我有一个关于最新 GCC 编译器(版本 >= 5)的问题,代码如下: #include void test_nan ( const float * const __restrict__ in
考虑以下测试程序: # include # include using namespace std; int main() { double y = 50.2944, yc = 63.2128
我在 Swift 中使用 Dictionary 实现本质上是缓存。性能远低于我的预期。我读过其他一些问题,例如 this one about array sorting这似乎表明 -Ofast 是答案
在 g++ 4.6(或更高版本)中,除了 -ffast-math 之外,-Ofast 还启用了哪些额外优化? 手册页说此选项“还启用了并非对所有符合标准的程序都有效的优化”。我在哪里可以找到有关这是否
重新编译旧程序使其输出错误结果。 我想知道为什么 . 我知道-Ofast可能“无视严格的标准合规性”,但我很好奇引擎盖下会发生什么。 我将程序简化为这个 最小示例 foo1.c : #include
我只是在阅读 gcc 手册以找出 -O3 之间的区别和 -Ofast . 对于 -O3 -O3 Optimize yet more. -O3 turns on all optimizations sp
在 xcode 5 中,优化级别引入了一个名为 -Ofast 的新级别。 (最快,积极的优化)。我应该何时以及如何使用此级别? 最佳答案 在 GCC 中,-Ofast 表示允许编译器忽略浮点数的有限精
#include int main(void) { int val = 500; printf("%d\n", (int)((long double)val / 500));
我在 http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options 上的 gcc 文档中找到了 Ofast leve
我在 for 循环中实现了 OpenMP 并行化,其中我有一个 sum,这是导致我的代码变慢的主要原因。当我这样做时,我发现最终结果与我为非并行化代码(用 C 编写)获得的结果不同。所以首先,人们可能
我有一个 C 程序,其中包含 math.h 并使用该 header 中的 sqrt 函数。非常奇怪,当我不传递 -Ofast 标志时,我的代码无法编译。 如果我使用以下代码编译我的代码: gcc -s
我使用 gcc -pg 和 gprof 看到了奇怪的分析结果。 我找不到更好/更小的重现方法,因此我链接了我看到问题的实际代码。 我正在使用代码here ,使用 make prof 构建 gprof
这个问题在这里已经有了答案: Does rustc / cargo have a -march=native equivalent? (1 个回答) 关闭 2 年前。 Rust 是否具有 GCC 的
我正在将索引的地址输入到扩展的内联汇编操作中的表中,但是 GCC 在不需要时生成额外的 lea 指令,即使在使用 -Ofast 时也是如此-fomit-frame-pointer 或 -Os -f..
当使用 -O3 编译下面的基准代码时,它在延迟方面的差异给我留下了深刻的印象,所以我开始怀疑编译器是否通过某种方式删除代码来“作弊”。有办法检查吗?我可以安全地使用 -O3 进行基准测试吗?期望速度提
问题 我们有一个用于模拟任务的中型程序,我们需要对其进行优化。我们已经尽最大努力将源代码优化到我们编程技能的极限,包括使用 Gprof 和 Valgrind 进行分析。 最终完成后,我们希望在多个系统
类似于的SO问题What does gcc's ffast-math actually do? 并且与 Clang optimization levels 的 SO 问题相关,我想知道什么 clang
摘要 根据我的测试,使用 -O0 时 NSArray 的平均访问时间最快。我的测试代码访问长度为 0 到 10000 的所有数组的每个元素。 循环每个数组: start = mach_absolute
我是一名优秀的程序员,十分优秀!