我想在一组块上并行执行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()
的分层版本?
答案 0 :(得分:8)
是的,很少有自然的方法来限制某个算法的并发性,同时保持其余的原样。
tbb::task_scheduler_init
创建单独的线程并使用有限并发对其进行初始化。由于主线程是隔离的,因此不会影响主线程和其他线程。因此,您可以从该特殊有限线程内部启动parallel_for。tbb::parallel_pipeline
代替parallel_for并指定令牌数= j,以限制并发处理任务的数量。tbb::task_arena
(TBB 4.3之前的预览功能)执行与(1)中所述相同的操作,但没有额外的主线程,因为可以使用其API将工作放入隔离的并发上下文(竞技场) (3)的例子:
tbb::task_arena limited_arena(j);
limited_arena.execute([]{ tbb::parallel_for(...); });