Number of threads used by Intel TBB

21

英特尔TBB如何选择在并行部分中使用的线程数?

是否有一些规范可供使用?

3个回答

22

自 TBB 2.2 版本起,任务调度器将自动初始化并在运行时处理要使用的线程数。如果您想手动更改该数字,可以使用以下方法之一:

创建调度器时,您可以指定线程数,例如:

tbb::task_scheduler_init init(nthread);

否则,您可以使用

tbb::task_scheduler_init init(tbb::task_scheduler_init::automatic);

在这种情况下,tbb调度器会创建与您的CPU核心数量相同的线程。


3
必须在此之后保持tbb::task_scheduler_init对象处于活动状态,否则它将返回自动状态。 - Petr Hudeček
5
任务调度器对象仅影响从当前线程启动的TBB作业。如果要从另一个线程创建更多作业,则需要另一个 tbb::task_scheduler_init - Wenzel Jakob
这实际上不是一个解决方案,因为无论给定任何 nthread 值,TBB 仍会创建与硬件 CPU 线程数相等的线程数。更糟糕的是,如果指定 nthreads=2,TBB 会创建第二个线程并在其上运行 TBB 工作,而不是在主线程上运行。有关详细信息,请参见此问题:https://dev59.com/77joa4cB1Zd3GeqPBqHz - Dmitry Mikushin

12

让TBB决定线程池中的线程数量是推荐的选项-它通常会创建与机器上逻辑CPU数量相同的工作线程-请参见tbb::task_scheduler_init类引用

很难找出有多少工作线程存在或正在任何给定时间执行任务-这是一个故意的设计选择。来自英特尔TBB并行编程课程:

我怎么知道有多少线程可用?

不要问!

  • 甚至调度程序也不知道实际有多少个线程可用
  • 可能还有其他进程在运行该机器上
  • 例程可能嵌套在其他并行例程内部

任务调度程序能否检测它是否在cgroups受限环境中运行(例如docker容器)?例如,OpenMP运行时通常不会,并且在docker容器中运行时往往会导致超额订阅(例如,在具有32个核心的机器上限制为2000 mCPU配额)。 - ogrisel
如果在同一台主机上运行多个进程(例如使用 Python 中的 multiprocessing 生成工作进程),TBB 调度程序能否检测到在其他进程中运行的代码的并发版本,并自动调整活动线程数,以避免过度订阅问题?如果这些进程不是由相同的 unix 用户启动的呢? - ogrisel
回复自己:TBB可以使用进程间通信来协调调度程序,避免过度订阅。这可以通过设置ENABLE_IPC环境变量来实现。 - ogrisel
2
我尝试在一个拥有28个核心的主机上,使用docker run --cpus 2启动的脚本中运行一些numpy / MKL / TBB基准测试,并观察到相当严重的过度订阅相关性能下降。 - ogrisel
关于 Docker 的后续问题,我已在以下链接处提交了报告:https://github.com/intel/tbb/issues/190 - ogrisel

0

文档上只说“取决于硬件配置”。可能只是可用CPU核心数量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接