tbb:task_scheduler_init自定义分配器

tbb:task_scheduler_init custom allocator?

本文关键字:自定义 分配器 init scheduler task tbb      更新时间:2023-10-16

所以我尝试对每个使用并行。。我在哪里有代码:

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. 有没有一种方法可以为英特尔的所有目的提供一个特定的分配器

感谢

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

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

如果在TBB二进制文件附近找到TBB调度程序,则它使用自己的可扩展分配器(tbbmalloc.dll,libtbbmallocso..),或者在其他情况下使用malloc。没有办法显式指定调度程序要使用的任何其他分配器(与具有相应模板参数的TBB容器不同)。

考虑到以上所有内容,我认为您有两个[可组合]选项:

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