Intel TBB的可扩展分配器如何工作?

32
在 Intel Threading Building Blocks 中,tbb::scalable_allocator 到底是怎么工作的呢?它确实非常有效。我曾经只改变一个std::vector<T>std::vector<T,tbb::scalable_allocator<T> >,就将某个应用程序的执行时间缩短了25%(并且在4核系统上看到CPU利用率从约200%提高到350%)。但在另一个应用程序中,它却使内存使用量大增,并将一些东西送入交换空间。
Intel 自己的文档并没有透露太多信息(例如这个FAQ结尾的一个简短章节)。在我自己查看其代码之前,有人能告诉我它使用了哪些技巧吗?
更新:我第一次使用 TBB 3.0,看到了我迄今为止使用 scalable_allocator 取得的最佳加速效果。只是将一个vector<int>改为vector<int,scalable_allocator<int> >,就将某个东西的运行时间从85秒减少到35秒(在 Debian Lenny、Core2 和来自测试的 TBB 3.0 上)。
2个回答

21

2
谢谢!这篇文章提供了我正在寻找的准确信息。 - timday
3
原始链接已经失效,但是CiteSeer有PDF版本: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.71.8289 - Arto Bendiken
4
添加一个数据点:在我的特定应用程序中,分配器争用会在大约15个线程时停止加速,超过这个数量会破坏所有加速效果,到40个线程时它比单线程还要慢得多。使用内部每个线程内核中的scalable_allocator,瓶颈消失了,并且预期的扩展性回来了。(机器有40个物理内核)。 - Adam

3

您提到的解决方案是为英特尔CPU进行了优化。它采用了特定的CPU机制以提高性能。

不久前,我发现另一个非常有用的解决方案:适用于STL容器的快速C++11分配器。它可以轻微地加速VS2017(~5倍)和GCC(~7倍)上的STL容器。它使用内存池来分配元素,这使得它对所有平台都非常有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接