I OpenMP auf einer verschachtelten Schleife bin mit derErsatz für #pragma omp kritisch (C++)
#pragma omp parallel shared(vector1) private(i,j)
{
#pragma omp for schedule(dynamic)
for (i = 0; i < vector1.size(); ++i){
//some code here
for (j = 0; j < vector1.size(); ++j){
//some other code goes here
#pragma omp critical
A+=B;
}
C +=A;
}
}
das Problem wie dieses funktioniert hier ist, dass mein Code in der A+=B
Teil eine Menge der Berechnung tut von der Code. Indem ich es kritisch mache, erreiche ich nicht die Beschleunigung, die ich möchte. (In der Tat scheint es einen gewissen Aufwand zu geben, da mein Programm länger braucht, um ausgeführt zu werden, als es sequentiell geschrieben wird).
versuchte ich
#pragma omp reduction private(B) reduction(+:A)
A+=B
mit diesem beschleunigt jedoch die Ausführungszeit scheint, dass es nicht von Rennbedingungen wie die critical
Klausel nicht kümmern, da ich nicht die gleichen Ergebnisse von A. bekommen
Gibt es eine Alternative zu diesem kann ich versuchen?
Es gibt eine Sache, die Sie tun können: posten Sie ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve), denn mit Ihrem Pseudocode können wir nur wenig tun, um Ihnen zu helfen . – Gilles
vielleicht hast du recht, aber in der Zwischenzeit kümmert sich reduction() nicht um die Rennbedingungen, oder? –
Natürlich verhält es sich so, weißt du was "kritisch" und "Reduktion" macht? Sie scheinen nach dem Zufallsprinzip Ideen anzuwenden, die die Bedeutung des Programms völlig verändern. 'A' und' B' sind undefiniert, also ist es ziemlich unmöglich zu erraten, was du mit diesem Ausschnitt meinst. Es gibt kein "Pragma, das sich um Race-Bedingungen kümmert", das ist Handkurbeln, Sie sind dafür verantwortlich, den Code so zu strukturieren, dass er nicht erscheint. I.e. nichts kümmert sich darum, sie werden garantiert nicht erscheinen. – luk32