在某種意義上,手動矢量化代碼,使用顯式編譯指示或依賴或使用自動矢量化會更好嗎?爲了使用自動矢量化獲得最佳性能,必須監視編譯器輸出以確保循環正在被矢量化或修改它們直到它們是可矢量化的。通過手動編碼,人們可以確定正在發送所需的指令,但現在代碼可能不可移植(無論是對其他架構還是其他編譯器)。自動矢量化與手工矢量化代碼
4
A
回答
12
自動矢量化從來沒有爲我工作得很好。對我來說,似乎自動矢量化只適用於目前非常平凡的循環。
我使用pragma /內部方法並查看程序集。如果編譯器生成錯誤代碼(如將SSE註冊表溢出到堆棧或添加冗餘移動),則對整個循環體使用內聯彙編器。
可移植性是順便說一句,不是一個問題。通常你從一個C/C++循環開始,並使用內在函數對其進行優化。只需保留舊的循環並將其用作SIMD實現的單元測試/回退。此外,通過編譯時定義能夠從項目中刪除所有SIMD代碼總是明智的。調試應用程序更容易。相同的定義可以用於交叉編譯。
3
我永遠不會依賴任何編譯器的自動矢量化。隨着gcc
我會倍加警惕,因爲gcc
的優化效果總是因版本而異。幾乎我認識的所有依靠特殊優化或gcc擴展的人都必須在發佈新版本gcc
時處理破壞。
您通常可以信任的編譯指示和內部函數,但是必須保證對新版本的GCC發行說明銳利的眼睛,你應該告訴什麼是需要的gcc版本編譯代碼你自己的用戶。
向量化一次或兩次真正重要時,我們已經在測試套件中添加了一些東西來調用objdump
並驗證矢量指令是否真的被使用。能夠自動檢測'糟糕的向量代碼'(正如Nils所描述的那樣)會很好,但是我們從來沒有這麼做過。
1
我還沒有看到一個自動向量化器,它比傷害更好。
相關問題
- 1. 麻煩矢量化代碼
- 2. 自動矢量化GCC
- 3. 矢量初始化矢量
- 4. 初始化矢量矢量(外部矢量和內部矢量)
- 5. 這個C矢量爲什麼不循環自動矢量化?
- 6. 矢量化迭代循環
- 7. 最小化矢量的MATLAB代碼
- 8. 在Matlab中矢量化代碼
- 9. 初始化矢量矢量的C++
- 10. 映射2矢量 - 幫助矢量化
- 11. 矢量矢量的初始化?
- 12. C++矢量動初始化
- 13. 強制使用GCC自動矢量化
- 14. 矩陣乘法的自動矢量化
- 15. 實際使用自動矢量化?
- 16. 使用gcc實現自動矢量化?
- 17. C++矩陣乘法自動矢量化
- 18. 歸一化的矢量叉積非零矢量(非歸一化矢量)
- 19. 正常化矢量?
- 20. numpy的矢量化
- 21. Python矢量化庫?
- 22. 矢量化版本
- 23. 瞭解矢量化
- 24. 數據矢量化
- 25. 矢量化子集()?
- 26. 矢量量化到定向碼字
- 27. 矢量初始化向量
- 28. 自動矢量
- 29. MATLAB:矢量化索引與矢量*矩陣混淆
- 30. 矢量化Fortran中的循環與矢量處理器