C++17 为标准库添加了并行扩展(例如std::sort(std::execution::par_unseq, arr, arr + 1000)
,这将允许使用多线程和向量指令进行排序)。
我注意到微软的实验性实现提到 VC++ 编译器在这里缺乏对向量化的支持,这让我感到惊讶——我认为现代 C++ 编译器能够推断循环的向量化能力,但显然 VC++ 编译器/优化器无法生成即使明确告知这样做,SIMD 代码也是如此。似乎缺乏自动矢量化支持与2011 年这个问题的答案相矛盾的答案相矛盾,这表明编译器将在可能的情况下进行矢量化。
也许,编译器只会向量化非常明显的情况,例如std::array<int, 4>
,仅此而已,因此 C++17 的显式并行化将很有用。
因此我的问题是:当前的编译器是否会在未明确告知我的代码时自动向量化我的代码?(为了使这个问题更具体,让我们将其范围缩小到支持 SIMD 的 Intel x86 CPU,以及最新版本的 GCC、Clang、MSVC 和 ICC。)
作为扩展:其他语言的编译器是否可以更好地进行自动矢量化(可能是由于语言设计)(以便 C++ 标准委员会决定显式(C++ 17 风格)矢量化是必要的)?