我注意到<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
。这是允许矢量化实现所必需的。