G‘afarov, A. F. Galimyanov parallel hisobiyotlar qo'llanma Qozon


Download 1.46 Mb.
bet77/85
Sana24.12.2022
Hajmi1.46 Mb.
#1062519
1   ...   73   74   75   76   77   78   79   80   ...   85
Bog'liq
ParVychGafGal (1)

omp_set_num_threads() muhit o'zgaruvchisining qiymatini qayta yozadi Ishga tushirishdan oldin sozlanishi mumkin bo'lgan OMP_NUM_THREADS dasturlari.


8.6. OpenMP-da ma'lumotlarga bog'liqlik

Loop parallel bo'lishi uchun, bu ish


tsiklning bir iteratsiyasida bajarilgan ish boshqasiga bog'liq bo'lmasligi kerak iteratsiyalar. Boshqacha qilib aytganda, tsiklning takrorlanishi mustaqil bo'lishi kerak. Ba'zan kodni biroz qayta yozish orqali ma'lumotlarga bog'liqlikdan xalos bo'lishingiz mumkin:
for(i=1; i<8; i++) a[i] = c*a[i-1];
Bu erda qaramlik mavjud.
for(i=1; i<9; i+=2) a[i] = c*a[i-1];
Hech qanday qaramlik yo'q.


Bayonot 1
Faqat bitta iteratsiyada yozilgan o'zgaruvchilar va
ularning qiymatini boshqasiga o'qish ma'lumotlarga bog'liqlikni yaratadi.
133

Machine Translated by Google
Bayonot 2
Faqat umumiy o'zgaruvchilar ma'lumotlarga bog'liqlikni yaratishi mumkin. Natija. Agar o'zgaruvchi xususiy deb e'lon qilinmasa, u shunday bo'lishi mumkin birgalikda va ma'lumotlarga qaramlikka olib keladi.
for(i=0; i<1000; i++){ x = cos(a[i]);
b[i] = sqrt(x*c);
}

Looplar ichidagi funksiya chaqiruvlari keng tarqalgan. Biroq, bunday tsikllar parallel qilish mumkin. Buning uchun dasturchi funksiya yasashi kerak parametrlarning qiymatidan tashqari tashqi ma'lumotlardan mustaqil. Funktsiyada shuningdek, statik o'zgaruvchilar bo'lmasligi kerak (statik).


double foo(double *a, double *b, int i){
// Bog'liqlik mavjud

...
qaytish 0,345*(a[i] + b[2*i]*C);


}
ikki baravar (ikkita a, ikki b){
// Bog'liqlik yo'q

qaytish 0,345*(a + b*C);


}

Ba'zida bitta massivning indekslari bo'lishi kerak bo'lgan vaziyatlar yuzaga keladi


boshqa massivda saqlang.




for(i=0; i i++){ b[i] = c*a[indx1[i]];
}
for(i=0; i i++){ b[indx2[i]] = sqrt(a[i]);
}
134
Machine Translated by Google
Yuqoridagi misolda, agar indx1[i] har birida i ga teng bo'lmasa iteratsiyalar, ya'ni ma'lumotlarga bog'liqlik. Indx2 massivida mavjud bo'lsa takrorlashlar, keyin tsiklda takrorlashlarning ma'lumotlarga bog'liqligi mavjud.
Shartli chiqishga ega bo'lgan pastadirlarga ta'sir qilmaslik kerak parallellashtirish, chunki bu tsikllar tartibni talab qiladi
ijro.


for(i=0; i<1000; i++){ b[i] = sqrt(cos(a[i])*c); if(b[i]>epsilon)
sindirish;


}
Keling, yana bir misolni ko'rib chiqaylik:
uchun(k=0; k k++) for(i=0; i i++) uchun(j=0; j j++) a[i][j] += b[i][k]*c[k,j];
Agar tashqi pastadir parallellashtirilgan bo'lsa, unda bog'liqlik
ma'lumotlar - a[i][j]. Ushbu holatni to'g'irlash uchun k ga o'tish mumkin

uni ichki holga keltiring.


for(i=0; i i++) uchun(j=0; j j++) uchun(k=0; k k++) a[i][j] += b[i][k]*c[k,j];
Ba'zan koddagi ma'lumotlarga bog'liqlik mavjudligini aniqlash qiyin va
keyin kompilyator dasturchiga yordamga kelishi mumkin.

Download 1.46 Mb.

Do'stlaringiz bilan baham:
1   ...   73   74   75   76   77   78   79   80   ...   85




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling