2009-03-18 10 views
25

Qu'est-ce que le tbb::scalable_allocator dans les blocs de construction Intel Threading fait sous le capot?Comment le scalable_allocator d'Intel TBB fonctionne-t-il?

Il peut certainement être efficace. Je viens de l'utiliser pour réduire de 25% le temps d'exécution d'une application (et voir une augmentation de l'utilisation du processeur de ~ 200% à 350% sur un système à 4 cœurs) en changeant un std::vector<T> en std::vector<T,tbb::scalable_allocator<T> >. D'autre part, dans une autre application, je l'ai vu doubler une consommation de mémoire déjà importante et envoyer des choses à échanger la ville.

La documentation d'Intel ne donne pas beaucoup (par exemple une courte section à la fin de ce FAQ). Quelqu'un peut-il me dire quelles astuces il utilise avant d'aller creuser dans son code moi-même?

MISE À JOUR: Utilisation de TBB 3.0 pour la première fois, et meilleure accélération de la part de scalable_allocator. Changer un seul vector<int> en vector<int,scalable_allocator<int> > a réduit l'exécution de quelque chose de 85s à 35s (Debian Lenny, Core2, avec TBB 3.0 de testing).

Répondre

18

Il y a un bon papier sur le allocateur: The Foundations for Scalable Multi-core Software in Intel Threading Building Blocks

Mon expérience limitée: Je surchargée la nouvelle/supprimer mondiale avec le TBB :: scalable_allocator pour mon application AI. Mais il y avait peu de changement dans le profil temporel. Je n'ai pas comparé l'utilisation de la mémoire.

+2

Merci! L'article contient exactement le type d'information que je cherchais. – timday

+3

Le lien d'origine est maintenant disparu, mais CiteSeer a le format PDF: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.71.8289 –

+4

Pour ajouter un point de données: dans mon application particulière, contention allocator accéléré stopped à environ 15 threads, passé qu'il tuerait toute l'accélération et par 40 ce serait beaucoup plus lent que le fil simple. Avec scalable_allocator utilisé dans les noyaux internes du thread, le goulot d'étranglement a disparu et la mise à l'échelle attendue est revenue. (la machine a 40 cœurs physiques). – Adam

0

La solution que vous avez mentionnée est optimisée pour les processeurs Intel. Il intègre des mécanismes CPU spécifiques pour améliorer les performances.

Il y a quelque temps, j'ai trouvé une autre solution très utile: Fast C++11 allocator for STL containers. Il accélère légèrement les conteneurs STL sur VS2017 (~ 5x) ainsi que sur GCC (~ 7x). Il utilise le pool de mémoire pour l'allocation des éléments, ce qui le rend extrêmement efficace pour tous les platofrms.