Как работает Intel TBB scalable_allocator? - PullRequest
26 голосов
/ 18 марта 2009

Что на самом деле делает tbb::scalable_allocator в Intel Threading Building Blocks под капотом?

Это, безусловно, может быть эффективным. Я просто использовал его, чтобы уменьшить время выполнения приложений на 25% (и увидеть увеличение загрузки ЦП с ~ 200% до 350% в 4-ядерных системах), изменив одну std::vector<T> на std::vector<T,tbb::scalable_allocator<T> >. С другой стороны, в другом приложении я видел, как оно удваивает и без того большое потребление памяти и отправляет данные в swap city.

Собственная документация Intel мало что дает (например, короткий раздел в конце этого FAQ ). Может кто-нибудь сказать мне, какие уловки он использует, прежде чем я сам пойду в его код?

ОБНОВЛЕНИЕ : Просто впервые использую TBB 3.0 и пока вижу мое лучшее ускорение от scalable_allocator. Замена одного vector<int> на vector<int,scalable_allocator<int> > сократила время выполнения чего-то с 85 до 35 с (Debian Lenny, Core2, с TBB 3.0 от тестирования).

Ответы [ 2 ]

18 голосов
/ 19 марта 2009

На распределителе есть хорошая статья: Основы масштабируемого многоядерного программного обеспечения в Intel Threading Building Blocks

Мой ограниченный опыт: я перегрузил глобальный new / delete с помощью tbb :: scalable_allocator для моего приложения AI. Но было мало изменений в профиле времени. Я не сравнивал использование памяти.

2 голосов
/ 05 ноября 2017

Упомянутое вами решение оптимизировано для процессоров Intel. Он включает в себя специальные механизмы ЦП для повышения производительности.

Некоторое время назад я нашел другое очень полезное решение: Быстрый C ++ 11 распределитель для контейнеров STL . Это немного ускоряет контейнеры STL на VS2017 (~ 5x), а также на GCC (~ 7x). Он использует пул памяти для распределения элементов, что делает его чрезвычайно эффективным для всех платформ.

...