英特尔TBB如何选择在并行部分中使用的线程数?
是否有一些规范可供使用?
英特尔TBB如何选择在并行部分中使用的线程数?
是否有一些规范可供使用?
自 TBB 2.2 版本起,任务调度器将自动初始化并在运行时处理要使用的线程数。如果您想手动更改该数字,可以使用以下方法之一:
创建调度器时,您可以指定线程数,例如:
tbb::task_scheduler_init init(nthread);
否则,您可以使用
tbb::task_scheduler_init init(tbb::task_scheduler_init::automatic);
在这种情况下,tbb调度器会创建与您的CPU核心数量相同的线程。
让TBB决定线程池中的线程数量是推荐的选项-它通常会创建与机器上逻辑CPU数量相同的工作线程-请参见tbb::task_scheduler_init类引用。
很难找出有多少工作线程存在或正在任何给定时间执行任务-这是一个故意的设计选择。来自英特尔TBB并行编程课程:
我怎么知道有多少线程可用?
不要问!
- 甚至调度程序也不知道实际有多少个线程可用
- 可能还有其他进程在运行该机器上
- 例程可能嵌套在其他并行例程内部
docker run --cpus 2
启动的脚本中运行一些numpy / MKL / TBB基准测试,并观察到相当严重的过度订阅相关性能下降。 - ogrisel文档上只说“取决于硬件配置”。可能只是可用CPU核心数量。
tbb::task_scheduler_init
对象处于活动状态,否则它将返回自动状态。 - Petr Hudečektbb::task_scheduler_init
。 - Wenzel Jakobnthread
值,TBB 仍会创建与硬件 CPU 线程数相等的线程数。更糟糕的是,如果指定nthreads=2
,TBB 会创建第二个线程并在其上运行 TBB 工作,而不是在主线程上运行。有关详细信息,请参见此问题:https://dev59.com/77joa4cB1Zd3GeqPBqHz - Dmitry Mikushin