[英]C++ auto-vectorization requirements for gcc, clang and msvc
以下說法正確嗎?
使用 GCC 和 clang,如果我使用以下命令進行編譯,我的代碼將自動矢量化:
-O2 -ftree-vectorize -march=XYZ
(XYZ 是目標指令集:native、SSE、AVX2 等)-O3 -march=XYZ
使用 MSVC,如果我使用以下命令進行編譯,我的代碼將自動矢量化:
/O2
這個視頻似乎暗示我不需要用 MSVC 指定架構。 那是對的嗎? 默認情況下,編譯器將使用本機架構,如果找不到向量指令,則在運行時回退到標量操作。
我不需要用 MSVC 指定架構。 那是對的嗎?
是的,這確實是正確的。 使用 MSVC,默認情況下,自動矢量化器處於啟用狀態並選取合適的指令集以實現最快的矢量化。 此外,即使您確實指定了arch
,自動矢量化器可能會生成與/arch
開關指定的指令不同的指令 - 如文檔所述。 例如,當您編譯/arch:SSE2
,可能會發出SSE4.2
指令。
另一方面,與 gcc 或 clang 相比,VS 矢量化器缺少相當多的功能。
使用 GCC 和 clang,如果我使用
-O2 -ftree-vectorize -march=XYZ
編譯,我的代碼將被自動矢量-O2 -ftree-vectorize -march=XYZ
?-O3 -march=XYZ ?
不一定,要啟用浮點歸約的矢量化,您還需要使用-ffast-math
或-fassociative-math
。 但是,一般來說,是的,它將被啟用。 您可能會在文檔中找到相同的內容,矢量化由標志 -ftree-vectorize 啟用,默認情況下在 -O3
PS:您可以使用https://godbolt.org來查看這一切!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.