2009-03-18 10 views
25

Che cosa fa realmente il tbb::scalable_allocator in Intel Threading Building Blocks?Come funziona scalable_allocator di Intel TBB?

Può essere certamente efficace. L'ho appena usato per ridurre del 25% il tempo di esecuzione di un'app (e vedere un aumento dell'utilizzo della CPU da circa il 200% al 350% su un sistema a 4 core) modificando un singolo std::vector<T> a std::vector<T,tbb::scalable_allocator<T> >. D'altra parte in un'altra app l'ho visto raddoppiare un consumo di memoria già grande e inviare cose da scambiare città.

La documentazione di Intel non lascia molto spazio (ad esempio una breve sezione alla fine di questo FAQ). Qualcuno può dirmi quali trucchi utilizza prima di andare a scavare da solo nel suo codice?

UPDATE: Solo utilizzando TBB 3.0 per la prima volta, e ho visto la mia migliore velocità da scalable_allocator ancora. La modifica di un singolo vector<int> in un vector<int,scalable_allocator<int> > ha ridotto il tempo di esecuzione di qualcosa da 85 a 35 secondi (Debian Lenny, Core2, con TBB 3.0 dal test).

risposta

18

C'è una buona carta sul allocatore: The Foundations for Scalable Multi-core Software in Intel Threading Building Blocks

mia limitata esperienza: ho sovraccaricato il nuovo global/cancellare con il TBB :: scalable_allocator per la mia applicazione AI. Ma c'era poco cambiamento nel profilo temporale. Non ho paragonato l'uso della memoria però.

+2

Grazie! L'articolo contiene esattamente il tipo di informazioni che stavo cercando. – timday

+3

Il collegamento originale è ora defunto, ma CiteSeer ha il PDF: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.171.8289 –

+4

Per aggiungere un punto dati: nella mia app particolare, contesa allocatore ha arrestato la velocità di circa 15 thread, oltre che avrebbe ucciso tutta la velocità di accelerazione e di 40 sarebbe molto più lento del single-thread. Con 'scalable_allocator' usato nei kernel interni per-thread il collo di bottiglia è scomparso e il ridimensionamento previsto è tornato. (la macchina ha 40 core fisici). – Adam

0

La soluzione che hai citato è ottimizzata per le CPU Intel. Incorpora meccanismi specifici della CPU per migliorare le prestazioni.

Qualche tempo fa ho trovato un'altra soluzione molto utile: Fast C++11 allocator for STL containers. Accelera leggermente i contenitori STL su VS2017 (~ 5x) e su GCC (~ 7x). Usa il pool di memoria per l'assegnazione degli elementi che lo rende estremamente efficace per tutti i platofrms.