2016-08-07 12 views
1

我试图使用task_scheduler_init来控制我的程序中的线程数。但是,似乎无论我设置了多少个线程,线程的最大数量是32.我使用i7,它有8个逻辑内核。例如,我将task_scheduler_init设置为这样。为什么我不能使用tbb :: task_scheduler_init创建多于32的线程?

tbb::task_scheduler_init init(100); 

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

+0

你的机器上有多少核心?只是好奇,如果这影响它。 –

+0

我使用i7,它有8个逻辑核心。我不知道8和32之间的关系。 –

回答

1

这是TBB任务调度程序的硬限制。这个想法是,任务调度程序是为了计算并行性。如果你正在积极计算某些东西,没有理由增加比硬件线程数量多得多的线程数量。当操作系统开始频繁切换线程上下文时,会导致超额订阅开销。

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

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. 

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

相关问题