Mein Code mit Openmp, der "Reduktion" verwendet, gibt die gleichen Ergebnisse von Lauf zu Lauf nicht zurück.Reduzierung in Openmp gibt verschiedene Ergebnisse mit der gleichen Anzahl von Threads in meinem Code zurück
Fall 1: Verwendung von "reduction"
sum = 0;
omp_set_num_threads(4);
#pragma omp parallel for reduction(+:sum)
for(ii = 0; ii < 100; i++)
sum = sum + func(ii);
mit func (ii) hat Nebenwirkungen. In der Tat verwendet func (ii) eine andere Funktion von calcul(), die zu einer Race-Bedingung in paralleler Ausführung führen kann. Ich denke, dass die Funktion calcul() ein Grund für dieses Problem sein kann. Allerdings verwende ich "kritisch", die Ergebnisse sind immer die gleichen, aber diese Lösung ist nicht gut für die Leistung.
Fall 2. Platz: "kritische" mit
sum = 0;
#pragma omp parallel for
for(ii = 0; ii < 100; i++)
{
#pragma omp critical
sum = sum + func(ii);
}
mit der func (ii) Funktion
func(int val)
{
read_file(val);
calcul(); /*calculate something from reading_file(val)*/
return val_fin;
}
Bitte helfen Sie mir, es zu lösen?
Vielen Dank!
Es sieht aus wie das Problem nicht mit dem 'reduction' Teil ist aber in einem Rennen Zustand innerhalb der' func (ii) 'Anruf. Da wir den Code für 'func' oder' calcul' nicht sehen können, ist es schwer mehr zu sagen. –
Hallo Dan, meine Funktion (ii) ist auch kompliziert, dann kann ich Ihnen ihre Kopie vorstellen func (ii) {... lesen (ii); ... Kalkül(); ... Rückgabewert; } – hamalo
Sie müssen nicht die gesamte Funktion posten, gerade genug, um Ihr Problem * neu zu erstellen und Ihre Frage klarzustellen. Siehe [Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels] (http://stackoverflow.com/help/mcve). –