Domanda

La libreria open source Intel Threading Building Blocks (TBB) sembra davvero interessante. Anche se c'è persino un O'Reilly Book sull'argomento di cui non sento molte persone usandolo. Sono interessato a usarlo per alcune applicazioni parallele multilivello (thread MPI +) in ambienti Unix (Mac, Linux, ecc.). Per quello che vale, sono interessato a tipi di applicazioni di calcolo / metodi numerici ad alte prestazioni.

Qualcuno ha esperienze con TBB? Funziona bene? È abbastanza portatile (compresi GCC e altri compilatori)? Il paradigma funziona bene per i programmi che hai scritto? Ci sono altre biblioteche che dovrei esaminare?

È stato utile?

Soluzione

L'ho introdotto nella nostra base di codice perché avevamo bisogno di uno scommettitore malloc da usare quando ci siamo trasferiti su una macchina a 16 core. Con 8 e sotto non è stato un problema significativo. Ha funzionato bene per noi. Abbiamo in programma di utilizzare successivamente i contenitori simultanei a grana fine. Idealmente possiamo utilizzare la vera carne del prodotto, ma ciò richiede di ripensare il modo in cui costruiamo il nostro codice. Mi piacciono molto le idee in TBB, ma non è facile adattarlo a una base di codice.

Non puoi pensare a TBB come a un'altra libreria di threading. Hanno un modello completamente nuovo che si trova davvero sopra i fili e ne estrae i fili. Si impara a pensare in task, parallel_per digitare operazioni e pipeline. Se dovessi costruire un nuovo progetto, probabilmente proverei a modellarlo in questo modo.

Lavoriamo in Visual Studio e funziona perfettamente. È stato originariamente scritto per linux / pthreads, quindi funziona perfettamente anche lì.

Altri suggerimenti

Non sto facendo calcolo numerico ma lavoro con il data mining (pensa al clustering e alla classificazione), e i nostri carichi di lavoro sono probabilmente simili: tutti i dati sono statici e ce l'hai all'inizio del programma. Ho studiato brevemente il TBB di Intel e li ho trovati eccessivi per le mie esigenze. Dopo aver iniziato con il codice raw basato su pthread, sono passato a OPENMP e ho ottenuto il giusto mix tra leggibilità e prestazioni.

Portabilità

TBB è portatile. Supporta processori Intel e AMD (ovvero x86), processori IBM PowerPC e POWER, processori ARM e possibilmente altri. Se guardi nella directory di build , puoi vedere tutte le configurazioni della build supporto di sistema, che include una vasta gamma di sistemi operativi (Linux, Windows, Android, MacOS, iOS, FreeBSD, AIX, ecc.) e compilatori (GCC, Intel, Clang / LLVM, IBM XL, ecc.). Non ho provato TBB con il compilatore C ++ PGI e so che non funziona con il compilatore Cray C ++ (dal 2017).

Qualche anno fa, ho fatto parte dello sforzo di portare TBB su sistemi IBM Blue Gene. Il collegamento statico è stato una sfida, ma ora viene affrontato dal big_iron. inc build helper di sistema. Gli altri problemi stavano supportando versioni relativamente antiche di GCC (4.1 e 4.4) e garantendo il funzionamento dell'atomica PowerPC. Mi aspetto che il porting su qualsiasi architettura attualmente non supportata sarebbe relativamente semplice su piattaforme che forniscono o sono compatibili con GCC e POSIX.

Utilizzo nei codici comunità

Sono a conoscenza di almeno due framework di applicazioni HPC che utilizzano TBB:

Non so come MOOSE usi TBB, ma MADNESS usa TBB per la sua coda di attività e allocatore di memoria.

Prestazioni rispetto ad altri modelli di threading

Ho usato personalmente TBB nel progetto Parallel Research Kernels , all'interno del quale ho confrontato TBB con OpenMP, OpenCL, Kokkos, RAJA, C ++ 17 Parallel STL e altri modelli. Vedi la sottodirectory C ++ per i dettagli.

La figura seguente mostra le prestazioni relative dei modelli sopra menzionati su un processore Intel Xeon Phi 7250 (i dettagli non sono importanti: tutti i modelli hanno utilizzato le stesse impostazioni). Come puoi vedere, TBB fa abbastanza bene, tranne per problemi di dimensioni minori, dove il sovraccarico della pianificazione adattiva è più rilevante. TBB ha manopole di regolazione che influenzeranno questi risultati.

 stencil PRK

Informativa completa: lavoro per Intel con capacità di ricerca / ricerca di percorsi.

