【问题标题】:Number of threads used by Intel TBB英特尔 TBB 使用的线程数
【发布时间】:2010-09-24 11:05:34
【问题描述】:

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

是否有某种可用的规范?

【问题讨论】:

    标签: multithreading parallel-processing tbb


    【解决方案1】:

    从 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 作业。从另一个线程创建更多作业时,您需要另一个 tbb::task_scheduler_init
    • 这实际上不是一个解决方案,因为给定任何nthread 值,TBB 仍会创建等于硬件 CPU 线程数的线程数。而且,更糟糕的是,如果您指定nthreads=2,TBB 会创建第二个线程并在其上运行 TBB 工作,而不是在主线程上。详情请看这个问题:stackoverflow.com/questions/59736661/…
    【解决方案2】:

    让 TBB 决定池中的线程数是推荐的选项 - 它通常会创建与机器上的逻辑 CPU 一样多的工作线程 - 请参阅 Class reference for tbb::task_scheduler_init

    要找出在任何给定时间存在或正在执行任务的工作线程数量并不容易 - 这是一个经过深思熟虑的设计选择。来自Intel's TBB Parallel Programming Course

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

    别问了!

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

    【讨论】:

    • 任务调度程序是否能够检测它是否在 cgroups 受限环境中运行(例如 docker 容器?)。例如,在 docker 容器中运行时,openmp 运行时通常不会而且往往会导致超额订阅(例如,在具有 32 个内核的机器上限制为 2000 mCPU 配额)。
    • 如果多个进程在同一台主机上运行(例如在 Python 中使用多处理来生成 worker 时),TBB 调度器是否可以检测到其他进程中运行的代码的并发版本并自动调整数量活动线程以避免超额订阅问题?如果进程不是由同一个 unix 用户启动怎么办?
    • 回复我自己:TBB可以使用进程间通信来协调调度器,避免超额订阅。这可以通过设置 ENABLE_IPC 环境变量来完成。
    • 我尝试在一个使用docker run --cpus 2 启动的脚本中运行一些 numpy / MKL / TBB 基准测试,该脚本在具有 28 个内核的主机上运行,​​我观察到与超额订阅相关的性能下降相当严重。
    • 关于docker后面的issue,我已经提交了报告到:github.com/intel/tbb/issues/190
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      相关资源
      最近更新 更多