Ich habe ein C++ - Programm, das parallelisiert werden könnte. Ich verwende Visual Studio 2010, 32-Bit-Kompilierung.Parallele Aufgaben erhalten bessere Leistung mit boost :: thread als mit ppl oder OpenMP
Kurz die Struktur des Programms ist die folgende
#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;
}
Da jeder some_computations()
unabhängig ist (einige globale Variablen lesen, aber keine globale Variablen geändert) Ich parallelisiert die innere for
-loop.
Mein erster Versuch war mit boost :: thread,
thread_group group;
for(j=0; j<num_iterations; j++)
{
group.create_thread(boost::bind(&some_computation, this, result+j));
}
group.join_all();
Die Ergebnisse waren gut, aber ich beschloss, mehr zu versuchen.
Ich versuchte, die OpenMP Bibliothek
#pragma omp parallel for
for(j=0; j<num_iterations; j++)
{
some_computations(results+j);
}
Die Ergebnisse schlechter waren als die boost::thread
‚s diejenigen.
Dann habe ich versucht, die ppl Bibliothek und verwendet parallel_for()
:
Concurrency::parallel_for(0,num_iterations, [=](int j) {
some_computations(results+j);
})
Die Ergebnisse der schlechtesten waren.
Ich fand dieses Verhalten ziemlich überraschend. Da OpenMP und ppl für die Parallelisierung ausgelegt sind, hätte ich bessere Ergebnisse erwartet, als boost::thread
. Liege ich falsch?
Warum gibt boost::thread
mir bessere Ergebnisse?
Könnten Sie bitte "besser" quantifizieren, z. die Ausführungszeiten im Vergleich zur Anzahl der Threads angeben? Mit 'boost :: thread' erstellen Sie 64 Threads. OpenPM verwendet ein Team von Worker-Threads, deren Nummer standardmäßig der Anzahl der virtuellen CPUs entspricht. PPL verwendet auch einen Thread-Pool und hat einen noch höheren Overhead als OpenMP, da auch Work Balancing implementiert wird. –
Ich habe die gleiche Nummer (32 oder 64) für jeden Versuch, vielleicht wie Sie hingewiesen, mit OpenMP und ppl konnte ich bessere Ergebnisse erzielen, die Anzahl der Threads gleich der Anzahl der Kerne. Ich werde es versuchen. – 888
Es ist fast unmöglich, die Frage zu beantworten, wie sie steht. Was macht 'some_computations'? Könnte es irgendwo zu Konflikten kommen (was die verschiedenen Bibliotheken unterschiedlich treffen könnte, zum Beispiel wenn openmp tatsächlich einen geringeren Overhead hat, aber Sie viele Shared Cachelines schreiben müssen, kann der resultierende Cache-Invalidierungsrausch es tatsächlich verlangsamen)? Wie lange es dauert, den parallelisierten Block für jede Variante zu durchlaufen – Grizzly