c++20 执行策略类型

Edw*_*ard 3 c++ c++17 c++20

我一直在研究标准算法,并注意到您可以指定执行策略。

此处的文档列出了 4 项政策:

std::execution::sequenced_policy  
std::execution::parallel_policy 
std::execution::parallel_unsequenced_policy  
std::execution::unsequenced_policy
Run Code Online (Sandbox Code Playgroud)

我了解并行策略和有序策略之间的区别,但我不确定为什么您还需要未排序和未排序的并行?

据我所知,无论如何您都无法保证线程执行顺序,所以这不会使并行和并行未排序策略相同吗?

如果您不能并行化策略自动回退到顺序策略,为什么要添加正常的未排序策略?

我错过了什么?

Ton*_*ous 6

表格可视化

-------------------------------------------------------------------------
|   Type                  |     Vectorization     |     Parallelization |
|------------------------------------------------------------------------                
| Sequenced               |           X           |           X         | 
| Unsequenced             |           V           |           X         |
| Parallel                |           X           |           V         |
| Parallel & unsequenced  |           V           |           V         |
-------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

来自最新的 C++20 工作草案n4849

20.18 执行策略
执行策略类型的对象表示算法执行中允许的并行类型,并表达对元素访问功能的后续要求。

using namespace std;
vector<int> v = /* ... */;

// standard sequential sort
sort(v.begin(), v.end());

// explicitly sequential sort
sort(execution::seq, v.begin(), v.end());

// permitting parallel execution
sort(execution::par, v.begin(), v.end());

// permitting vectorization as well
sort(execution::par_unseq, v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)

§ 20.18.3 执行策略类型特征

  • 20.18.4 顺序执行策略 [execpol.seq]

    1. 该类执行:: sequenced_policy是作为一种独特类型的歧义并行算法超载,并要求一个并行算法的执行的执行策略类型可能不并行化

  • 20.18.5 并行执行策略 [execpol.par]

    1. 类 execution::parallel_policy 是一种执行策略类型,用作唯一类型以消除并行算法重载的歧义并指示并行算法的执行可以 并行化

  • 20.18.6 并行和无序执行策略 [execpol.parunseq]

    1. 类 execution::parallel_unsequenced_policy 是一种执行策略类型,用作唯一类型以消除并行算法重载的歧义,并指示并行算法的执行可以被并行化和向量化

  • 20.18.7 无序执行策略 [execpol.unseq]

    1. 类 unsequenced_policy 是一种执行策略类型,用作消除并行算法重载歧义的唯一类型,并指示并行算法的执行可以矢量化,例如,使用对多个数据项进行操作的指令在单个线程上执行。

进一步阅读