如何强制oneTBB禁用并行 实现TBB循环串行执行
禁用TBB并行实现串行执行的操作方法
你可以根据测试场景选择以下任意一种方案,设置后所有TBB并行算法(包括parallel_for、parallel_reduce等你用到的循环并行接口)都会以串行模式执行,和手写串行循环的执行逻辑完全一致,不会出现并行调度导致的浮点计算顺序差异,完全满足结果对比的测试要求。
- 代码层面动态控制(推荐)
目前主流维护的oneTBB版本提供了作用域级的全局控制接口,你只需要在测试逻辑的最外层初始化tbb::global_control,将最大允许并行度设置为1即可。该配置只在当前对象的生命周期内生效,出作用域后TBB会自动恢复默认的并行调度逻辑,不需要改动任何业务侧的TBB调用代码,非常适配测试场景。
示例代码:
如果你使用的是2020年之前发布的旧版独立TBB,还可以用旧版接口#include <tbb/global_control.h> int main() { // 开启TBB串行模式 tbb::global_control tbb_serial(tbb::global_control::max_allowed_parallelism, 1); // 你原来的OpenMP串行配置可以放在同位置 omp_set_num_threads(1); // 执行所有测试逻辑、业务运算逻辑即可 return 0; }tbb::task_scheduler_init init(1);实现同样的效果,注意这个接口在oneTBB中已经被标记为废弃,新版本不推荐使用。 - 环境变量零代码修改控制
如果你不想改动任何代码,可以在启动测试程序前设置TBB的线程数环境变量,直接在运行命令前追加TBB_NUM_THREADS=1即可,TBB初始化时会自动读取该参数,将全局最大并行度限制为1,实现全程序串行运行。
内容的提问来源于stack exchange,提问作者jjcasmar
相关产品推荐
相关产品推荐

