我注意到<algorithm>中的大多数(如果不是全部)函数正在获得一个或多个额外的重载。所有这些额外的重载都会添加一个特定的新参数,例如std::for_each来自:

template< class InputIt, class UnaryFunction >
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );

到:
template< class ExecutionPolicy, class InputIt, class UnaryFunction2 >
void for_each( ExecutionPolicy&& policy, InputIt first, InputIt last, UnaryFunction2 f );

这些额外的ExecutionPolicy对这些功能有什么影响?

之间有什么区别?
  • std::execution::seq
  • std::execution::par
  • std::execution::par_unseq

  • 以及何时使用其中一个?

    最佳答案

    seq的意思是“顺序执行”,与没有执行策略的版本完全相同。
    par的意思是“并行执行”,它允许实现在多个线程上并行执行。您有责任确保f内不发生任何数据争用。
    par_unseq意味着除了被允许在多个线程中执行之外,该实现还被允许在单个线程内交错单个循环迭代,即,加载多个元素,然后仅在所有元素上执行f。这是允许矢量化实现所必需的。

    10-06 05:21
    查看更多