2015-11-06 112 views
3

使用GCC編譯器時,-ftree-vectorize選項會啓用自動矢量化,並且在使用-O3時會自動設置此標誌。它矢量化的級別是什麼?也就是說,我會得到SSE2,SSE4.2,AVX或AVX2指令嗎?我知道mavx,mavx2標誌等的存在,但我想知道編譯器在沒有這些特定標誌的情況下如何強制執行特定類型的矢量化。GNU中的-ftree-vectorize選項

+0

我假設你只對x86指令集感興趣?您的問題也可以應用於其他架構,例如帶ARM的Neon。 –

回答

1

所有x86 64位處理器至少具有SSE2。 GCC編譯器將默認爲64位模式下的SSE2代碼,除非您告訴它使用其他硬件選項。

對於32位模式,GCC可能使用不是SIMD指令的x87指令,因此啓用矢量化時,請確保至少啓用與-mfpmath=sse -msse2的SSE。

如果啓用更高級別的SIMD選項,則編譯器可能會(並且在很多情況下會)在向量化時使用這些新指令。

我相信Clang也是如此。但是,ICC和MSVC以不同的方式做事。 ICC可能會創建一個CPU調度程序來選擇最佳硬件(或否決AMD硬件)。 MSVC只有用於在64位模式下啓用AVX和AVX2的選項(假定爲SSE2)。沒有辦法明確地啓用例如SSE4.1與MSVC。相反在某些情況下,自動矢量化器將添加代碼來檢查SSE4.1(但不是AVX)並使用這些指令。 GCC只會使用SSE4.1,如果你告訴它例如-msse4.1或更高的東西,如-mavx