我需要使用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
);
});
答案 0 :(得分:3)
如果task_scheduler_init
实例不是此线程上第一次调用TBB,它就解释了为什么你会看到这样的行为。 [几乎]对TBB的任何调用都会启动自动初始化,此时工作线程的数量是固定的,对task_scheduler_init
的任何进一步调用基本上都没有任何意义,除了对内部任务调度程序对象的附加引用。
如果您控制整个应用程序并且可以调用task_scheduler_init
对象构造函数第一次调用TBB,它将解决您的问题。但是,如果您正在编写组件或库,请查看task_arena
功能,它允许控制并发限制,无论当前设置如何。