Pergunta

Intel das Threading Building Blocks (TBB) open source olhares biblioteca realmente interessante. Mesmo que não há sequer um O'Reilly Livro sobre o assunto eu não ouvir falar de um monte de pessoas usando isso. Eu estou interessado em usá-lo para alguns multi-nível de aplicações paralelas (MPI + threads) em ambientes Unix (Mac, Linux, etc.). Por que vale a pena, eu estou interessado em Computação de Alto Desempenho / Métodos Numéricos tipos de aplicações.

Alguém tem experiências com TBB? Será que funciona bem? É bastante portátil (incluindo GCC e outros compiladores)? Será que o bem trabalho paradigma para programas que você escreveu? Existem outras bibliotecas que eu deveria olhar para?

Foi útil?

Solução

Eu já introduziu-lo em nossa base de código, pois precisávamos de um malloc apostador para usar quando nos mudamos para uma máquina 16 de núcleo. Com 8 e sob ele não era um problema significativo. Tem funcionado bem para nós. Estamos pensando em usar o grão fino recipientes simultâneas seguinte. Idealmente podemos fazer uso da carne real do produto, mas que exige repensar como vamos construir o nosso código. Eu realmente gosto das ideias em TBB, mas não é fácil de retrofit em uma base de código.

Você não pode pensar em TBB como outra biblioteca threading. Eles têm um modelo totalmente novo que realmente fica em cima de tópicos e abstrai os tópicos de distância. Você aprende a pensar na tarefa, parallel_for operações e dutos de tipo. Se eu fosse para construir um novo projeto eu provavelmente iria tentar modelá-lo desta forma.

Eu trabalho no Visual Studio e ele funciona muito bem. Ele foi originalmente escrito para Linux / pthreads para que ele funciona muito bem por lá também.

Outras dicas

Eu não estou fazendo computação numérica, mas eu trabalho com a mineração de dados (acho que o agrupamento e classificação), e as nossas cargas de trabalho são provavelmente semelhantes: todos os dados é estático e você tê-lo no início do programa. Eu brevemente investigado TBB da Intel e os encontrou um exagero para minhas necessidades. Depois de começar com código baseado em pthread cru, eu mudei para OpenMP e tem a mistura certa entre legibilidade e performance.

Portabilidade

TBB é portátil. Ele suporta (ou seja x 86) processadores Intel e AMD, IBM PowerPC e processadores POWER, processadores ARM, e possivelmente outros. Se você olhar no diretório de construção , você pode ver todas as configurações da compilação suporte do sistema, que incluem uma ampla gama de sistemas operacionais (Linux, Windows, Android, MacOS, iOS, FreeBSD, AIX, etc.) e compiladores (GCC, Intel, Clang / LLVM, IBM XL, etc.). Eu não tentei TBB com o compilador do IGP C ++ e saber que ele não funciona com o compilador Cray C ++ (a partir de 2017).

Alguns anos atrás, eu era parte do esforço para a porta TBB a sistemas IBM Blue Gene. vinculação estática foi um desafio, mas agora é tratado pela big_iron. inc ajudante sistema de compilação. As outras questões estavam apoiando versões relativamente antigas do GCC (4.1 e 4.4) e garantir os atomics PowerPC estavam trabalhando. Espero que portar para qualquer arquitetura atualmente não suportado seria relativamente simples em plataformas que oferecem ou são compatíveis com GCC e POSIX.

Uso de códigos comunitários

Estou ciente de pelo menos dois frameworks de aplicativos HPC que usa TBB:

Eu não sei como MOOSE usa TBB, mas LOUCURA usa TBB para a sua fila de tarefas e alocador de memória.

Performance versus outros modelos de segmentação

Eu pessoalmente tenho usado TBB no Paralelo Projeto de pesquisa Kernels , dentro do qual eu ter comparado TBB para OpenMP, OpenCL, Kokkos, RAJA, C ++ 17 STL paralelo, e outros modelos. Veja a C ++ subdiretório para mais detalhes.

A figura a seguir mostra o desempenho relativo dos modelos acima mencionados em um processador Intel Xeon Phi 7250 (os detalhes não são importantes - todos os modelos utilizados as mesmas configurações). Como você pode ver, TBB não muito bem exceto para tamanhos de problema menores, onde a sobrecarga de escalonamento adaptativo é mais relevante. TBB tem botões de ajuste que irá afectar estes resultados.

PRK stencil

A divulgação completa:. Eu trabalho para Intel em uma pesquisa / capacidade pathfinding

