Multithreading 英特尔TBB使用的线程数

Multithreading 英特尔TBB使用的线程数,multithreading,parallel-processing,tbb,Multithreading,Parallel Processing,Tbb,英特尔TBB如何选择用于并行部分的线程数 是否有某种规格可用?文档只说“取决于硬件配置”。可能只是可用的CPU内核数。从TBB 2.2版开始,任务计划程序将自动初始化,并在运行时处理要使用的线程数。如果手动更改该数量,可以使用以下方法之一: 创建调度程序时,可以将线程数指定为 tbb::task_scheduler_init init(nthread); 你还可以用别的 tbb::task_scheduler_init init(tbb::task_scheduler_init::automa

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


是否有某种规格可用?

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

从TBB 2.2版开始,任务计划程序将自动初始化,并在运行时处理要使用的线程数。如果手动更改该数量,可以使用以下方法之一:

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

tbb::task_scheduler_init init(nthread);
你还可以用别的

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

在这种情况下,tbb scheduler创建的线程数量与您的CPU核心数量相同,建议选择tbb决定池中的线程数量-它通常创建的工作线程数量与机器上的逻辑CPU数量相同-请参阅

要找出在任何给定时间存在多少工作线程或正在执行任务并不容易——这是一个深思熟虑的设计选择。发件人:

我如何知道有多少线程可用

不要问

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

在此之后,必须保持
tbb::task\u scheduler\u init
对象处于活动状态,否则它将恢复为自动。此外,task scheduler对象只影响从当前线程启动的tbb作业。当从另一个线程创建更多作业时,您需要另一个
tbb::task\u scheduler\u init
。这实际上不是一个解决方案,因为给定任何
nthread
值,tbb仍然会创建相当于硬件CPU线程的线程。更糟糕的是,如果指定
nthreads=2
,TBB将创建第二个线程并在其上运行TBB工作,而不是在主线程上运行。有关详细信息,请参见此问题:任务计划程序是否能够检测它是否在cgroups受限的环境(例如docker容器)中运行。例如,当在docker容器中运行时,openmp运行时通常不是,并且往往会导致超额订阅(例如,在一台32核的机器上限制为2000 mCPU配额)。如果多个进程在同一台主机上运行(例如,在Python中使用多处理生成工作进程时),TBB调度程序能否检测在其他进程中运行的代码的并发版本,并自动调整活动线程的数量以避免超额订阅问题?如果进程不是由同一个unix用户启动的,该怎么办?回答我自己:TBB可以使用进程间通信来协调调度程序并避免过度订阅。这可以通过设置ENABLE_IPC环境变量来实现。我曾尝试在一台具有28个内核的主机上用docker run--CPU 2启动的脚本中运行一些numpy/MKL/TBB基准测试,我观察到与超额订阅相关的性能严重下降。对于docker的后续问题,我已在以下位置提交了一份报告: