TBB具有一个任务的固定线程数,对其他任务具有默认值

fox*_*cub 5 c++ multithreading tbb

我想在一组块上并行执行for循环(使用TBB),其中每个块将使用用户提供的函数进行处理.通常情况下,我会这样做tbb::parallel_for().由于各种原因,我希望能够将处理块的线程数限制为规定的数量,然后调用它j.通常情况下,我会这样做tbb::task_scheduler_init(j).

但是,我希望用户可以选择使用TBB,具体来说,让用户提供的功能使用但仍有许多内核.所以我认为tbb::task_scheduler_init()是出局.我能看到的唯一解决方案是让用户调用tbb::task_scheduler_init()(或一起忽略它),并在正常的for循环中自行旋转我自己的j实例tbb::tbb_thread.我错过了什么吗?在TBB中有更自然的方法吗?是否有某种分层版本tbb::task_scheduler_init()

Ant*_*ton 8

是的,有一些自然的方法来限制某个算法的并发性,同时保持其余的原样.

  1. 使用tbb::task_scheduler_init所描述的方法创建单独的线程并使用有限的并发对其进行初始化.由于主线程是隔离的,因此不会影响主线程和其他线程.因此,您可以从该特殊有限线程内部启动parallel_for.
  2. 使用tbb::parallel_pipeline而不是parallel_for并指定tokens = j的数量,以限制并发处理任务的数量.
  3. 使用tbb::task_arena(直到TBB 4.3的预览功能)执行与(1)中描述相同的操作,但没有额外的主线程,因为可以使用其API将工作放入隔离的并发上下文(竞技场)

例子(3):

tbb::task_arena limited_arena(j);
limited_arena.execute([]{ tbb::parallel_for(...); });
Run Code Online (Sandbox Code Playgroud)