添加<execution>头文件未触发TBB依赖,触发TBB依赖的具体步骤是什么?
触发TBB依赖的具体步骤
核心逻辑
g12的libstdc中,<execution>头文件本身不会触发TBB依赖,只有当代码实际启用并行执行路径时,才会引入对TBB的链接需求。具体触发步骤如下:
实际使用并行执行策略调用标准算法
- 仅包含
<execution>头文件:只是引入执行策略的类型声明,不会生成依赖TBB的代码。 - 当代码中实例化带
execution::par_unseq(或execution::par)参数的标准算法模板时(例如std::transform(v.begin(), v.end(), dest.begin(), func, std::execution::par_unseq)),libstdc++会启用并行实现分支,而该分支依赖TBB的线程调度、任务池等核心组件,编译后目标文件会包含TBB相关的未定义符号。
- 仅包含
链接阶段的依赖暴露
- 编译完成后,链接器处理包含并行算法调用的目标文件时,会发现缺失TBB库提供的符号,此时必须显式链接TBB库才能完成链接。
- 在CMake中,通过
target_link_libraries(par_unseq PUBLIC TBB::tbb)配置,将TBB库绑定到目标可执行文件,解决符号依赖问题。
libstdc++的后端绑定规则
- g12的libstdc默认将并行算法的实现与TBB绑定,这是当前官方默认的并行后端。如果不希望依赖TBB,可通过编译选项
-D_GLIBCXX_PARALLEL_BACKEND=serial强制使用串行后端,但此时par_unseq等并行策略会退化为串行执行。
- g12的libstdc默认将并行算法的实现与TBB绑定,这是当前官方默认的并行后端。如果不希望依赖TBB,可通过编译选项
内容的提问来源于stack exchange,提问作者Ludovic Aubert
相关产品推荐
相关产品推荐

