[英]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.