Czym różni się firstPrivate i lastprivate od klauzul prywatnych w OpenMP?
Przejrzałem oficjalne definicje, ale nadal jestem zdezorientowany.
firstprivate
: Określa, że każdy wątek powinien mieć własne wystąpienie zmiennej, a zmienna powinna być zainicjowana wartością zmiennej, ponieważ istnieje przed konstrukcją równoległą.
Dla mnie brzmi to bardzo prywatnie. Szukałem przykładów, ale wydaje mi się, że nie rozumiem, jak to jest wyjątkowe i jak można je wykorzystać.
lastprivate
: Określa, że otaczająca wersja kontekstu zmiennej jest równa prywatnej wersji dowolnego wątku wykonującego ostatnią iterację (dla konstrukcji pętli) lub ostatniej sekcji (sekcje #pragma).
Czuję, że rozumiem to nieco lepiej z powodu następującego przykładu:
#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];
W tym przykładzie rozumiem tolastprivate
pozwala nai
być zwróconym poza pętlą jako ostatnia wartość.
Właśnie dzisiaj zacząłem uczyć się OpenMP.