【问题标题】:tbb:task_scheduler_init custom allocator?tbb:task_scheduler_init 自定义分配器?
【发布时间】:2014-04-28 08:56:55
【问题描述】:

所以我尝试对每个使用并行.. 我有我做的代码:

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 提供一个特定的分配器来满足其所有用途?

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 2012-05-29
      相关资源
      最近更新 更多