Чим firstprivate і lastprivate відрізняються від приватних речень у OpenMP?


78

Я подивився офіційні визначення, але все ще досить розгублений.

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 сьогодні.

Відповіді:


156

privateзмінні не ініціалізуються, тобто вони починаються з випадкових значень, як будь-яка інша локальна автоматична змінна (і вони часто реалізуються за допомогою автоматичних змінних у стеку кожного потоку). Візьмемо цю просту програму як приклад:

За допомогою чотирьох потоків виводиться щось на зразок:

thread 0: i = 0
thread 3: i = 32717
thread 1: i = 32717
thread 2: i = 1
i = 10

(another run of the same program)

thread 2: i = 1
thread 1: i = 1
thread 0: i = 0
thread 3: i = 32657
i = 10

Це наочно демонструє, що значення iвипадкового (не ініціалізованого) всередині паралельної області і що будь-які зміни до нього не видно після паралельної області (тобто змінна зберігає своє значення перед входом в область).

Якщо iзроблено firstprivate, тоді воно ініціалізується зі значенням, яке воно має перед паралельною областю:

thread 2: i = 10
thread 0: i = 10
thread 3: i = 10
thread 1: i = 10
i = 10

Досі зміни значення iвсередині паралельної області після неї не видно.

Ви вже знаєте про це lastprivate(і це не стосується простої демонстраційної програми, оскільки в ній відсутні конструкції спільного використання).

Так що так, firstprivateі lastprivateце лише особливі випадки private. Перший призводить до введення значень із зовнішнього контексту у паралельну область, тоді як другий передає значення з паралельного регіону у зовнішній контекст. Обґрунтування цих класів обміну даними полягає в тому, що всередині паралельної області всі приватні змінні затінюють ті із зовнішнього контексту, тобто неможливо використовувати операцію присвоєння для модифікації зовнішнього значення iзсередини паралельної області.


5

firstprivateі lastprivateє лише особливими випадками private.

Перший призводить до введення значень із зовнішнього контексту у паралельну область, тоді як другий передає значення з паралельного регіону у зовнішній контекст.


Ви могли б надати будь-яку довідку щодо цього?
J. Chomel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.