我尝试使用task_scheduler_init来控制程序中的线程数。但是,似乎无论我设置了多少线程,最大线程数为32.我使用i7,它有8个逻辑核心。 例如,我像这样设置task_scheduler_init。
tbb::task_scheduler_init init(100);
答案 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;