2009-01-03 67 views
4

在某種意義上,手動矢量化代碼,使用顯式編譯指示或依賴或使用自動矢量化會更好嗎?爲了使用自動矢量化獲得最佳性能,必須監視編譯器輸出以確保循環正在被矢量化或修改它們直到它們是可矢量化的。通過手動編碼,人們可以確定正在發送所需的指令,但現在代碼可能不可移植(無論是對其他架構還是其他編譯器)。自動矢量化與手工矢量化代碼

回答

12

自動矢量化從來沒有爲我工作得很好。對我來說,似乎自動矢量化只適用於目前非常平凡的循環。

我使用pragma /內部方法並查看程序集。如果編譯器生成錯誤代碼(如將SSE註冊表溢出到堆棧或添加冗餘移動),則對整個循環體使用內聯彙編器。

可移植性是順便說一句,不是一個問題。通常你從一個C/C++循環開始,並使用內在函數對其進行優化。只需保留舊的循環並將其用作SIMD實現的單元測試/回退。此外,通過編譯時定義能夠從項目中刪除所有SIMD代碼總是明智的。調試應用程序更容易。相同的定義可以用於交叉編譯。

3

我永遠不會依賴任何編譯器的自動矢量化。隨着gcc我會倍加警惕,因爲gcc的優化效果總是因版本而異。幾乎我認識的所有依靠特殊優化或gcc擴展的人都必須在發佈新版本gcc時處理破壞。

您通常可以信任的編譯指示和內部函數,但是必須保證對新版本的GCC發行說明銳利的眼睛,你應該告訴什麼是需要的gcc版本編譯代碼你自己的用戶。

向量化一次或兩次真正重要時,我們已經在測試套件中添加了一些東西來調用objdump並驗證矢量指令是否真的被使用。能夠自動檢測'糟糕的向量代碼'(正如Nils所描述的那樣)會很好,但是我們從來沒有這麼做過。

1

我還沒有看到一個自動向量化器,它比傷害更好。