gpt4 book ai didi

c++ - 一个任务的线程数固定的 TBB,其他任务默认

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:52 25 4
gpt4 key购买 nike

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

但是,我希望用户可以选择使用 TBB,特别是让用户提供的函数使用剩余的许多内核。所以我认为 tbb::task_scheduler_init() 已经过时了。我能看到的唯一解决方案是让用户调用 tbb::task_scheduler_init() (或者一起忽略它),然后旋转 j tbb 的实例::tbb_thread 我自己在一个普通的 for 循环中。我错过了什么吗?在 TBB 中有更自然的方法吗?是否有某种分层版本的 tbb::task_scheduler_init()

最佳答案

是的,很少有自然的方法可以限制特定算法的并发性,同时保持其余算法不变。

  1. 创建单独的线程并使用 tbb::task_scheduler_init 为有限的并发初始化它,如您所述。由于主线程是隔离的,不会影响主线程和其他线程。因此,您可以从那个特殊的受限线程内部启动 parallel_for。
  2. 使用 tbb::parallel_pipeline 代替 parallel_for 并指定 token 数 = j 以限制并发处理任务的数量。
  3. 使用 tbb::task_arena(在 TBB 4.3 之前是一个预览功能)执行与 (1) 中所述相同的操作,但不需要额外的主线程,因为可以将工作放入隔离的并发上下文中 ( arena)仅使用它的 API

(3)的例子:

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

关于c++ - 一个任务的线程数固定的 TBB,其他任务默认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25430790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com