【发布时间】:2010-09-24 11:05:34
【问题描述】:
英特尔 TBB 如何选择用于并行部分的线程数?
是否有某种可用的规范?
【问题讨论】:
标签: multithreading parallel-processing tbb
英特尔 TBB 如何选择用于并行部分的线程数?
是否有某种可用的规范?
【问题讨论】:
标签: multithreading parallel-processing tbb
从 TBB 版本 2.2 开始,任务调度程序将自动初始化,并在运行时处理要使用的线程数,如果您要手动更改该数,可以使用以下方法之一:
创建调度器时,可以指定线程数为
tbb::task_scheduler_init init(nthread);
你也可以使用
tbb::task_scheduler_init init(tbb::task_scheduler_init::automatic);
在这种情况下,tbb 调度程序会创建与 CPU 内核一样多的线程
【讨论】:
tbb::task_scheduler_init 对象处于活动状态,否则它将恢复为自动状态。
tbb::task_scheduler_init。
nthread 值,TBB 仍会创建等于硬件 CPU 线程数的线程数。而且,更糟糕的是,如果您指定nthreads=2,TBB 会创建第二个线程并在其上运行 TBB 工作,而不是在主线程上。详情请看这个问题:stackoverflow.com/questions/59736661/…
让 TBB 决定池中的线程数是推荐的选项 - 它通常会创建与机器上的逻辑 CPU 一样多的工作线程 - 请参阅 Class reference for tbb::task_scheduler_init。
要找出在任何给定时间存在或正在执行任务的工作线程数量并不容易 - 这是一个经过深思熟虑的设计选择。来自Intel's TBB Parallel Programming Course:
我怎么知道有多少线程可用?
别问了!
- 甚至调度程序也不知道真正有多少线程 可用
- 机器上可能正在运行其他进程
- 例程可以嵌套在其他并行例程中
【讨论】:
docker run --cpus 2 启动的脚本中运行一些 numpy / MKL / TBB 基准测试,该脚本在具有 28 个内核的主机上运行,我观察到与超额订阅相关的性能下降相当严重。
Documetation 只是说“取决于硬件配置”。可能只是可用的 CPU 内核数。
【讨论】: