Domanda

Ho intenzione di aggiornare il mio motore grafico personalizzato in modo che sfrutti le CPU multicore. Più precisamente, sto cercando una libreria per parallelizzare i loop.

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 più diffusi. Ed entrambe le librerie sembrano abbastanza semplici da usare.

Quindi, quale dovrei scegliere? Qualcuno ha provato entrambe le librerie e mi può dare alcuni svantaggi e vantaggi dell'utilizzo di entrambe le librerie? Inoltre, con cosa hai scelto di lavorare alla fine?

Grazie,

Adrian

È stato utile?

Soluzione

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

Personalmente ho trovato OpenMP molto semplice da inserire nel codice esistente in cui hai un loop parallelizzabile o un mucchio di sezioni che possono essere eseguite in parallelo. Tuttavia, ciò non è particolarmente utile nel caso in cui sia necessario modificare alcuni dati condivisi, in cui i contenitori simultanei di TBB potrebbero essere esattamente ciò che si desidera.

Se tutto ciò che vuoi è parallelizzare i 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.

Altri suggerimenti

Dal blog del software Intel: Confronta i thread di Windows *, OpenMP *, Intel® Threading Building Blocks per la programmazione parallela

È anche questione di stile - per me TBB è molto simile a C ++, mentre non mi piacciono molto i pragmi di OpenMP (puzza di C un po ', lo userei se dovessi scrivere in C).

Vorrei anche prendere in considerazione le conoscenze e l'esperienza esistenti del team. L'apprendimento di una nuova libreria (specialmente quando si tratta di thread / concorrenza) 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 - portabilità. Ma la licenza potrebbe essere un problema.

  • TBB incorpora alcune belle ricerche provenienti dalla ricerca accademica, ad esempio approccio parallelo di dati ricorsivi .
  • C'è qualche lavoro sulla compatibilità con la cache, per esempio .
  • La lezione del blog Intel sembra davvero interessante.

In generale, ho scoperto che l'uso di TBB richiede molto più tempo per apportare modifiche alla base di codice con un payoff elevato mentre OpenMP offre un payoff rapido ma moderato. Se stai fissando un nuovo modulo da zero e stai pensando a lungo termine, vai con TBB. Se vuoi guadagni piccoli ma immediati vai con OpenMP.

Inoltre, TBB e OpenMP non si escludono a vicenda.

In realtà ho usato entrambi, e la mia impressione generale è che se il tuo algoritmo è abbastanza facile da mettere in parallelo (ad es. loop di dimensioni pari, non troppa interdipendenza dei dati) OpenMP è più facile e abbastanza piacevole con cui lavorare. In effetti, se scopri di poter usare OpenMP, è probabilmente il modo migliore di procedere, 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 di dati in anticipo, ma richiede sicuramente più strutture in anticipo. In più, potrebbe essere migliore nel farti conoscere i bug delle condizioni di gara. Ciò che intendo con questo è che è abbastanza facile in OpenMP abilitare le condizioni di gara non facendo qualcosa di condiviso (o qualunque cosa) che dovrebbe essere. Lo vedi solo quando ottieni risultati cattivi. Penso che sia un po 'meno probabile che si verifichi con TBB.

Nel complesso, la mia preferenza personale era per OpenMP, soprattutto data la sua maggiore espressività con i compiti.

Sì, TBB è molto più compatibile con 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 Lambda e l'oggetto funzione in C ++ 0x possono rendere più facile l'uso di TBB.

In Visual Studio 2008, puoi aggiungere la seguente riga per parallelizzare qualsiasi " per " ciclo continuo. Funziona anche con più nidificati per loop. 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 aver aggiunto il parallelo #pragma omp, entrambi i core sul mio Core 2 Duo sono stati utilizzati alla loro massima capacità, quindi l'utilizzo totale della CPU è passato dal 50% al 100%.

Per quanto ne so, TBB (esiste una versione OpenSource in GPLv2 disponibile) indirizza più l'area C ++ che l'area C. In questi periodi è difficile trovare informazioni specifiche sulla parallelizzazione generale di C ++ e OOP. La maggior parte di esse tratta cose funzionali come c (lo stesso su CUDA o OpenCL). Se hai bisogno del supporto C ++ per la parallelizzazione, scegli TBB!

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