【问题标题】:Why I cannot create threads more than 32 by using tbb::task_scheduler_init?为什么我不能使用 tbb::task_scheduler_init 创建超过 32 个线程?
【发布时间】:2016-08-07 16:20:06
【问题描述】:

我尝试使用 task_scheduler_init 来控制程序中的线程数。但是,好像不管我设置多少线程,最大线程数都是32。我用的是i7,它有8个逻辑核心。 比如我这样设置task_scheduler_init。

tbb::task_scheduler_init init(100);

实际上线程数是32。我尝试使用limited_arena来打破限制,但失败了。

【问题讨论】:

  • 您的机器上有多少个内核?只是好奇这是否会影响它。
  • 我用的是i7,它有8个逻辑核心。我不知道8和32之间的关系。

标签: c++ multithreading c++11 tbb


【解决方案1】:

这是 TBB 任务调度程序的硬性限制。这个想法是任务调度程序用于计算并行性。如果您正在主动计算某些东西,则没有理由将线程数增加得远高于硬件线程数。当操作系统开始过于频繁地切换线程上下文时,它会导致超额订阅开销。

TBB 任务调度程序不是为支持在操作系统中阻塞的线程而设计的(例如,用于 I/O)。如果您想将 TBB 与 I/O 任务一起使用,请确保使用异步 I/O。然而,TBB 认识到应用程序设计很少是完美的,因此允许这种 4 倍的超额认购。另一种方法是使用std::thread 创建和管理您自己的线程(TBB 在"tbb/compat/thread" 标头中为旧编译器提供了自己的包装器)。

【讨论】:

    【解决方案2】:

    使用这个头文件似乎可以帮助打破限制。

    #define TBB_PREVIEW_GLOBAL_CONTROL 1
    #include <tbb/global_control.h>
    tbb::global_control MAXTHREADS(tbb::global_control::max_allowed_parallelism, aMaximumNumberOfThreads);//put it in a code block.
    

    但是,我不确定它是否确实有用或足够精确。因为当我使用英特尔 vTune 运行热点分析器时。线程数与我设置相关大线程数时设置的不同,例如100;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多