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

时间:2016-08-07 16:20:06

标签: multithreading c++11 tbb

我尝试使用task_scheduler_init来控制程序中的线程数。但是,似乎无论我设置了多少线程,最大线程数为32.我使用i7,它有8个逻辑核心。 例如,我像这样设置task_scheduler_init。

tbb::task_scheduler_init init(100);

实际上线程数是32.我试图使用limited_arena来打破限制,但是失败了。 enter image description here

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

似乎通过使用此头文件可以帮助打破限制。

#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.

然而,我不确定它是否确实有用或精确。因为当我使用intel vTune运行热点分析器时。线程计数与我设置相关大量线程时设置的不同,例如100;