簡體   English   中英

如何在 MSVC 中啟用 SSE4.1 和 SSE3(但不是 AVX)

[英]How do I enable SSE4.1 and SSE3 (but NOT AVX) in MSVC

我正在嘗試使用 MSVC 啟用不同的 simd 支持。

有一個頁面在談論啟用一些 simd,例如 SSE2、AVX、AVX2 https://docs.microsoft.com/en-us/cpp/build/reference/arch-x86?redirectedfrom=MSDN &view=vs- 2019年

但是,它沒有提到如何啟用其他 simd 優化,例如,SSE4.1、SSE4.2、SSE3 是否可以在不啟用 AVX 的情況下啟用這些?

另外,看起來在 MSVC2017 中 /arch:SSE2 不再受支持/需要,我可以假設默認情況下也啟用 SSE3/SSE4.1/SSE4.2 嗎?

VC++ 編譯器沒有你想象的那么聰明。 以下是這些設置的工作原理。

當您構建 32 位代碼並啟用 SSE1 或 SSE2 時,它會啟用自動矢量化到相應的指令集。

當您構建 64 位代碼時,SSE1 和 SSE2 都是指令集的一部分,世界上所有的 AMD64 處理器都需要支持這兩者。 這就是您收到 /arch:SSE2 警告的原因。

當您設置 AVX 時,編譯器會做兩件事,啟用自動矢量化到 AVX1,還將指令編碼(對於所有這些,SSE、AVX、手動矢量化和自動矢量化)從 legacy 切換到VEX VEX 是個好東西,可以將未對齊的 RAM 讀取融合到其他指令中。 它還解決了可能影響性能的依賴性問題,VEX 編碼的vaddps xmm0, xmm0, xmm1ymm0高 16 字節ymm0 ,而傳統編碼的addps xmm0, xmm0, xmm1將數據保留在那里。

當您設置 AVX2 時,它會進行一些小的優化,最值得注意的是_mm_set1_epi32東西可能會編譯到vpbroadcastd 也像 AVX1 一樣將編碼切換到 VEX。

注意我用粗體標記了自動。 Microsoft 編譯器不執行運行時分派或 cpuid 檢查,並且自動向量化器不使用 SSE3 或 4.1。 如果您正在編寫手動矢量化代碼,編譯器不會執行回退,而是會發出您要求的任何指令。 當存在時,AVX/AVX2 設置僅影響它們的編碼。

如果要編寫使用 SSE3、SSSE3、SSE 4.1、FMA3、AES、SHA 等的手動矢量化代碼,則無需啟用任何內容。 您只需要包含相關的頭文件,並且最好在運行時確保 CPU 擁有它們。 最后一部分,我通常在啟動的早期調用__cpuid並檢查這些位,這是為了顯示有關不受支持的 CPU 的可理解錯誤消息,而不是稍后硬粉碎。

顯然,您可以以未記錄的方式將/arch:選項作為/d2...選項傳遞。 /d2archAVX

/d2archSSE42以這種方式被接受(但不是 SSE41 或 SSE3)。

@Peter 在評論中指出/d2archSSE42的案例: https : /d2archSSE42

暫無
暫無

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

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