为一个任务设置固定线程数的TBB,为其他任务设置默认线程数

TBB with fixed number of threads for one task, and default for others

本文关键字:线程 设置 任务 TBB 默认 其他 一个      更新时间:2023-10-16

我想在一组块上并行执行for循环(使用TBB),其中每个块将使用用户提供的函数进行处理。通常,我会用tbb::parallel_for()。出于各种原因,我希望能够将处理块的线程数量限制在规定的数量,称为j。通常,我会使用tbb::task_scheduler_init(j)

但是,我希望用户可以选择使用TBB,特别是让用户提供的函数使用剩余的多少内核。所以我认为tbb::task_scheduler_init()出局了。我能看到的唯一解决方案是让用户调用tbb::task_scheduler_init()(或者忽略它),并在正常的for循环中自己旋转tbb::tbb_threadj实例。我错过什么了吗?在TBB中是否有更自然的方法来做到这一点?有没有某种tbb::task_scheduler_init()的分级版本?

是的,很少有自然的方法来限制某个算法的并发性,同时保持其余部分不变。

  1. 创建单独的线程,并使用tbb::task_scheduler_init为有限的并发性初始化它。由于主线程是隔离的,所以它不会影响到主线程和其他线程。所以,你可以在这个特殊的受限线程中启动parallel_for。
  2. 使用tbb::parallel_pipeline代替parallel_for,并指定令牌的数量= j,以限制并发处理任务的数量。
  3. 使用tbb::task_arena(在TBB 4.3之前是一个预览功能)来做与(1)中描述的相同的事情,但没有额外的主线程,因为工作可以只使用它的API放入孤立的并发上下文中(竞技场)

(3)的例子:

tbb::task_arena limited_arena(j);
limited_arena.execute([]{ tbb::parallel_for(...); });