gpt4 book ai didi

c++ - 新版本的 g++ 的多线程性能下降?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:14:09 24 4
gpt4 key购买 nike

我写了一些 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 中也看到过类似的行为。在所有测试的操作系统中,最快的性能来自使用 14 个线程和 g++ 4.8。

这是我正在使用的编译标志: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

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

最佳答案

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

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

g++ 4.9 及更高版本将 i9-9900k native 视为激活的 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

关于c++ - 新版本的 g++ 的多线程性能下降?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56335116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com