为什么我不能使用 tbb::task_scheduler_init 创建超过 32 个线程?

Why I cannot create threads more than 32 by using tbb::task_scheduler_init?

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

tbb::task_scheduler_init init(100);

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

看来使用这个头文件可以帮助打破限制

#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 到 运行 热点分析器时。 threads counts 与我设置的相关线程数不同,比如100;

这是 TBB 任务计划程序的硬性限制。这个想法是任务调度程序用于计算并行性。如果您正在积极计算某些东西,则没有理由将线程数增加到远高于硬件线程数。当 OS 开始过于频繁地切换线程上下文时,它会导致 over-subscription 开销。

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