Ho un programma C++ che potrebbe essere parallelizzato. Sto usando Visual Studio 2010, compilation a 32 bit.I task paralleli ottengono prestazioni migliori con boost :: thread rispetto a ppl o OpenMP
In breve la struttura del programma è il seguente
#define num_iterations 64 //some number
struct result
{
//some stuff
}
result best_result=initial_bad_result;
for(i=0; i<many_times; i++)
{
result *results[num_iterations];
for(j=0; j<num_iterations; j++)
{
some_computations(results+j);
}
// update best_result;
}
Poiché ciascuna some_computations()
è indipendente (alcune variabili globali leggere, ma nessuna variabile globale modificate) I parallelizzata interno for
-loop.
Il mio primo tentativo è stato con boost :: filo,
thread_group group;
for(j=0; j<num_iterations; j++)
{
group.create_thread(boost::bind(&some_computation, this, result+j));
}
group.join_all();
I risultati sono stati buoni, ma ho deciso di provare di più.
Ho provato il biblioteca OpenMP
#pragma omp parallel for
for(j=0; j<num_iterations; j++)
{
some_computations(results+j);
}
I risultati sono stati peggiori di quelli s' il boost::thread
.
Poi ho provato il ppl biblioteca e utilizzato parallel_for()
:
Concurrency::parallel_for(0,num_iterations, [=](int j) {
some_computations(results+j);
})
I risultati sono stati i peggiori.
Ho trovato questo comportamento abbastanza sorprendente. Poiché OpenMP e ppl sono progettati per la parallelizzazione, mi sarei aspettato risultati migliori rispetto a boost::thread
. Ho sbagliato?
Perché boost::thread
mi dà risultati migliori?
Potrebbe per favore quantificare "migliore", ad es. fornire tempi di esecuzione rispetto al numero di thread? Con 'boost :: thread' stai creando 64 thread. OpenPM utilizza un gruppo di thread di lavoro il cui numero predefinito è il numero di CPU virtuali. PPL utilizza anche un pool di thread e ha un overhead ancora maggiore rispetto a OpenMP poiché implementa anche il bilanciamento del lavoro. –
Ho usato lo stesso numero (32 o 64) per ogni tentativo, forse come hai fatto notare, con OpenMP e ppl ho potuto ottenere risultati migliori impostando il numero di thread uguale al numero di core. Ci proverò. – 888
È quasi impossibile rispondere alla domanda così com'è. Cosa sta facendo 'some_computations'? C'è una possibile contesa da qualche parte (che potrebbe colpire le diverse librerie in modo diverso, ad esempio se openmp ha effettivamente un overhead più basso, ma si hanno molte scritture sulla cache condivisa, la frenesia di invalidazione della cache risultante potrebbe renderla più lenta)? Quanto tempo ci vuole per percorrere il blocco parallelizzato per ogni variante – Grizzly