【问题标题】:Multi-threaded degradation of performance with newer versions of g++?使用较新版本的 g++ 会导致多线程性能下降?
【发布时间】:2019-10-13 13:31:39
【问题描述】:

我编写了一些 C++ 反向传播代码,我在 Ubuntu 18.04 的 i9-9900K 上运行。

我看到的问题是,使用较新版本的 g++,我的多线程性能越来越差。

较新的 g++ 版本如预期的那样改进了单线程基准测试:

g++ 4.8: 5437 cycles/s
g++ 5.5: 5929 cycles/s
g++ 6.5: 5932 cycles/s
g++ 7.4: 6117 cycles/s
g++ 8.3: 6921 cycles/s

多线程基准测试(8 核上的 14 个 pthreads)随着新版本显着降低:

g++ 4.8: 25456 cycles/s
g++ 5.5: 17212 cycles/s
g++ 6.5: 18616 cycles/s
g++ 7.4: 17054 cycles/s
g++ 8.3: 14797 cycles/s

我在 CentOS 7.6 和 Clear Linux 中也看到过类似的行为。在所有测试过的操作系统中,最快的性能来自使用 g++ 4.8 的 14 个线程。

这是我正在使用的编译标志: g++ -c -std=c++11 -march=native -Ofast

我是否使用了错误的标志进行编译?我试过 -O3 并且降级相似,但不那么极端(并且比 -Ofast 慢)

g++ 4.8 -O3: 17256 cycles/s
g++ 5.5 -O3: 15129 cycles/s
g++ 6.5 -O3: 15779 cycles/s
g++ 7.4 -O3: 15736 cycles/s
g++ 8.3 -O3: 13361 cycles/s

我觉得我遇到了这么多内核的内存带宽问题。是否有任何编译选项可以帮助解决来自这么多线程的内存压力?

【问题讨论】:

  • 我不认为我们可以在没有看到一些代码的情况下回答这个问题;例如,你有多少线程?你对共享内存的使用正确吗?

标签: c++ multithreading g++ pthreads compiler-optimization


【解决方案1】:

进一步测试表明该问题与 -march=native 优化标志有关。

g++ 4.8 将 i9-9900k 本机视为 core-avx2 激活: MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AVX、AES 和 PCLMUL

g++ 4.9 及更高版本将 i9-9900k 原生视为 Broadwell,它会激活: MOVBE、MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、POPCNT、AVX、AVX2、AES、PCLMUL、FSGSBASE、RDRND、FMA、BMI、BMI2、F16C、RDSEED、ADCX 和 PREFETCHW

显然这会导致过度优化。

删除 -march 标志完全解决了这个问题。禁用 AVX 也可以使用 -mno-avx 和 -mno-avx2

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
相关资源
最近更新 更多