std::execution::unseq相比于for循环有哪些优势?

4

我想看一个无法自动向量化的for循环的例子,但是如果使用Parallel STL进行重写,则可能实现向量化。


1
请参阅 std::execution::unsequenced_policy "...作为一种唯一类型的执行策略,用于消除并行算法重载并指示并行算法的执行可能被矢量化。" - Richard Critten
1
那个语句并没有帮助我理解区别。for循环也可以向量化。这只是记录了可能会进行向量化的操作吗?编译器能否利用这些信息做出无法在没有这些信息的情况下完成的工作? - dromodel
1
使用“unseq”,编译器允许假定向量化不会改变语义,而无需通过分析循环体来证明它。 - Davis Herring
1
你能提供一个示例,说明它可能会推断出不同的行为吗? - dromodel
不是“可能推断出不同的行为”,而是“无法推断任何东西”;std::execution::unseq表示“我保证可以对其进行矢量化;如果出现问题,我会负责”。 - Pete Becker
显示剩余2条评论
1个回答

0

这取决于支持无序策略的算法实现:它们是否使用特殊的编译器技巧。例如:

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;});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接