我想看一个无法自动向量化的for循环的例子,但是如果使用Parallel STL进行重写,则可能实现向量化。
我想看一个无法自动向量化的for循环的例子,但是如果使用Parallel STL进行重写,则可能实现向量化。
这取决于支持无序策略的算法实现:它们是否使用特殊的编译器技巧。例如:
sum = 0;
for(int i = 0; i < n; ++i)
sum += a[i];
在这里,我们将所有向量通用的变量汇总到一个变量中。编译器可能无法有效地猜测如何对代码进行矢量化。
然而,我们可以使用带有unseq
策略的C++17算法:
sum = std::reduce(std::execution::unseq, a, a + n);
如果实现使用更复杂的逻辑使编译器向量化代码,它可能会更快。例如,libstdc++。在这里,您还可以找到一些比自动向量化循环更有效地向量化的更复杂的示例。
for (int i = 0; i < n; ++i)
{
if (pred(in[i]))
{
*out = in[i];
++out;
}
}
相较于
std::copy_if(std::execution::unseq, in, in + n, out, [](auto val){return val > 0;});
std::execution::unseq
表示“我保证可以对其进行矢量化;如果出现问题,我会负责”。 - Pete Becker