Como funciona scalable_allocator da Intel TBB?
-
19-08-2019 - |
Pergunta
O que faz a tbb::scalable_allocator
em Intel Threading Building Blocks realmente fazer sob o capô?
Pode certamente ser eficaz. Eu apenas utilizado para tirar 25% off tempo de execução an aplicativos (e ver um aumento na utilização da CPU de ~ 200% a 350% em um sistema 4-core) alterando um único std::vector<T>
para std::vector<T,tbb::scalable_allocator<T> >
. Por outro lado, em outro aplicativo Eu já vi isso dobrar um consumo de memória já grande e enviar as coisas para a cidade de swap.
própria documentação da Intel não dá muito longe (por exemplo, uma pequena seção no final deste FAQ ). Alguém pode me dizer o que truques que ele usa antes de eu ir e cavar seu código de mim mesmo?
Atualizar : Apenas usando TBB 3.0 pela primeira vez, e visto o meu melhor aceleração de scalable_allocator ainda. A alteração de um único vector<int>
para um vector<int,scalable_allocator<int> >
reduziu o tempo de execução de algo de 85s a 35s (Debian Lenny, Core2, com TBB 3,0 a partir de testes).
Solução
Há um bom papel no alocador: As bases para Software escalável multi-core em Intel threading Building Blocks
A minha experiência limitada: Eu sobrecarregado o novo global / apagar com o tbb :: scalable_allocator para a minha candidatura AI. Mas houve pouca mudança no perfil de tempo. Eu não comparar o uso de memória embora.
Outras dicas
A solução que você mencionou é otimizado para Intel CPUs. Ele incorpora mecanismos de CPU específicos para melhorar o desempenho.
Algum tempo atrás eu encontrei outra solução muito útil: rápido C ++ 11 alocador para contêineres STL . É ligeiramente acelera recipientes STL sobre VS2017 (~ 5x), bem como no GCC (~ 7x). Ele usa pool de memória para elementos de alocação que torna extremamente eficaz para todos os platofrms.