GCC、CLANG 和 MSVC 的可视化C++自动矢量化要求
visual C++ auto-vectorization requirements for gcc, clang and msvc
以下陈述是否正确?
使用GCC 和 clang,如果我使用 :
-O2 -ftree-vectorize -march=XYZ
(XYZ是目标指令集:本机,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
编译,我的代码将被自动矢量化?-O3 -march=XYZ ?
不一定,要启用浮点约简的矢量化,您还需要使用-ffast-math
或-fassociative-math
。但是,一般来说,是的,它将被启用。您可能会在文档中找到相同的内容,矢量化由标志 -ftree-vectorize 启用,默认情况下为 -O3
PS:您可以使用 https://godbolt.org 来查看所有这些操作!
相关文章:
- 普通环路未使用gcc 4.8.5自动矢量化
- 阵列火矢量化
- 使用矢量化c++的矩阵乘法
- 循环中标量乘积的自动矢量化
- 如何在clang++中禁用矢量化
- 加权外积的矢量化
- 手动矢量化/SSE 用于 C++ 中的复杂问题
- 包含比较的循环的自动矢量化
- pcl_ros::transformPointCloud的矢量化
- 迭代卡拉苏巴算法在C++中使用OpenACC并行化和矢量化
- (如何)我可以使用openmp矢量化"std::complex<double>"吗?
- C 矩阵乘法自动矢量化
- 矢量化 :乘以_m256i元素
- 是否可以使用 SSE 对此嵌套进行矢量化?
- 为什么内联函数中的循环无法正确自动矢量化
- 是否保证 OpenMP 矢量化
- AVX,SSE总和比gcc自动矢量化慢
- 嵌套矢量化 OpenMP 循环,在最内层循环中具有多行代码
- 模乘法的矢量化
- 处理双数组中未对齐的部分,对其余部分进行矢量化