Как работает масштабируемый_allocator Intel TBB?
Что делает tbb::scalable_allocator
в Intel Threading Building Blocks на самом деле под капотом?
Это, безусловно, может быть эффективным. Я только что использовал его, чтобы сократить время выполнения приложений на 25% (и увидеть увеличение использования ЦП с ~ 200% до 350% в четырехъядерной системе), изменив один std::vector<T>
на std::vector<T,tbb::scalable_allocator<T> >
. С другой стороны, в другом приложении я видел, что он удваивает и без того большое потребление памяти и отправляет вещи на своп города.
Собственная документация Intel не дает многого (например, короткий раздел в конце этого FAQ). Может ли кто-нибудь рассказать мне, какие трюки он использует, прежде чем я пойду и сам заработаю его код?
ОБНОВЛЕНИЕ: просто с использованием TBB 3.0 в первый раз, и я пока не видел своего лучшего ускорения от scalable_allocator. Изменение одного vector<int>
на vector<int,scalable_allocator<int> >
сократило время выполнения от 85 до 35 секунд (Debian Lenny, Core2, с TBB 3.0 от тестирования).
Ответы
Ответ 1
В распределителе есть хорошая статья: Основы масштабируемого многоядерного программного обеспечения в Intel Threading Building Blocks
Мой ограниченный опыт: я перегрузил глобальное новое/удалить с помощью tbb:: scalable_allocator для моего приложения AI. Но незначительное изменение в профиле времени. Я не сравнивал использование памяти.
Ответ 2
Решение, упомянутое вами, оптимизировано для процессоров Intel. Он включает в себя определенные механизмы процессора для повышения производительности.
Когда-то я нашел еще одно очень полезное решение: Fast С++ 11 allocator для контейнеров STL. Он немного ускоряет контейнеры STL на VS2017 (~ 5x), а также на GCC (~ 7x). Он использует пул памяти для распределения элементов, что делает его чрезвычайно эффективным для всех платформ.