C++ c++;20执行策略类型

C++ c++;20执行策略类型,c++,c++17,c++20,C++,C++17,C++20,我一直在学习标准算法,并注意到您可以指定执行策略 找到的文档列出了4项策略: std::execution::sequenced_policy std::execution::parallel_policy std::execution::parallel_unsequenced_policy std::execution::unsequenced_policy 我理解并行策略和顺序策略之间的区别,但我不确定为什么还需要非顺序和非顺序并行策略 据我所知,您无法保证线程的执行顺序,所以

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

找到的文档列出了4项策略:

std::execution::sequenced_policy  
std::execution::parallel_policy 
std::execution::parallel_unsequenced_policy  
std::execution::unsequenced_policy
我理解并行策略和顺序策略之间的区别,但我不确定为什么还需要非顺序和非顺序并行策略

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

如果不能并行化,那么为什么要添加一个正常的非顺序策略,而该策略会自动退回到顺序策略


我缺少什么?

表格可视化

-------------------------------------------------------------------------
|   Type                  |     Vectorization     |     Parallelization |
|------------------------------------------------------------------------                
| Sequenced               |           X           |           X         | 
| Unsequenced             |           V           |           X         |
| Parallel                |           X           |           V         |
| Parallel & unsequenced  |           V           |           V         |
-------------------------------------------------------------------------
来自最新的C++20工作草案

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

使用名称空间std;
向量v=/*…*/;
//标准顺序排序
排序(v.begin(),v.end());
//显式顺序排序
排序(执行::seq,v.begin(),v.end());
//允许并行执行
排序(执行::par,v.begin(),v.end());
//也允许矢量化
排序(执行::par_unseq,v.begin(),v.end());
§20.18.3执行策略类型特征

  • 20.18.4有序执行政策[执行政策顺序]

  • 类execution::sequenced_策略是一种执行策略类型 用作消除并行算法重载歧义的唯一类型 并要求并行算法的执行不能 并行化

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

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

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

  • 类execution::parallel_unsequenced_策略是用作唯一 键入以消除并行算法重载的歧义,并指示并行算法的执行可以并行化和向量化

  • 20.18.7未排序的执行策略[execpol.unseq]

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

进一步阅读

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