c++20 执行策略类型
c++20 execution policy type
我一直在研究标准算法并注意到您可以指定执行策略。
找到的文档 here 列出了 4 个策略:
std::execution::sequenced_policy
std::execution::parallel_policy
std::execution::parallel_unsequenced_policy
std::execution::unsequenced_policy
我了解并行策略和顺序策略之间的区别,但我不确定为什么您还需要非序列和非序列并行?
据我所知,无论如何您都无法保证线程执行顺序,所以这不会使并行和并行未排序策略相同吗?
如果不能并行化策略会自动回退到顺序策略,为什么要添加一个正常的未排序策略?
我错过了什么?
Table 可视化
-------------------------------------------------------------------------
| Type | Vectorization | Parallelization |
|------------------------------------------------------------------------
| Sequenced | X | X |
| Unsequenced | V | X |
| Parallel | X | V |
| Parallel & unsequenced | V | V |
-------------------------------------------------------------------------
来自最新的 C++20 工作草案 n4849
20.18 Execution policies
An object of an execution policy type indicates the kinds of
parallelism allowed in the execution of an algorithm and expresses the
consequent requirements on the element access functions.
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());
§ 20.18.3 执行策略类型特征
20.18.4 顺序执行策略[execpol.seq]
- classexecution::sequenced_policy是执行策略类型
用作消除并行算法重载歧义的唯一类型
并要求并行算法的执行可能不会
并行.
20.18.5 并行执行策略[execpol.par]
- class execution::parallel_policy 是一种执行策略类型,用作唯一类型以消除并行算法重载的歧义并指示并行算法的执行 可能是
并行.
20.18.6 并行和无序执行策略 [execpol.parunseq]
- class execution::parallel_unsequenced_policy 是一种执行策略类型,用作唯一
类型以消除并行算法重载的歧义,并指示并行算法的执行 可以并行化和矢量化 。
20.18.7 无序执行策略[execpol.unseq]
- class unsequenced_policy 是一种执行策略类型,用作消除并行歧义的唯一类型
算法重载并表明并行算法的执行 可能被矢量化 ,例如,执行
使用对多个数据项进行操作的指令的单个线程。
进一步阅读
- What is vectorization?
- Array Programming
- The Rise of Parallelism
我一直在研究标准算法并注意到您可以指定执行策略。
找到的文档 here 列出了 4 个策略:
std::execution::sequenced_policy
std::execution::parallel_policy
std::execution::parallel_unsequenced_policy
std::execution::unsequenced_policy
我了解并行策略和顺序策略之间的区别,但我不确定为什么您还需要非序列和非序列并行?
据我所知,无论如何您都无法保证线程执行顺序,所以这不会使并行和并行未排序策略相同吗?
如果不能并行化策略会自动回退到顺序策略,为什么要添加一个正常的未排序策略?
我错过了什么?
Table 可视化
-------------------------------------------------------------------------
| Type | Vectorization | Parallelization |
|------------------------------------------------------------------------
| Sequenced | X | X |
| Unsequenced | V | X |
| Parallel | X | V |
| Parallel & unsequenced | V | V |
-------------------------------------------------------------------------
来自最新的 C++20 工作草案 n4849
20.18 Execution policies
An object of an execution policy type indicates the kinds of parallelism allowed in the execution of an algorithm and expresses the consequent requirements on the element access functions.
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());
§ 20.18.3 执行策略类型特征
20.18.4 顺序执行策略[execpol.seq]
- classexecution::sequenced_policy是执行策略类型 用作消除并行算法重载歧义的唯一类型 并要求并行算法的执行可能不会 并行.
20.18.5 并行执行策略[execpol.par]
- class execution::parallel_policy 是一种执行策略类型,用作唯一类型以消除并行算法重载的歧义并指示并行算法的执行 可能是 并行.
20.18.6 并行和无序执行策略 [execpol.parunseq]
- class execution::parallel_unsequenced_policy 是一种执行策略类型,用作唯一 类型以消除并行算法重载的歧义,并指示并行算法的执行 可以并行化和矢量化 。
20.18.7 无序执行策略[execpol.unseq]
- class unsequenced_policy 是一种执行策略类型,用作消除并行歧义的唯一类型 算法重载并表明并行算法的执行 可能被矢量化 ,例如,执行 使用对多个数据项进行操作的指令的单个线程。
进一步阅读
- What is vectorization?
- Array Programming
- The Rise of Parallelism