2014-04-28 37 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。