Eu usei TBB brevemente, e provavelmente vai usá-lo mais no futuro. Eu gostava de usá-lo, o mais importante, porque você não tem que lidar com macros / extensões de C ++, mas permanecem dentro da linguagem. Também o seu muito portátil. Eu usei-o em Windows e Linux. Uma coisa, porém: é difícil trabalhar com threads usando TBB, você teria que pensar em termos de tarefas (que é realmente uma coisa boa). Intel TBB não iria apoiar o seu uso de bloqueios nuas (ele vai fazer isso tediosa). Mas no geral, esta é a minha experiência preliminar.

Eu também recomendo ter um olhar para OpenMP 3 também.

ZThread é LGPL, você está limitado a usar a biblioteca em ligação dinâmica se não trabalhar em um projeto open source.

Os Threading Building Blocks (TBB) na versão de código aberto, (há uma nova versão comercial, US $ 299, não sei as diferenças ainda) é GNU General Public License versão 2 com um assim chamado “Exceção Runtime” (que é específico para o uso somente na criação de software livre.) Eu vi outras exceções de tempo de execução que tentam aproximar LGPL, mas permitindo o uso comercial e estática ligando esta não é é agora o caso.

Eu só estou escrevendo isso porque eu aproveitei a oportunidade para examinar as licenças bibliotecas e aqueles deve ser também uma consideração para a seleção baseada no uso que se pretende dar-lhes.


Txs, Jihn por apontar essa atualização ...

Eu olhei para TBB, mas nunca usei em um projeto. Não vi vantagens (para os meus propósitos) sobre ZThread . Uma breve visão geral e um pouco datado pode ser encontrada aqui .

É bastante completo com diversas opções de rosca expedição, todas as classes de sincronização habituais e um fio de excepção baseada muito útil "interrupção" mecanismo. É facilmente extensível, bem escrito e documentado. Eu usei-o em mais de 20 projectos.
Ele também desempenha agradável com qualquer * NIX que tópicos suportes POSIX, bem como o Windows.

Vale a pena olhar.

Eu uso TBB em um projeto. Parecia ser mais fácil de usá-lo do que threads. Há tarefas que podem ser executadas em paralelo. A tarefa é apenas uma chamada para sua sub-rotina paralelizado. O balanceamento de carga é feito automaticamente. É por isso que eu o aceito como uma biblioteca paralelização nível superior. Eu alcançado 2,5x acelerar sem muito trabalho em um processador intel 4 núcleos. Há exemplos, eles responder a perguntas em fóruns e é mantido e é gratuito.

É ser clara vale o que TBB (Threading Building Blocks) é para contrastar com outras alternativas (por exemplo, C ++ 11x características de simultaneidade). TBB é uma biblioteca portátil e escalável (não uma extensão do compilador) que lhe permite escrever o código na forma de tarefas leves que TBB irá agendar para executar o mais rápido possível sobre os recursos de CPU disponíveis. suporte Não é projetado segmentação para outros fins (por exemplo preempção).

Eu usei TBB para acelerar o processamento de imagem existente de loops sobre a imagem linhas de varredura em loops parallel_for (um mínimo de 2-4 linhas de varredura como um tamanho 'grão'). Isso tem sido muito bem sucedida. Ele exige o corpo do laço é (re) escrito para processar um índice arbitrário em vez de assumir cada corpo do laço é processado sequencialmente (por exemplo ponteiros que são incrementados entre cada iteração do ciclo).

Este foi um caso bastante trivial como não havia qualquer armazenamento de atualização compartilhada. Usando os recursos mais poderosos (por exemplo, oleodutos) exigirá reimagining significativa e / ou reescrever do código existente para que talvez seja mais adequado para o novo código.

É uma grande vantagem que este código com base TBB permanece portátil, não parece interferir com outro código em outros lugares no mesmo processo ao mesmo tempo usando outras estratégias de segmentação e mais tarde pode ser combinado com o multiprocessamento estratégias em uma níveis mais elevados ou mais baixos (por exemplo, a TBB parallel_for código poderia ser chamado de um filtro em uma tubulação multiprocessamento TBB).

Você já olhou para impulso biblioteca com a sua fio API ?

Os Threading Building Blocks (TBB) em a versão de código aberto, (há uma nova versão comercial, US $ 299, não saber as diferenças ainda) é GNU General Public License versão 2 com um assim chamado “Runtime Exception” (que é específico para o uso somente em criação de software livre.) Eu vi outras exceções de tempo de execução que a tentativa para se aproximar LGPL, mas permitindo uso comercial e estática ligando esta não é o caso.

De acordo com esta pergunta Threading Building Blocks é utilizável sem restrições de cópia-esquerda com uso comercial.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top