Intel TBB使用的线程数

chr*_*ris 18 parallel-processing multithreading tbb

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

有某种规格吗?

Man*_*nny 19

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

创建调度程序时,可以指定线程数

tbb::task_scheduler_init init(nthread);
Run Code Online (Sandbox Code Playgroud)

否则你可以使用

tbb::task_scheduler_init init(tbb::task_scheduler_init::automatic);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,tbb scheduler会创建与CPU内核一样多的线程

  • 此外,任务调度程序对象只影响从当前线程启动的TBB作业.从另一个线程创建更多作业时,您需要另一个`tbb :: task_scheduler_init`. (4认同)
  • 在此之后你必须保持`tbb :: task_scheduler_init`对象,否则它将恢复为自动. (3认同)

Jos*_*rpe 11

让TBB决定池中的线程数是建议的选项 - 它通常会创建与计算机上的逻辑CPU一样多的工作线程 - 请参阅tbb :: task_scheduler_init的类引用.

在任何给定时间找出存在或正在执行任务的工作线程并不容易 - 这是一个深思熟虑的设计选择.来自英特尔的TBB并行编程课程:

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

不要问!

  • 甚至调度程序也不知道有多少线程可用
  • 机器上可能正在运行其他进程
  • 例程可以嵌套在其他并行例程中

  • 我尝试在具有 28 个核心的主机上使用“docker run --cpus 2”启动的脚本中运行一些 numpy / MKL / TBB 基准测试,我观察到与超额订阅相关的性能下降非常严重。 (2认同)