【发布时间】: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