2009-03-18 12 views
25

¿Qué hace tbb::scalable_allocator en Intel Threading Building Blocks en realidad bajo el capó?¿Cómo funciona el scalable_allocator de Intel TBB?

Sin duda puede ser eficaz. Acabo de usarlo para quitar un 25% del tiempo de ejecución de una aplicación (y ver un aumento en la utilización de la CPU de ~ 200% a 350% en un sistema de 4 núcleos) cambiando un solo std::vector<T> a std::vector<T,tbb::scalable_allocator<T> >. Por otro lado, en otra aplicación he visto duplicar el consumo de memoria ya grande y enviar cosas a la ciudad de intercambio.

La propia documentación de Intel no proporciona mucho (por ejemplo, una sección corta al final de este FAQ). ¿Alguien puede decirme qué trucos usa antes de ir y profundizar en su código?

ACTUALIZACIÓN: Solo uso TBB 3.0 por primera vez, y veo mi mejor aceleración de scalable_allocator todavía. Al cambiar un solo vector<int> a un vector<int,scalable_allocator<int> >, se redujo el tiempo de ejecución de algo entre 85 y 35 (Debian Lenny, Core2, con TBB 3.0 de las pruebas).

Respuesta

18

Hay un buen papel en el asignador: The Foundations for Scalable Multi-core Software in Intel Threading Building Blocks

Mi experiencia limitada: sobrecargué el nuevo mundial/borrar con el TBB :: scalable_allocator para mi aplicación AI. Pero hubo pocos cambios en el perfil de tiempo. Sin embargo, no comparé el uso de la memoria.

+2

Gracias! El artículo contiene exactamente el tipo de información que estaba buscando. – timday

+3

El enlace original está ahora desaparecido, pero CiteSeer tiene el PDF: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.71.8289 –

+4

Para agregar un punto de datos: en mi aplicación particular, contención del asignador detuvo la aceleración en alrededor de 15 hilos, más allá de que mataría a toda aceleración y en 40 sería mucho más lento que un solo hilo. Con 'scalable_allocator' utilizado en los núcleos internos por subproceso, el cuello de botella desapareció y la escala esperada regresó. (la máquina tiene 40 núcleos físicos). – Adam

0

La solución que mencionó está optimizada para las CPU Intel. Incorpora mecanismos de CPU específicos para mejorar el rendimiento.

Hace algún tiempo encontré otra solución muy útil: Fast C++11 allocator for STL containers. Se acelera ligeramente los contenedores STL en VS2017 (~ 5x), así como en GCC (~ 7x). Utiliza el grupo de memoria para la asignación de elementos, lo que lo hace extremadamente efectivo para todos los platofrms.

Cuestiones relacionadas