为一个任务设置固定线程数的TBB,为其他任务设置默认线程数
TBB with fixed number of threads for one task, and default for others
我想在一组块上并行执行for循环(使用TBB),其中每个块将使用用户提供的函数进行处理。通常,我会用tbb::parallel_for()
。出于各种原因,我希望能够将处理块的线程数量限制在规定的数量,称为j
。通常,我会使用tbb::task_scheduler_init(j)
。
但是,我希望用户可以选择使用TBB,特别是让用户提供的函数使用剩余的多少内核。所以我认为tbb::task_scheduler_init()
出局了。我能看到的唯一解决方案是让用户调用tbb::task_scheduler_init()
(或者忽略它),并在正常的for循环中自己旋转tbb::tbb_thread
的j
实例。我错过什么了吗?在TBB中是否有更自然的方法来做到这一点?有没有某种tbb::task_scheduler_init()
的分级版本?
是的,很少有自然的方法来限制某个算法的并发性,同时保持其余部分不变。
- 创建单独的线程,并使用
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(...); });
相关文章:
- 将更高的优先级设置为 boost::asio 线程处理进程
- 是否可以在单独的线程中将 QObject 设置为 QML 上下文属性?
- 如何使用 pthreads 以正确的方式设置两个线程之一的优先级
- 设置 JVM 通过 JNI 初始化时创建的线程数
- 设置提升记录器的线程名称
- Android Ndk - 为C++线程设置名称
- 如何设置"this"线程的自定义名称?
- 如何在 OpenMP 中设置线程数
- 在 Visual Studio 中的调试中断时设置默认线程,C++
- OpenBLAS 只为一个例程设置线程数
- 在iOS设备上执行并发任务时如何设置正确的线程数?
- 如何在不需要 root 访问权限的情况下为应用程序中的线程设置相对线程优先级
- 在C 多线程应用程序中,设置了并发线程的最大数量
- 在 OpenCV 上设置线程相关性
- 如何在 Qt5 中设置线程的 CPU 关联?
- 一个线程设置成员,而另一个循环上方 - 是此螺纹 - 不安全
- 不使用线程时,从不同的线程设置Qt父级
- 为线程设置新优先级时不允许操作
- 跨多个线程设置表项
- 从创建线程设置线程的"nice level"?