Parallele Aufgaben bekommen bessere Leistungen mit boost::thread als mit ppl oder OpenMP

Ich habe ein C++ - Programm, das könnte parallelisiert werden. Ich verwende Visual Studio 2010, 32-bit-Kompilierung.

Kurz die Struktur des Programms ist im folgenden

#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 globalen Variablen geändert) ich parallelisierte die innere for-Schleife.

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 beschlossen, zu versuchen mehr.

Ich habe versucht, die OpenMP Bibliothek

 #pragma omp parallel for
 for(j=0; j<num_iterations; j++)
 {
     some_computations(results+j);
 } 

Waren die Ergebnisse schlechter als die boost::thread's lieben.

Dann habe ich versucht die ppl Bibliothek und verwendet werden parallel_for():

 Concurrency::parallel_for(0,num_iterations, [=](int j) { 
     some_computations(results+j);
 })

Die Ergebnisse waren die schlimmsten.

Fand ich dieses Verhalten ziemlich überraschend. Da OpenMP und ppl sind konzipiert für die Parallelisierung, ich hätte erwartet, dass bessere Ergebnisse, als boost::thread. Bin ich falsch?

Warum ist boost::thread mir bessere Ergebnisse?

  • Könnten Sie bitte quantifizieren Sie "besser", z.B. bieten die Ausführungszeiten gegenüber der Anzahl der threads? Mit boost::thread Sie erstellen mit 64 threads. OpenPM verwendet ein team von worker-threads, deren Anzahl ist standardmäßig die Anzahl der virtuellen CPUs. PPL verwendet auch einen thread-pool und haben sogar höheren Aufwand als OpenMP, da es implementiert auch die Arbeit balancing.
  • Ich benutzte die gleiche Anzahl (32 oder 64) für jeden Versuch, vielleicht, wie Sie darauf hingewiesen, mit OpenMP und ppl, ich könnte bessere Ergebnisse, wenn Sie die Anzahl der threads gleich der Anzahl der Kerne. Ich werde es versuchen.
  • Es ist fast unmöglich die Frage zu beantworten, wie es stand. Was ist some_computations tun? Ich es möglich, Konflikte irgendwo (die Treffer die verschiedenen Bibliotheken unterschiedlich aus, wenn z.B. openmp hat tatsächlich geringer Aufwand, aber Sie haben eine Menge von Schreibzugriffen auf gemeinsam genutzten cachelines die resultierende cache-Invalidierung frenzy kann tatsächlich machen es langsamer)? Wie lange dauert es, bis laufen durch die parallelisierte block für jede Variante
InformationsquelleAutor 888 | 2013-03-04
Schreibe einen Kommentar