2009-03-05 13 views
41

Ho intenzione di aggiornare il mio motore grafico personalizzato in modo che sfrutti le CPU multicore. Più esattamente, sto cercando una libreria per parallelizzare i loop.Librerie di parallelizzazione C++: blocchi OpenMP e thread

Mi sembra che sia OpenMP che Intel Thread Building Blocks siano molto adatti per il lavoro. Inoltre, entrambi sono supportati dal compilatore C++ di Visual Studio e dalla maggior parte dei compilatori popolari. Ed entrambe le librerie sembrano abbastanza semplici da usare.

Quindi, quale scegliere? Qualcuno ha provato entrambe le librerie e può darmi dei pro e dei contro sull'uso di entrambe le librerie? Inoltre, con cosa hai scelto di lavorare alla fine?

Grazie,

Adrian

+0

Domanda simile: http://stackoverflow.com/questions/326487/multithreaded-image-processing-in-c (ho aggiunto un riferimento a questa domanda nella mia domanda.) – strager

risposta

43

Non ho usato TBB estesamente, ma la mia impressione è che si completano a vicenda più che competere. TBB fornisce contenitori thread-safe e alcuni algoritmi paralleli, mentre OpenMP è più di un modo per parallelizzare il codice esistente.

Personalmente ho trovato OpenMP molto facile da rilasciare nel codice esistente in cui si dispone di un ciclo parallelizzabile o di una serie di sezioni che possono essere eseguite in parallelo. Tuttavia, non ti aiuta in particolare nel caso in cui è necessario modificare alcuni dati condivisi, in cui i contenitori simultanei di TBB potrebbero essere esattamente ciò che desideri.

Se tutto ciò che si desidera è il parallelismo di loop in cui le iterazioni sono indipendenti (o possono essere fatte abbastanza facilmente), sceglierei OpenMP. Se hai bisogno di più interazione tra i thread, penso che TBB possa offrire un po 'di più in questo senso.

+2

Buon punto sul codice esistente. È più facile tappare qualche pragma qua e là. Il collegamento in TBB potrebbe essere più difficile (molto dipende dallo stile del codice esistente) – Anonymous

25

dal blog del software di Intel: Compare Windows* threads, OpenMP*, Intel® Threading Building Blocks for parallel programming

E 'anche la questione di stile - per me TBB è molto C++ come, mentre non mi piace pragma OpenMP che molto (puzza di C un po ', lo userei se dovessi scrivere in C).

Vorrei anche prendere in considerazione le conoscenze e l'esperienza del team. Imparare una nuova libreria (specialmente quando si tratta di threading/simultanea) richiede del tempo. Penso che per ora OpenMP sia più conosciuto e distribuito di TBB (ma questa è solo la mia opinione).

Ancora un altro fattore, ma considerando le piattaforme più comuni, probabilmente non è un problema, la portabilità. Ma la licenza potrebbe essere un problema.

  • TBB incorpora alcune delle belle ricerche provenienti dalla ricerca accademica, ad esempio recursive data parallel approach.
  • C'è un po 'di lavoro sulla cache-friendliness, per example.
  • Le conferenze del blog Intel sembrano davvero interessanti.
+0

Grazie per il collegamento, ma poiché è ospitato sul sito Web di Intel, non mi fiderei davvero di fornire un'opinione completamente obiettiva. Chiaramente hanno scritto l'articolo per promuovere l'uso della propria biblioteca. –

+2

Sì, ho dimenticato l'emoticon da qualche parte nella prima riga;) – Anonymous

15

In generale, ho scoperto che l'utilizzo di TBB richiede molte più perdite di tempo nella codifica base con un elevato profitto, mentre OpenMP offre un guadagno rapido ma moderato. Se stai fissando un nuovo modulo da zero e pensi a lungo termine, fallo con TBB. Se vuoi ottenere guadagni piccoli ma immediati con OpenMP.

Inoltre, TBB e OpenMP non si escludono a vicenda.

5

In realtà ho utilizzato entrambi e la mia impressione generale è che se l'algoritmo è abbastanza facile da realizzare in parallelo (ad esempio cicli di dimensioni pari, non troppa interdipendenza di dati), OpenMP è più facile e molto piacevole da utilizzare. In effetti, se trovi che puoi usare OpenMP, è probabilmente il modo migliore per andare, se sai che la tua piattaforma lo supporterà. Non ho usato le nuove strutture Task di OpenMP, che sono molto più generali delle opzioni di loop e sezione originali.

TBB offre più strutture dati in primo piano, ma sicuramente richiede più in anticipo. Un vantaggio, è potrebbe essere meglio a farti conoscere bug di condizioni di gara. Quello che intendo è che è abbastanza facile in OpenMP abilitare le condizioni di gara non rendendo qualcosa di condiviso (o qualsiasi altra cosa) che dovrebbe essere. Lo vedi solo quando ottieni risultati sbagliati. Penso che questo sia un po 'meno probabile che si verifichi con TBB.

Nel complesso la mia preferenza personale era per OpenMP, soprattutto in considerazione della sua maggiore espressività con le attività.

1

In Visual Studio 2008, è possibile aggiungere la seguente riga per parallelizzare qualsiasi ciclo "for". Funziona anche con loop multipli annidati. Ecco un esempio:

#pragma omp parallel for private(i,j) 
for (i=0; i<num_particles; i++) 
{ 
    p[i].fitness = fitnessFunction(p[i].present); 
    if (p[i].fitness > p[i].pbestFitness) 
    { 
    p[i].pbestFitness = p[i].fitness; 
    for (j=0; j<p[i].numVars; j++) p[i].pbest[j] = p[i].present[j]; 
    } 
} 
gbest = pso_get_best(num_particles, p); 

Dopo abbiamo aggiunto il #pragma omp paralleli, entrambi i core sul mio Core 2 Duo sono stati usati per la loro capacità massima, l'utilizzo della CPU in modo totale è passato da 50% al 100%.

+1

Solo una nota: i cicli annidati funzionano solo se il compilatore lo supporta – Nav

+2

Solo un'altra nota: puoi usare 'omp parallel for' per parallelizzare qualsiasi ** parallelizable * * per ciclo. Ad esempio, non puoi usare 'omp parallel for' se il corpo contiene un codice come questo:' p [j] = p [j] - p [j-1] ' – chus

1

Per quanto ne so, TBB (esiste una versione OpenSource con GPLv2 disponibile) si rivolge più al C++ quindi all'area C. In questi casi è difficile trovare informazioni specifiche sulla parallelizzazione di C++ e di OOP generica. La maggior parte degli argomenti funzionali come c (la stessa su CUDA o OpenCL). Se hai bisogno del supporto C++ per la parallelizzazione, vai su TBB!

+0

TBB ora usa la licenza Apache ... – Jeff

2

Sì, TBB è molto più C++, mentre OpenMP è più appropriato per il codice C in stile FORTRAN dato il suo design. La nuova funzione di attività in OpenMP sembra molto interessante, mentre allo stesso tempo il Lambda e l'oggetto funzione in C++ 0x possono rendere più semplice l'utilizzo di TBB.