2009-03-18 4 views
25

Was macht die tbb::scalable_allocator in Intel Threading Building Blocks eigentlich unter der Haube?Wie funktioniert der scalable_allocator von Intel TBB?

Es kann sicherlich effektiv sein. Ich habe es gerade verwendet, um die Ausführungszeit einer App um 25% zu verkürzen (und einen Anstieg der CPU-Auslastung von ~ 200% auf 350% bei einem 4-Kern-System zu sehen), indem ich einen einzelnen std::vector<T> zu std::vector<T,tbb::scalable_allocator<T> > ändere. Auf der anderen Seite habe ich in einer anderen App gesehen, dass es bereits einen großen Speicherverbrauch verdoppelt und Dinge zum Tauschen von Stadt sendet.

Intels eigene Dokumentation gibt nicht viel her (z. B. ein kurzer Abschnitt am Ende dieser FAQ). Kann mir jemand sagen, welche Tricks es benutzt, bevor ich selbst in den Code gehe?

UPDATE: Nur mit TBB 3.0 zum ersten Mal, und sah meine beste Beschleunigung von scalable_allocator noch. Das Ändern einer einzelnen vector<int> zu einer vector<int,scalable_allocator<int> > reduziert die Laufzeit von etwas von 85s auf 35s (Debian Lenny, Core2, mit TBB 3.0 aus dem Test).

Antwort

18

Es ist ein gutes Papier auf dem Allocator: The Foundations for Scalable Multi-core Software in Intel Threading Building Blocks

Meine begrenzte Erfahrung: Ich überlastet die globale neu/löschen mit dem TBB :: scalable_allocator für meine AI-Anwendung. Aber das Zeitprofil änderte sich wenig. Ich habe die Speicherbelegung nicht verglichen.

+2

Danke! Artikel enthält genau die Art von Informationen, nach denen ich gesucht habe. – timday

+3

Der ursprüngliche Link ist jetzt nicht mehr vorhanden, aber CiteSeer hat das PDF: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.71.8289 –

+4

Um einen Datenpunkt hinzuzufügen: in meiner bestimmten App, Allokator-Contention angehalten Beschleunigung um 15 Threads, vorbei, dass es alle Beschleunigung töten würde und um 40 wäre es viel langsamer als Single-Thread. Mit 'scalable_allocator', der in den internen Kerneln pro Thread verwendet wurde, verschwand der Engpass und die erwartete Skalierung kam zurück. (Maschine hat 40 physische Kerne). – Adam

0

Die von Ihnen erwähnte Lösung ist für Intel-CPUs optimiert. Es enthält spezielle CPU-Mechanismen, um die Leistung zu verbessern.

Vor einiger Zeit fand ich eine andere sehr nützliche Lösung: Fast C++11 allocator for STL containers. Es beschleunigt leicht STL-Container auf VS2017 (~ 5x) sowie auf GCC (~ 7x). Es verwendet einen Speicherpool für die Elementzuweisung, was es für alle Plattformen extrem effektiv macht.