为何std::execution::par_unseq不生效?代码无法并行运行排查
C++标准并行
for_each未并行执行的原因及解决办法 问题场景
以下代码期望通过std::execution::par_unseq实现并行执行,将10次1秒的延迟操作压缩到约1秒完成,但实际耗时约10秒,始终串行执行:
#include <iostream> #include <execution> #include <unistd.h> #include <vector> #include <numeric> int main() { std::vector<int> parts(10); std::iota(parts.begin(), parts.end(), 0); std::for_each(std::execution::par_unseq, parts.begin(), parts.end(), [&](int part) { usleep(1'000'000); std::cout << part << std::endl; }); return 0; }
编译命令(Debian系统):
g++ -std=c++17 -fopenmp -O2 -o test test.cpp
即使将usleep()替换为计算密集型函数,串行执行的情况也未改变。
核心原因
GCC对C++标准并行算法(如搭配par_unseq的std::for_each)的实现,默认依赖**Intel TBB(Threading Building Blocks)**作为并行执行后端。仅添加-fopenmp编译选项无法启用标准并行算法的并行能力——OpenMP是独立的并行框架,并非GCC标准并行算法的默认后端。当未链接TBB库时,GCC会自动退化为串行执行模式。
解决办法
- 安装TBB开发库:
sudo apt install libtbb-dev
- 修改编译命令,添加链接TBB库的参数
-ltbb:
g++ -std=c++17 -fopenmp -O2 -o test test.cpp -ltbb
执行上述操作后,代码即可按预期并行运行,耗时约1秒。
内容的提问来源于stack exchange,提问作者R.Post
相关产品推荐
相关产品推荐

