簡體   English   中英

使用新版本的g ++會導致多線程性能下降嗎?

[英]Multi-threaded degradation of performance with newer versions of g++?

我已經編寫了一些在Ubuntu 18.04的i9-9900K上運行的C ++反向傳播代碼。

我看到的問題是,隨着新版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個pthread)在較新的版本中會大大降低:

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

我覺得我遇到了這么多內核的內存帶寬問題。 是否有任何編譯選項可以幫助解決這么多線程帶來的內存壓力?

進一步測試表明,該問題與-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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM