You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:12:05