tbb:task_scheduler_init自定义分配器?

时间:2014-04-28 08:56:55

标签: c++ multithreading parallel-processing intel tbb

所以我试图为每个使用并行... 我的代码在哪里:

Source s;..
parallel_for_each(begin(_allocs), end(_allocs), [&s] (Allocs_t::value_type allocation) {
  // cool stuff with allocation
}

这很有效,效果很好。但是,我在很多帖子中都看到过我应该在调度任务之前调用tbb:task_scheduler_init。

问题是我覆盖了malloc和calloc,我不能使用init调用malloc和calloc(它可以...) 所以问题是:

  1. 为什么它运作良好?它运作良好吗?
  2. 有没有办法让intel为其所有目的提供特定的分配器?
  3. 由于

1 个答案:

答案 0 :(得分:4)

tbb:task_scheduler_init对象的实例化是可选的。 TBB具有惰性自动初始化机制,它在第一次调用TBB算法/调度程序时构造所有内容。自动初始化等同于在第一次调用TBB之前构建全局task_scheduler_init对象。

当然,如果您需要覆盖默认的线程数,请指定TBB应该初始化的范围,或者指定工作组的堆栈大小,显式初始化是不可避免的。

TBB调度程序使用其自己的可伸缩分配器(tbbmalloc.dll,libtbbmalloc.so ..),如果在tbb二进制文件附近找到它,否则它将回退到使用malloc。没有办法显式指定调度程序使用的任何其他分配器(与具有相应模板参数的TBB容器不同)。

考虑到上述所有情况,我认为你有两个[可组合]选项:

  1. 确保TBB计划程序使用自己的分配器,因此您不必担心正确替换TBB的malloc。
  2. 或者/并确保在malloc / free处于一致状态的点(范围)创建和销毁唯一的task_scheduler_init。