Mavzu: Intel OpenMP kutubxonasi bilan tanishish va uning yordamida parallel dasturlar tuzish
Ishning maqsadi: Intel OpenMP kutubxonasidan foydalanib C++ tilida parallel dasturlar tuzish ko‘nikmasini egallash.
USLUBIY KO‘RSATMALAR Turli xil ko’rinishdagi parallel hisoblash tizimlari mavjud-ko’p yadroli/protsessorli kompyuterlar, klasterlar, videokartali tizimlar, dasturlanadigan integral sxemalar va b.
OpenMP-C,C++,Fortran tillari uchun parallel dastur yaratishga mo’ljallangan standart kutubxona hisoblanadi. OpenMP faqat umumiy xotirali arxitekturada ishlaydi.
OpenMP kutubxonasi faqatgina umumiy xotirali tizimlar uchun dasturlashga mo’ljallangan. Shuning uchun oqimlar parallelizmidan foydalaniladi. Oqimlar yagona jarayon ichida yaratiladi va o’zining xususiy xotirasiga ega bo’ladi. Bundan tashqari barcha oqimlar protsessor xotirasiga murojaat qilish imkoniga ega.
OpenMP da xotira modeli OpenMP kutubxonasidan foydalanish uchun “omp.h” sarlavhasini dastur kodiga qo’shish zarur. Dastur ishga tushirilgandan so’ng ketma-ket bajariluvchi yagona jarayon yaratiladi va #pragma omp parallel direktivali soha uchrashi bilan jarayon bir nechta parallel oqimlarni hosil qiladi. Bunda oqimlarning sonini ko’rsatish mumkin. Jimlik holati bo’yicha oqimlar soni hisoblash tizmi yadrolari soniga teng bo’ladi. Dastur kodida parallel soha figurali qavslar bilan chegaralanadi. Soha tugashi bilan oqimlar o’chirib yuboriladi.
Qora chiziqlar bilan oqimlarning yashash davri ko’rsatilgan, qizil chiziqlar bilan ularning yaratilish davri tasvirlangan. Ko’rinib turibdiki, barcha oqimlar jarayon ishining barcha davrida mavjud bitta (asosiy) oqimdan yaratiladi. Bunday oqim OpenMP da master deb ataladi, qolgan barcha oqimlar ko’p marta yaratiladi va o’chiriladi. Shuni qayd etish joizki, parallel direktivasi ichki joylashtirilgan bo’lishi mumkin, buning uchun sozlashlarga bog’liq ravishda ichki oqim yaratish mumkin.
Sinxronizatsiya-kretik seksiyalar,atomic,barrier Parallel direktivasigacha bo’lgan barcha o’zgaruvchilar barcha oqimlar uchun umumiy hisoblanadi. Oqim ichida yaratilgan o’zgaruvchilar lokal(private) bo’ladi va faqat shu qoimga tegishli bo’ladi. Bir vaqtda bir necha oqimlar yordamida umumiy o’zgaruvchini qiymatini o’zgartirish uchun oqimlar o’rtasida musobaqa yuzaga keladi-bu muammo va uni batafsil qaramasdan o’tkazib yuborib bo’lmaydi. Bunday muammo bitta oqim umumiy o’zgaruvchining qiymatini o’qiyotgan vaqtda ikkinchi oqim uni qiyamtini o’zgartirayotgan bo’ladi.
Vaziyatni quyidagi misol orqali tushuntiramiz:
#include "omp.h"
Dasturda barcha oqimlar uchun umumiy bo’lgan value o’zgaruvchisi tavsiflangan. Har bir oqim o’zgaruvchining qiymatini oshiradi va hosil bo’lgan natijani ekranga chiqaradi. Mazkur dasturni ikki yadroli kompyuterda ishga tushirsak natija quyidagicha bo’ladi:
Dastur natijasidan ko’rinib turibdiki, dastlab har bir oqim o’zgaruvchining qiymatini oshiradi, so’ngra navbatma-navbat natijani ekranga chiqaradi (buning uchun ularning har biri qiymatni yana bir marta oshiradi), llekin ba’zi hollarda bajarilish tartibi boshqacha bo’ladi. Mazku misolda bizni qiziqtirgan narsa shuki, value o’zgaruvchisining qiymatini bir vaqtda oshirish-dasturning xulq-atvori yaxshi va faqat bir marta oshiriladi yoki umuman dastur ishi salbiy natija bilan tugaydi.
Mazkur muammoni yechish uchun critical direktivasidan foydalaniladi. Uning foydalanilishiga misol yuqorida keltirilgan. Bu yerda taqsimlangan resurs faqatgina xotira emas balki, konsol hamdir.
Kritik seksiyada bir vaqt momentida faqat bitta oqim joylashadi qolganlari uni bo’shashini kutadi.
OpenMP kutubxonasi yordamida parallel dastur tuzish uchun, dasturni dastlab ketma-ket ko’rinishda tuzib chiqish kerak, so’ngra uni OpenMP direktivalari yordamida parallellashtirish kerak.
Ma’lumki, dasturning bajarilish vaqtining katta qismi sikl operatorida kechadi. Shuning uchun OpenMPda maxsus parallel sikl direktivasi mavjud. Quyida ikkita misol yordamida mazkur siklni parallellashtirishni ko’rib chiqamiz:
1-misol. Massiv elementlari yig’indisini hisoblash.
2-misol. To’rtburchaklar metodi yordmida integralni hisoblash.
1.Massiv elementlari yig’indisini hisoblash Dastlab ketma-ket bajariluvchi sum_arr funksiyasini tuzib olamiz:
Funksiyadagi iteratsiyani oqimlarga taqsimlash mumkin. Har bir oqim yig’indining bir qismini hisoblaydi va oxirida sinxroniztasiyalanadi va natijalar birlashtiriladi.
3-qatorda parallel direktivasi figurali qavslar ichiga olingan parallel hisoblash sohasini beradi.
num_threads xususiyati orqali yaratiladigan oqimlar soni belgilanadi. Bizning misolda oqimlar soni 2 ga teng. Oqimlardan lokal o’zgaruvchilar yoki bo’lingan o’zgaruvchilar tarzida foydalanish mumkin. Bo’linadigan o’zgaruvchilar barcha oqimlar uchun umumiy hisoblanadi. Ular bilan ehtiyot bo’lib ishlash lozim. Barcha konstantalar bo’linadigan hisoblandi. Bizning misolimizda bu a va n o’zgaruvchilaridir.
2-misol. To’rtburchaklar metodi yordmaida aniq integralni hisoblash.