# Execution.hpp 并行执行框架解析
## 概述
该头文件定义了通用的并行执行策略框架,主要功能包括:
- **统一执行策略接口**:抽象不同并行后端实现(如TBB、顺序执行)
- **多线程控制**:提供并行循环、归约等算法模板
- **资源管理**:支持并发度控制和互斥量类型选择
- **类型安全**:通过SFINAE确保策略合法性
适用于需要灵活切换并行后端的计算密集型任务,如3D数据处理、网格计算等场景。
## 核心组件
### 1. 执行策略检测
```cpp
template<class EP> struct IsExecutionPolicy_; // 策略检测模板
template<class EP> constexpr bool IsExecutionPolicy; // 编译期策略标志
template<class EP, class T = void>
using ExecutionPolicyOnly = ...; // SFINAE约束
- 作用:验证模板参数是否为合法执行策略
- 应用场景:约束并行算法仅接受合法策略
2. 执行策略特性模板
template<class EP, class En = void> struct Traits;
- 功能:策略具体实现的入口点
- 特化要求:
- 必须定义
SpinningMutex
和BlockingMutex
类型 - 实现
max_concurrency
、for_each
等方法
- 必须定义
3. 互斥量类型
template<class EP> using SpinningMutex = ...; // 自旋锁
template<class EP> using BlockingMutex = ...; // 阻塞锁
- 设计理念:区分高竞争/低竞争场景
- 使用选择:
- 短临界区用自旋锁
- 长操作用阻塞锁
核心函数接口
1. 并发度查询
template<class EP>
size_t max_concurrency(const EP &ep)
- 作用:获取当前策略支持的最大并行度
- 实现:调用策略特化的
AsTraits<EP>::max_concurrency
2. 并行循环
template<class EP, class It, class Fn>
void for_each(const EP &ep, It from, It to, Fn &&fn, ...)
- 参数:
ep
: 执行策略对象from/to
: 迭代范围fn
: 元素处理函数granularity
: 任务粒度
- 并行策略:由策略特化实现决定
3. 归约操作
template<class EP, class I, class MergeFn, class T, class AccessFn>
T reduce(const EP &ep, I from, I to, ..., ...)
- 功能:并行聚合数据
- 关键参数:
mergefn
: 聚合函数(T+T→T)accessfn
: 数据访问函数
- 变体:提供迭代器直接访问版本
4. 累加操作
template<class EP, class I, class T>
T accumulate(...)
- 本质:
reduce
的特化版本 - 默认行为:使用
std::plus
进行数值累加
设计亮点
策略模式实现
灵活的任务控制
- 粒度调节:通过
granularity
优化任务划分 - 锁机制选择:自旋/阻塞锁适应不同场景
- 可中断性:预留进度回调接口
类型安全体系
- SFINAE约束:确保非法策略无法实例化
- 特性检查:编译期验证策略完整性
使用示例
// 使用TBB策略并行处理
execution::for_each(ex_tbb, 0, 100, [](int i) {
process_element(i);
}, 10); // 每任务处理10个元素
// 并行累加计算
double sum = execution::accumulate(ex_tbb, data.begin(), data.end(), 0.0);
注意事项
-
策略特化要求:
- 必须完整实现Traits模板
- 确保线程安全特性
-
性能调优:
- 根据数据规模选择合适粒度
- 避免在任务函数中持有锁
-
内存模型:
- 确保访问函数线程安全
- 注意迭代器有效性范围
-
异常处理:
- 并行算法中需自行捕获异常
- 避免在任务函数中抛出异常