Я подивився офіційні визначення, але все ще досить розгублений.
firstprivate
: Вказує, що кожен потік повинен мати власний екземпляр змінної, і що змінну слід ініціалізувати зі значенням змінної, оскільки вона існує до паралельної конструкції.
Для мене це дуже схоже на приватне. Я шукав приклади, але, здається, не розумію, чим він особливий або як його можна використовувати.
lastprivate
: Вказує, що версія змінної, що охоплює контекст, встановлюється рівною приватній версії будь-якого потоку, який виконує остаточну ітерацію (конструкція циклу) або останній розділ (#pragma section).
Мені здається, я розумію це трохи краще через такий приклад:
#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];
Отже, у цьому прикладі я розумію, що lastprivate
дозволяє i
повертати за межі циклу останнє значення.
Я щойно почав вивчати OpenMP сьогодні.