1. 为什么你需要关注C++标准库并行算法
十年前我刚入行时,面对多核CPU的性能优化,第一反应就是上pthread或者OpenMP。直到2017年C++17标准发布,我才意识到标准库并行算法这个宝藏。std::execution的引入彻底改变了游戏规则——现在你甚至不需要额外安装任何库,就能轻松实现跨平台的多线程加速。
现代CPU的发展趋势很明显:核心数越来越多(我的开发机就有16核32线程),单核频率提升却越来越难。与此同时,SIMD指令集(如AVX-512)的位宽也在不断加宽。这些硬件特性如果不用起来,简直就是暴殄天物。我做过一个实测:对1000万条数据做排序,使用并行算法后速度提升了8倍,这还只是随手一写的demo。
2. 并行算法核心机制解析
2.1 std::execution的三种策略
标准库提供了三种执行策略:
- sequenced_policy (std::execution::seq):强制顺序执行
- parallel_policy (std::execution::par):允许并行
- parallel_unsequenced_policy (std::execution::par_unseq):允许并行+向量化
实际项目中,par_unseq通常能带来最大收益。我在图像处理项目中对比过:使用par_unseq的卷积运算比纯顺序执行快11倍。但要注意,这种模式下操作必须满足无数据竞争和可向量化的条件。
2.2 并行化的算法支持
不是所有算法都适合并行。标准库中明确支持并行的包括:
- 排序类:sort, stable_sort
- 数值类:reduce, transform_reduce
- 查询类:count, find
- 修改类:fill, generate
特别提醒:像for_each这种看似简单的算法,配合par_unseq后性能提升非常明显。下面是个典型示例:
cpp复制std::vector<float> data(1'000'000);
std::fill(std::execution::par_unseq, data.begin(), data.end(), 1.0f);
2.3 SIMD的自动向量化
这才是真正的性能杀手锏。现代编译器遇到par_u
