#include
#include
int main(int argc, char *argv[])
{
double start_time, end_time, tick; start_time = omp_get_wtime(); end_time = omp_get_wtime(); tick = omp_get_wtick();
printf("Vaqtni oʻlchash vaqti %lf\n", end_time-start_time);
printf("Taymerning aniqligi %lf\n", tick);
}
11.2. Ma’lumotlar modeli
OpenMPdagi ma’lumotlar modeli barcha oqimlar uchun umumiy xotira maydoni va har bir oqim uchun lokal xotira maydoni mavjudligini nazarda tutadi.
OpenMPda parallel dastur sohalaridagi oʻzgaruvchilar ikkita asosiy sinfga boʻlingan:
shared (birgalikda; barcha oqimlar bir xil oʻzgaruvchini koʻradi);
private (xususiy, shaxsiy; har bir oqim ushbu oʻzgaruvchining oʻz nusxasini koʻradi).
Umumiy oʻzgaruvchi har doim butun qamrov uchun faqat bitta nusxada mavjud va bir xil nom ostida barcha oqimlar uchun mavjud. Lokal oʻzgaruvchini e’lon qilish har bir ish oqimi uchun ushbu oʻzgaruvchining (bir xil turdagi va oʻlchamdagi) oʻziga xos nusxasini paydo boʻlishiga olib keladi. Lokal oʻzgaruvchining qiymatini oqim bilan oʻzgartirish boshqa oqimlardagi bir xil lokal oʻzgaruvchining qiymatining oʻzgarishiga hech qanday ta’sir koʻrsatmaydi.
Agar bir vaqtning oʻzida bir nechta oʻzgaruvchilar sinxronizatsiyani amalga oshirmasdan umumiy oʻzgaruvchining qiymatini yozsa yoki hech boʻlmaganda bitta oqim umumiy oʻzgaruvchining qiymatini oʻqisa va kamida bitta oqim sinxronizatsiyani amalga oshirmasdan ushbu oʻzgaruvchining qiymatini yozsa, u holda ma’lumotlar poygasi deb ataladi. Bunda dasturning bajarilishi natijasini oldindan aytib boʻlmaydi.
Jimlik boʻyicha, parallel sohadan tashqarida yaratilgan barcha oʻzgaruvchilar ushbu sohaga kirishda umumiy boʻlib qoladi. Istisnolar aniq sabablarga koʻra sikldagi iteratsiya hisoblagichlari boʻlgan oʻzgaruvchilardir. Parallel sohada yaratilgan oʻzgaruvchilar jimlik boʻyicha private hisoblanadi. Siz standart parametrdan foydalanib, standart oʻzgaruvchilar sinfini aniq belgilashingiz mumkin. Doimiy ravishda standart qoidalarga tayanish tavsiya etilmaydi, ishonchliligi uchun har doim direktivalarda koʻrsatilgan oʻzgaruvchilar sinflarini aniq tasvirlab berish yaxshiroqdir.
OpenMP opsiyalari private, shared, firstprivate, lastprivate, reduction.
Quyidagi misolda private variantdan foydalanishni koʻrsatadi. Bu misolda n oʻzgaruvchisi parallel qamrovda lokal oʻzgaruvchi sifatida e’lon qilingan. Bu shuni anglatadiki, har bir oqim oʻz n oʻzgaruvchisining oʻziga xos nusxasi bilan ishlaydi, har bir oqimda parallel sohaning boshida esa n oʻzgaruvchisi ishga tushirilmaydi. Dasturni bajarish jarayonida n oʻzgaruvchining qiymati toʻrt xil joyda koʻrsatiladi. Birinchi marta n ning qiymati ketma-ket mintaqada chiqariladi, n oʻzgaruvchisiga 1 qiymati berilgandan soʻng darhol ishga tushirilmagan qiymat amalga oshirishga bogʻliq boʻlishi mumkin. Bundan tashqari, barcha oqimlar omp_get_thread_num() funksiyasi yordamida olingan va n oʻzgaruvchisiga tayinlangan tartib raqamini koʻrsatadi. Parallel soha tugallangandan soʻng, n oʻzgaruvchining qiymati yana bir marta koʻrsatiladi, u 1 ga teng boʻladi (parallel mintaqani bajarishda u oʻzgarmadi).
Do'stlaringiz bilan baham: |