下列陈述正确吗?
- `-O2 -ftree-vectorize -march=XYZ` (XYZ being the target instruction set: native, SSE, AVX2, etc.)
- `-O3 -march=XYZ`
- `/O2`
这段视频似乎建议我不需要使用MSVC来指定体系结构。对吗?在默认情况下,编译器将使用本机架构,如果找不到矢量指令,编译器将在运行时返回标量操作。
发布于 2020-01-08 12:44:49
我不需要用MSVC指定架构。对吗?
是的,那确实是正确的。对于MSVC,默认情况下,自动向量器是启用的,并为最快的矢量化获取适当的指令集。此外,即使您确实指定了arch,自动向量器也可能生成与/arch交换机指定的指令不同的指令--如文档所述。例如,在编译/arch:SSE2时,可能会发出SSE4.2指令。
另一方面,VS向量器与gcc或clang相比缺乏相当多的特性。
使用GCC和clang,如果我用
-O2 -ftree-vectorize -march=XYZ?-O3 -march=XYZ ?编译,我的代码将自动矢量化。
不一定,为了支持浮点减少的矢量化,您还需要使用-ffast-math或-fassociative-math。但是,一般来说,是的,它将被启用。您可能会发现,在文档中编写的代码相同,矢量化是由标志ftree-vectorize启用的,默认情况下是在-O3启用的。
PS:您可以使用https://godbolt.org来查看所有这些操作!
https://stackoverflow.com/questions/59645037
复制相似问题