Intel TBB v4.3忽略task_scheduler_init参数,始终运行等于核心数的总线程数

时间:2016-01-03 23:50:47

标签: multithreading parallel-processing intel tbb

我需要使用task_scheduler_init将线程数限制为核心数以下,但是TBB忽略了数字&始终使用核心数(在这种情况下为8)。

对我来说这看起来不像是正常行为。请注意,我不可能使用不同版本的TBB。

段:

task_scheduler_init scheduler(nb_thread);

tbb::parallel_for(
  tbb::blocked_range<size_t>(0, size),
  [&](const tbb::blocked_range<size_t>& subrange) {
      int tid = syscall(SYS_gettid);
      dragon_draw_raw(
                subrange.begin(),
                subrange.end(),
                dragon,
                dragon_width,
                dragon_height,
                limits,
                id
              );
      });

1 个答案:

答案 0 :(得分:3)

如果task_scheduler_init实例不是此线程上第一次调用TBB,它就解释了为什么你会看到这样的行为。 [几乎]对TBB的任何调用都会启动自动初始化,此时工作线程的数量是固定的,对task_scheduler_init的任何进一步调用基本上都没有任何意义,除了对内部任务调度程序对象的附加引用。

如果您控制整个应用程序并且可以调用task_scheduler_init对象构造函数第一次调用TBB,它将解决您的问题。但是,如果您正在编写组件或库,请查看task_arena功能,它允许控制并发限制,无论当前设置如何。