2016-10-03 5 views
1

Ich habe Code wie dieser (Pseudo-Code, weil ich nicht mein Programm zeigen kann):parallel_for ppl.h nicht schneller als sequenzielle C++

concurrent_vector a, b, c; 
concurrent_unordered_map mapForResult; 

for(i=0; i<sequenceCount; i++){ 
    variables temp_a, temp_b, temp_c; 
    database->read(&a, &b, &c); 
} 

parallel_for(0, sequenceCount, [](int i){ 
    var aa = a[i]; 
    var bb = b[i]; 
    var cc = c[i]; 

    resultOfFunction = MakeFunction(aa, bb, cc); 

    mapForResults.insert(resultOfFunction); 
}, static_partitioner()); 

Es funktioniert, aber es ist viel langsamer als sequentielle Version. Irgendwelche Ideen warum? Es ist mein erstes Mal mit ppl.h, also kenne ich nicht alle Tipps & Tricks.

+0

Wie verhält sich der Cache zwischen den beiden Loops? Erhalten Sie in der parallelen Version viele Cache-Fehler? – NathanOliver

+0

Wie kann ich es verifizieren? Ich bin Anfänger in C++ und Parallelen. – Queen

+0

Nun, wenn Sie unter Linux sind, können Sie [perf] (http://stackoverflow.com/a/10114325/4342498) verwenden. – NathanOliver

Antwort

0

Jede parallele Version eines Programms benötigt mehr Anweisungen als eine single-threaded Version. Es gibt nur einen unvermeidlichen Aufwand beim Einrichten des Threads und beim Verwalten des Zugriffs auf gemeinsam genutzte Daten. Dies ist normalerweise ein begrenzter Overhead, und die zusätzlichen Anweisungen bedeuten keine zusätzliche Zeit, wenn genügend Kerne zur Verfügung stehen. Einfach gesagt, 10% Overhead ist keine große Sache, wenn Sie 300% zusätzliche Kerne haben.

In diesem Fall könnte sehr klein sein. Das würde bedeuten, dass Sie eine Menge Overhead haben, und Ihre zusätzlichen Kerne verbringen ihre ganze Zeit damit, über mapForResults zu kämpfen.

+0

Leider ist MakeFunction groß. Wenn ich es in einer kleinen Datenbank verwende (etwa 30 Sequenzen), ist es zweimal schneller als sequenziell. Aber wenn ich versuche, es in der Datenbank über 10000 Sequenzen zu verwenden, ist es slooooower. – Queen

+0

Und noch eine Frage: Wenn ich concurrent_vector oder concurrent_unordered_map verwende, kann das auch ein Problem sein? Ich habe es anstelle von Critical_Section gewählt, weil ich dachte, es würde nicht kämpfen. – Queen

+0

"MakeFunction ist groß" ist ein wenig verwirrend - aber dann folgen Sie mit "Datenbank". Durch das Hinzufügen der Wortdatenbank haben Sie Ihre Frage geändert. Vielleicht können Sie weitere Informationen darüber hinzufügen, was diese "MakeFunction" ist und tut. – UKMonkey