Ho usato brevemente TBB e probabilmente lo userò di più in futuro. Mi è piaciuto usarlo, soprattutto perché non hai a che fare con macro / estensioni di C ++, ma rimani nella lingua. Inoltre è abbastanza portatile. L'ho usato su Windows e Linux. Una cosa però: è difficile lavorare con i thread usando TBB, dovresti pensare in termini di attività (che in realtà è una buona cosa). Intel TBB non supporterà il tuo utilizzo di blocchi non elaborati (renderà noioso). Ma nel complesso, questa è la mia esperienza preliminare.

Consiglio anche di dare un'occhiata a openMP 3.

ZThread è LGPL, si è limitati a utilizzare la libreria in collegamento dinamico se non si lavora in un progetto open source.

The Threading Building Blocks (TBB) nella versione open source, (c'è una nuova versione commerciale, $ 299, non conosco ancora le differenze) è GNU General Public License versione 2 con un cosiddetto & # 8220; Eccezione di runtime & # 8221; (che è specifico all'uso solo per la creazione di software gratuito.) Ho visto altre eccezioni di runtime che tentano di avvicinarsi a LGPL ma abilitare l'uso commerciale e il collegamento statico questo non è è ora il caso.

Sto scrivendo questo solo perché ho colto l'occasione per esaminare le licenze delle biblioteche e quelle dovrebbero anche essere una considerazione per la selezione in base all'uso che si intende dare loro.


Txs, Jihn per aver sottolineato questo aggiornamento ...

Ho esaminato TBB ma non l'ho mai usato in un progetto. Non ho riscontrato alcun vantaggio (ai miei scopi) rispetto a ZThread . Una panoramica breve e in qualche modo datata è disponibile qui .

È abbastanza completo con diverse opzioni di invio thread, tutte le solite classi di sincronizzazione e un thread basato su eccezioni molto utile " interrupt " meccanismo. È facilmente estensibile, ben scritto e documentato. L'ho usato su oltre 20 progetti.
Funziona bene anche con qualsiasi * NIX che supporti i thread POSIX e Windows.

Vale la pena dare un'occhiata.

Uso TBB in un progetto. Sembrava essere più facile da usare rispetto ai thread. Esistono attività che possono essere eseguite in parallelo. Un'attività è solo una chiamata alla subroutine parallelizzata. Il bilanciamento del carico viene eseguito automaticamente. Ecco perché lo accetto come libreria di parallelizzazione di livello superiore. Ho raggiunto una velocità 2,5x senza molto lavoro su un processore Intel a 4 core. Ci sono esempi, rispondono alle domande sui forum ed è gestito ed è gratuito.

Vale la pena chiarire che TBB (Threading Building Blocks) è in contrasto con altre alternative (ad esempio funzionalità di concorrenza C ++ 11x). TBB è una libreria portatile e scalabile (non un'estensione del compilatore) che consente di scrivere il codice sotto forma di attività leggere che TBB pianificherà per eseguire il più velocemente possibile sulle risorse della CPU disponibili. Non è progettato il threading di supporto per altri scopi (ad es. Prelazione).

Ho usato TBB per velocizzare l'elaborazione delle immagini esistente per i loop su linee di scansione delle immagini in parallel_for loop (un minimo di 2-4 linee di scansione come dimensione 'grano'). Questo ha avuto molto successo. Richiede che il proprio corpo del ciclo sia (ri) scritto per elaborare un indice arbitrario piuttosto che supporre che ciascun corpo del ciclo sia elaborato in sequenza (ad es. Puntatori che vengono incrementati tra ogni iterazione del ciclo).

Questo è stato un caso abbastanza banale in quanto non c'era alcun archivio condiviso da aggiornare. L'uso delle funzionalità più potenti (ad es. Pipeline) richiederà una reimmaginazione significativa e / o riscrittura del codice esistente, quindi è forse più adatto al nuovo codice.

È un grande vantaggio che questo codice basato su TBB rimanga portatile, non sembra interferire con altri codici altrove nello stesso processo contemporaneamente usando altre strategie di threading e può successivamente essere combinato con strategie di multiprocessing a livelli più alti o più bassi (ad es. il codice TBB parallel_for potrebbe essere chiamato da un filtro in una pipeline di elaborazione multipla TBB).

Hai guardato boost con la sua libreria API thread ?

  

The Threading Building Blocks (TBB) in   la versione open source, (c'è un   nuova versione commerciale, $ 299, non farlo   conoscere ancora le differenze) è GNU   Licenza pubblica generale versione 2 con   una cosiddetta "eccezione di runtime" (quella   è specifico per l'uso solo su   creazione di software gratuito.) Ho visto   altre eccezioni di runtime che tentano   avvicinarsi alla LGPL ma abilitandolo   uso commerciale e collegamento statico a questo   non è il caso.

Secondo questa domanda il threading building block è utilizzabile senza restrizioni copia-sinistra con uso commerciale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top