2014-04-28 68 views
0

所以我想对于每个使用并行.. 我有代码,我做的事:tbb:task_scheduler_init自定义分配器?

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一个特定的分配器的所有目的?

由于

回答

4

实例化对象tbb:task_scheduler_init的是可选的。 TBB具有懒惰的自动初始化机制,它在第一次调用TBB算法/调度程序时构造所有内容。自动初始化等于在第一次调用TBB之前构造一个全局task_scheduler_init对象。当然,如果您需要重写默认的线程数量,请指定TBB应该初始化的范围,或者为工作人员指定堆栈的大小,但显式初始化是不可避免的。

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

鉴于所有上述情况,我认为你有两个[组合]选项:

  1. 确保TBB调度使用其自己的分配器,所以你不必担心正确的替换的malloc为TBB。
  2. 或/并确保在malloc/free处于一致状态的点(范围)处创建并销毁唯一的task_scheduler_init。