Ich habe mir die offiziellen Definitionen angesehen, bin aber immer noch ziemlich verwirrt.
firstprivate
: Gibt an, dass jeder Thread eine eigene Instanz einer Variablen haben soll und dass die Variable mit dem Wert der Variablen initialisiert werden soll, da sie vor dem parallelen Konstrukt vorhanden ist.
Für mich klingt das sehr nach privat. Ich habe nach Beispielen gesucht, aber ich scheine nicht zu verstehen, wie es besonders ist oder wie es verwendet werden kann.
lastprivate
: Gibt an, dass die Version der Variablen des umschließenden Kontexts der privaten Version des Threads entspricht, der die letzte Iteration (For-Loop-Konstrukt) oder den letzten Abschnitt (# Pragma-Abschnitte) ausführt.
Ich habe das Gefühl, dass ich dies aufgrund des folgenden Beispiels etwas besser verstehe:
#pragma omp parallel
{
#pragma omp for lastprivate(i)
for (i=0; i<n-1; i++)
a[i] = b[i] + b[i+1];
}
a[i]=b[i];
In diesem Beispiel verstehe ich also, dass lastprivate
es möglich ist i
, als letzter Wert außerhalb der Schleife zurückgegeben zu werden.
Ich habe heute gerade angefangen, OpenMP zu lernen.
firstprivate
undlastprivate
sind sehr spezielle Fälle vonprivate
. Normalerweise müssen Sie nicht einmal verwendenprivate
(definieren Sie einfach die Variable innerhalb des parallelen Blocks), um möglicherweise den äußeren Bereich zu beschatten. Interessant ist die Verwendung von C ++ - Objekten als automatischefirstprivate
Variablen - sie werden einmal durch Kopierkonstruktion initialisiert und nach dem Block zerstört, und Sie müssen die Anzahl der Threads nicht im Voraus kennen - es werden so viele Kopien erstellt wie möglich erforderlich.private
wird standardmäßig nur einmal pro Thread statt für jede Iteration erstellt. Besonders nützlich, wenn Speicher zugewiesen wird.firstprivate
undlastprivate
sind nur Sonderfälle vonprivate
.Der erste führt dazu, dass Werte aus dem äußeren Kontext in den parallelen Bereich gebracht werden, während der zweite Werte aus dem parallelen Bereich in den äußeren Kontext überträgt.
quelle