Ich habe Array a
der Größe N mit Zufallszahlen. OpenMP Verwenden Ich möchte die Elemente 0 bis 9 von b
der Größe 10 in A. für jede Zahl Array erhöhen Die Sprache C istParallele Inkrementierung von Array-Elementen mit OpenMP
#pragma omp parallel for
for(i = 0; i < N; i++)
b[a[i]]++;
Leider gibt es offenbar Simultan schreibt in einigen Elementen von b und das Ergebnis ist nicht wie erwartet. Ich habe es versucht, indem ich b auf firstprivate und lastprivate gesetzt habe, aber das half auch nicht.
Die Aufgabe scheint einfach, aber ich weiß nicht, wie es geht, da es keine atomic
für Arrays in OpenMP gibt. Ich könnte ein neues Array für die Anzahl der Threads erstellen und sie dann am Ende zusammenfügen, aber das scheint nicht optimal zu sein.
Welcher wäre der schnellste Weg, um das Auftreten der Zahlen in a
in den Elementen des Arrays b
zu zählen?
Summe unabhängig und dann die Ergebnisse zusammenführen. –
@BrianCain Ich bin mir nicht sicher, was Sie genau meinen. Mit "Summe" meinen Sie das Inkrement? Mit "unabhängig" meinen Sie, ich sollte eine neue private Variable erstellen? Mit Merge meinst du, ich sollte am Ende alle Versionen der privaten Variable aufaddieren? Weil das scheint mir ineffizient zu sein. Können Sie mir mit einem einfachen Codefragment zeigen, was Sie meinen? – Michael
Der Algorithmus ist nicht so einfach wie ich angenommen hatte. Aber letztlich ist es ein Kompromiss und ob es funktioniert, hängt wahrscheinlich vom Verhältnis von N zu "b" Größe ab (ist es wirklich immer 10?). Eine einfachere Alternative besteht darin, eine Reihe von Mutexen zu verwenden. –