Reduction, firstprivate, lastprivate, copyin parametrlaridan foydalanganda parallel sohaga yoki parallel siklga kirish va chiqishda oʻzgaruvchilar sinflari tayinlanishini alohida qoidalar belgilaydi.
Quyida keltirilgan misol firstprivate variantdan foydalanishni koʻrsatadi. n oʻzgaruvchisi parallel qamrovda firstprivate deb e’lon qilinadi. n qiymati toʻrt xil joyda koʻrsatiladi. Birinchi marta n qiymati ishga tushirilgandan soʻng darhol ketma-ketlikda chop etiladi. Ikkinchi marta barcha oqimlar parallel sohaning boshida n oʻzgaruvchisi nusxasining qiymatini chop etadi va bu qiymat 1 ga teng boʻladi. Keyin, omp_get_thread_num() funksiyasidan foydalanib, barcha oqimlar oʻz tartib raqamini n oʻzgaruvchisiga beradi va yana bir marta n qiymatini koʻrsatadi. Ketma-ket maydonda n qiymati yana chop etiladi, bu yana 1 ga teng boʻladi.
#include
#include
int main(int argc, char *argv[])
{
int n=1;
printf("Boshidagi n qiymati: %d\n", n);
#pragma omp parallel firstprivate(n)
{
printf("Oqimdagi n ning qiymati (kirishda):%d\n", n);
/ * n oʻzgaruvchisini joriy oqim raqamiga belgilang*/
n=omp_get_thread_num();
printf("Har bir oqim uchun n qiymati (chiqish):%d\n", n);
}
printf("Oxirida n qiymati:%d\n", n);
}
threadprivate direktivasi roʻyxatdagi oʻzgaruvchilar har bir oqimning oʻz lokal nusxasiga ega boʻlishi uchun tarqalishi kerakligini koʻrsatadi.
#pragma omp threadprivate(roʻyxat)
threadprivate direktivasi jimlik boʻyicha baham koʻrilgan C statik oʻzgaruvchilari lokal nusxalarini yaratishi mumkin. Global obyektlarning lokal nusxalarini toʻgʻri ishlatish uchun siz dasturning turli qismlarida bir xil oqimlar tomonidan ishlatilishini ta’minlashingiz kerak. Agar lokal nusxalarga turli parallel oqimlarda havola qilingan boʻlsa, ularning qiymatlarini saqlab qolish uchun hech qanday oʻrab turgan parallel sohalar boʻlmasligi kerak, ikkala sohadagi oqimlar soni bir xil boʻlishi kerak va OMP_DYNAMIC oʻzgaruvchisi false dan oʻrnatilgan, birinchi soha boshidan ikkinchisining boshigacha. threadprivate deb e’lon qilingan oʻzgaruvchilarni OpenMP direktivalari variantlarida ishlatib boʻlmaydi, copyin, copyprivate, schedule, numthreads, if bundan mustasno.
Keyingi misolda threadprivate direktivasidan foydalanishni koʻrsatadi. Global oʻzgaruvchi n xususiy oʻzgaruvchi sifatida e’lon qilinadi. n oʻzgaruvchining qiymati toʻrt xil joyda koʻrsatiladi. Birinchi marta barcha oqimlar parallel hududning boshida n oʻzgaruvchisi nusxasining qiymatini chop etganda, bu qiymat asosiy oqimda 1 va qolgan oqimlarda 0 boʻladi. Keyin, omp_get_thread_num() funksiyasidan foydalanib, barcha oqimlar oʻz tartib raqamini n oʻzgaruvchisiga beradi va bu qiymatni chiqaradi. Keyin ketma-ket sohada yana n oʻzgaruvchining qiymati koʻrsatiladi, bu asosiy oqimning tartib raqamiga teng boʻladi, ya’ni 0. Oxirgi marta n oʻzgaruvchining qiymati a da koʻrsatiladi. yangi parallel maydon va har bir lokal nusxaning qiymati saqlanishi kerak.
Do'stlaringiz bilan baham: |