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).
Danke! Artikel enthält genau die Art von Informationen, nach denen ich gesucht habe. – timday
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 –
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