logo

OpenMP dasturi

Yuklangan vaqt:

08.08.2023

Ko'chirishlar soni:

0

Hajmi:

1342.130859375 KB
OpenMP dasturi
Reja
1. KIRISH
2. ASOSIY QISM
2.1. Umumiy xotira dasturlash modeli
          2.2.  OpenMP dasturini kompilyatsiya qilish va ishga tushiris
2.3. OpenMP dasturini monitoring qilish
2.4.  Parallel takrorlash natijalarini birlashtirish
3. XULOSA
4. FOYDALANILGAN ADABIYOTLAR KIRISH
Zamonaviy   texnologiyalar   parallel   texnologiyalar   bir-biridan   dasturlash
tillarida   emas,   balki   parallel   tizimlarni   qurishning   arxitekturaviy   yondashuvlarida
ham farqlanadi.
Masalan,   ba'zi   texnologiyalar   bir   nechta   kompyuterlar   asosida   parallel
dasturlarni qurishni taklif qilsa, boshqalari  bir nechta protsessorli  bitta mashinada
ishlashga imkon beradi.
Uzoq   vaqt   davomida   bir   nechta   kompyuterlarga   asoslangan   tizimlar
ishlatilgan,   ular   taqsimlangan   hisoblash   tizimlariga   tegishli.   Tarqalgan
hisoblashning eng yorqin misoli MPI (Message Passing Interface (xabarni uzatish
interfeysi)) parallel dasturlashda ma'lumotlar almashish interfeysi uchun eng keng
tarqalgan  standart   bo'lib,  ko'plab kompyuter  platformalari   uchun ilovalar   mavjud.
MPI   dasturchiga   mashina   arxitekturasidan   (birgalikda/alohida   xotiraga   ega   bir
protsessorli/ko‘p   protsessorli),   filiallarning   nisbiy   joylashuvidan   (bir   xil
protsessorda   yoki   boshqa   protsessorda)   qat’iy   nazar,   parallel   dastur   doirasida
filiallarning o‘zaro ta’sirining yagona mexanizmini taqdim etadi. birlar).[8]
Bitta   kompyuterda   ishlash   uchun   parallel   dasturlash   tizimlari   o'z
rivojlanishini   nisbatan   yaqinda   boshladi.   Darhaqiqat,   ilovalarni   ishlab   chiqishda
ishlab   chiquvchi   qo'l   ostidagi   resurslar,   ya'ni   bir   nechta   kompyuter   yadrolaridan
foydalanish bilan ishlashni qanday oshirish kerakligi haqidagi savolga duch keladi
va Open MP API dasturchiga yordam beradi. 1997 yilda ishlab chiqilgan OpenMP
texnologiyasi   umumiy   xotiraga   ega   bo'lgan   ko'p   protsessorli   hisoblash
tizimlarining   imkoniyatlaridan   maksimal   darajada   samarali   foydalanish   imkonini
beradi,   bu   esa   protsessorlararo   xabarlarni   ko'p   vaqt   talab   qilmasdan   parallel
oqimlar uchun umumiy ma'lumotlardan foydalanishni ta'minlaydi. 2.1. Umumiy xotira dasturlash modeli
            Dasturchi   nuqtai   nazaridan,   umumiy   xotira   multiprotsessorlari   modeli   1-
rasmda   ko'rsatilganidek,   bitta   asosiy   xotiraga   ega   bo'lgan   bir   qancha   mustaqil
protsessorlarni   o'z   ichiga   oladi.   Har   bir   protsessor   to'g'ridan-to'g'ri   asosiy
xotiradagi ma'lumotlarning istalgan joyiga kirishi mumkin va istalgan vaqtda turli
protsessorlar   turli   ma'lumotlar   bo'yicha   turli   ko'rsatmalarni   bajarishi   mumkin,
chunki   har   bir   protsessor   o'zining   boshqaruv   bloki   tomonidan   boshqariladi.
Flinning parallel tizimlar taksonomiyasidan foydalangan holda, bu model MIMD,
ya'ni bir nechta ko'rsatmalar bir nechta ma'lumotlar deb ataladi.
1-rasm: Umumiy xotirali multiprotsessor modeli.
Mumkin   bo'lgan   maksimal   tezlikka   erishish   uchun   parallel   tizimdan   to'liq
foydalanish muhim ahamiyatga ega bo'ladi.
          OpenMP yordamida ko'p yadroli va umumiy xotira multiprotsessorlarini 
dasturlash.
                  Oddiy   va   umumiy   bo'lishi   uchun   asosiy   xotiraning   ichki   tuzilishi   ushbu
modeldan   tashqarida   qoldirilgan.   Oddiy   va   umumiy   modeldan   foydalanish,
shuningdek, parallel tizim spetsifikatsiyalari ma'lum bo'lganidan keyin ma'lum bir
tizim uchun optimallashtirilishi mumkin bo'lgan portativ dasturlarni loyihalash va
amalga oshirishni soddalashtiradi.
    Ko'pgina   zamonaviy   protsessorlar   ko'p   yadroli   protsessorlardir   va   shuning
uchun ular  yadro deb ataladigan bir nechta mustaqil  hisoblash  bloklaridan iborat.
Bundan tashqari, ushbu protsessorlar (bir vaqtning o'zida) multithreading (SMT) ni
qo'llab-quvvatlaydi, shuning uchun har bir yadro (deyarli) bir vaqtning o'zida iplar
deb   ataladigan   bir   nechta   mustaqil   ko'rsatmalar   oqimini   bajarishi   mumkin.
Dasturchi uchun har bir protsessor ichidagi har bir yadro bir nechta mantiqiy yadro
vazifasini bajaradi, ularning har biri o'z dasturini yoki dastur ichidagi ipni mustaqil
ravishda ishga tushirishga qodir.    Bugungi kunda mobil, ish stoli va server protsessorlari odatda 2 dan 24 gacha
yadrolarni  o'z ichiga oladi  va ko'p ish zarralarini  qo'llab-quvvatlash bilan ular bir
vaqtning   o'zida   4   dan   48   tagacha   oqimlarni   ishga   tushirishlari   mumkin.   Misol
uchun,   ikki   yadroli   mobil   Intel   i7   protsessori   giper-threading   (Intel's   SMT)   2
(jismoniy)   yadrodan   iborat   bo'lib,   4   ta   mantiqiy   yadroni   ta'minlaydi.   Xuddi
shunday,   3.2-rasmda   ko'rsatilganidek,   to'rt   yadroli   Intel   Xeon   protsessori   giper-
threading   bilan   8   ta   mantiqiy   yadroni   va   ikkita   shunday   protsessorli   tizim   16   ta
mantiqiy   yadroni   ta'minlaydi.   Agar   avtobus   yoki   kesh   kabi   ma'lum   resurslardan
umumiy foydalanish bir chetga surilsa, har bir mantiqiy yadro o'z ish zarrachasini
mustaqil   ravishda   bajarishi   mumkin.   Jismoniy   amalga   oshirishdan   qatiy   nazar,
dasturchi   bunday   tizimda   3.1-rasmda   ko'rsatilganidek,   har   biri   individual
protsessor sifatida ishlaydigan 16 ta mantiqiy yadroni o'z ichiga oladi, bu erda n =
16.
3.2- rasm :  Bir   vaqtning   o ' zida   ko ' p   trithreadingni   qo ' llab - quvvatlaydigan   ikkita   to ' rt
yadroli   protsessorli   parallel   tizim   bir   xil   xotiraga   ulangan   16   ta   mantiqiy   yadroni
o ' z   ichiga   oladi .
Ko ' p   yadroli   protsessorlardan   tashqari ,   o ' nlab   yoki   yuzlab   jismoniy
yadrolarni   o ' z   ichiga   olgan   ko ' p   yadroli   protsessorlar   ham   mavjud .   Masalan ,   Intel
Xeon   Phi   bir   vaqtning   o ' zida   240   dan   288   tagacha   ipni   ishga   tushirishga   qodir   60
dan  72  gacha   jismoniy   yadrolarni   ta ' minlaydi .
Zamonaviy   tizimlarning   turli   protsessorlar   yoki   ( mantiqiy )   yadrolar
yordamida   bir   vaqtning   o ' zida   bir   nechta   ish   zarralarini   bajarish   qobiliyati
qimmatga   tushadi .   Alohida   iplar   asosiy   xotiradagi   istalgan   xotira   joyiga   kirishi   va
ko ' rsatmalar   oqimlarini   mustaqil   ravishda   bajarishi   uchun   poyga   holatiga   olib
kelishi   mumkin ,   ya ' ni   natija   asosiy   xotiraning   bir   xil   joyiga   o ' qish   va   yozishning
aniq   vaqtiga   bog ' liq   bo ' lgan   vaziyatga   olib   kelishi   mumkin .   Masalan ,   ikkita   ip   bir
xil   xotira   joyida   saqlangan   qiymatni   biri   1   ga ,   ikkinchisi   esa   oshirishi   kerak   deb
faraz   qilaylik .
Har   bir   ip   qiymatni   o ' qiydi ,   uni   oshiradi   va   uni   qayta   yozadi .   Agar   ushbu
uchta   ko ' rsatma   birinchi   navbatda   bitta   ip   tomonidan ,   keyin   esa   ikkinchisi tomonidan   bajarilsa ,   to ' g ' ri   natija   chiqariladi .   Ammo   iplar   ko ' rsatmalarni   mustaqil
ravishda   bajaradiganligi   sababli ,   har   bir   ip   tomonidan   bajariladigan   ushbu   uchta
ko ' rsatmalarning   ketma - ketligi   3.3- rasmda   ko ' rsatilganidek ,   vaqt   o ' tishi   bilan   bir -
biriga   mos   kelishi   mumkin .   Bunday   vaziyatlarda   natija   ham   noto ' g ' ri ,   ham
aniqlanmagan :   har   ikkala   holatda   ham   xotiradagi   qiymat   1   yoki   2   ga   oshiriladi ,
lekin  1  va  2  ga   emas .
3.3- rasm :  Ikki   ip   asosiy   xotirada   bir   xil   joyda   qiymatni   oshirishga   harakat   qilganda
poyga   holatining   ikkita   misoli .
Poyga   holatini   oldini   olish   uchun   asosiy   xotiradagi   umumiy   manzilga   eksklyuziv
kirish   yordamida   qulflash   yoki   o ' qish - o ' zgartirish - yozish   ko ' rsatmalari   yordamida
atomik   kirish   kabi   mexanizmlar   yordamida   ta ' minlanishi   kerak .   Agar   qulflash
ishlatilsa ,   har   bir   ip   o ' zgartirishdan   oldin   umumiy   xotira   joyiga   kirishni   bloklashi
va  3.4- rasmda   ko ' rsatilganidek ,  keyin   uni   qulfdan   chiqarishi   kerak .  Agar   ip   boshqa
ip   allaqachon   qulflangan   narsani   bloklashga   urinsa ,   u   boshqa   ip   uni   qulfdan
chiqarguncha   kutishi   kerak .   Ushbu   yondashuv   bitta   ipni   kutishga   majbur   qiladi ,
lekin   to ' g ' ri   natijani   kafolatlaydi .
3.4-rasm: Qulflash yordamida 3.3-rasmda ko'rsatilganidek, poyga sharoitlarini 
oldini olish.
              OpenMP   yordamida   ko'p   yadroli   va   umumiy   xotira   multiprotsessorlarini
dasturlash  mantiqiy yadrolarga qaraganda, ba'zi mantiqiy yadrolar ishlamay qoladi
va   tizim   to'liq   foydalanilmaydi.   Agar   mantiqiy   yadrolardan   ko'proq   iplar   mavjud
bo'lsa,   operatsion   tizim   bir   xil   mantiqiy   yadrolarda   ishlaydigan   iplar   orasida   ko'p
vazifalarni   qo'llaydi.   Dasturni   bajarish   jarayonida   operatsion   tizim   yuk   balansini
amalga   oshirishi   mumkin,   ya'ni   barcha   mantiqiy   yadrolardan   bir   xilda
foydalanishga   harakat   qilib,   iplarni   bir   mantiqiy   yadrodan   boshqasiga   o'tkazishi
mumkin.               Ko'p   bosqichli   dastur   turli   xil   dasturlash   tillarida,   turli   xil   kutubxonalar   va
ramkalar   yordamida   yozilishi   mumkin.   Masalan,   UNIX-da   deyarli   har   qanday
munosib   dasturlash   tilida   pthreadlardan   foydalanish   mumkin,   ammo   natijada
olingan   dastur   kompilyator   hal   qilishi   mumkin   bo'lgan   past   darajadagi   tafsilotlar
bilan   to'ldirilgan   va   portativ   emas.   Shuning   uchun,   parallel   dasturlarni   yozishga
bag'ishlangan   narsadan   foydalanish   yaxshiroqdir.   Shunday   narsalardan   biri
OpenMP, umumiy xotira tizimlarida ishga tushiriladigan parallel dasturlarni yozish
uchun   eng   mos   keladigan   parallel   dasturlash   muhitidir.   Bu   boshqa   dasturlash   tili
emas, balki odatda mavjud tilga qo'shimcha hisoblanadi
              OpenMP   ning   amaliy   dasturlash   interfeysi   (API)   to'plamidir.   OpenMP
kompilyator   direktivalari   kompilyatorga   manba   kodidagi   parallellik   haqida
ma'lumot   beradi   va   parallel   kodni   yaratish,   ya'ni   manba   kodining   ko'p   oqimli
tarjimasi   uchun   ko'rsatmalar   beradi.   C/C++   da   direktivalar   har   doim   #pragmalar
sifatida   ifodalanadi.   Yordamchi   funktsiyalar   dasturchilarga   dasturni   bajarish
paytida   parallelizmdan   foydalanish   va   boshqarish   imkonini   beradi.   Shell
o'zgaruvchilari   kompilyatsiya   qilingan   dasturlarni   ma'lum   bir   parallel   tizimga
sozlash imkonini beradi.
OpenMP   [omp]   -   umumiy   xotira   kompyuterlari   uchun   parallel   dasturlarni
yaratish uchun sanoat standarti bo'lgan API. OpenMPning asosiy maqsadi-aylanish
yo'naltirilgan dasturlarni yozishni osonlashtirishdir.Bunday dasturlar tez-tez yuqori
samarali   hisoblash   uchun   yaratiladi.   Bundan   tashqari,   komponentlar   OpenMP
tarkibiga   SPMD,   "master   and   workflow",quvur   liniyasi   kabi   parallel   usullarini
qo'llab-quvvatlash uchun kiritilgan.
OpenMP   juda   muvaffaqiyatli   parallel   dasturlash   tiliga   aylandi.   U   bozorga
kiradigan har bir xotira almashadigan kompyuterda mavjud. Bundan tashqari, Intel
yaqinda   Klasterlarni   qo'llab-quvvatlash   uchun   OpenMP   versiyasini   yaratdi.
OpenMP parallelizmin mavjud ketma-ketlik dasturi parallel holga kelgunicha asta-
sekin qo'shilgan dasturlash uslubini qo'llab-quvvatlaydi.Biroq,bu afzallik OpenMP
ning   eng   zaif   nuqtasidir.   Agar   muvozanat   asta-sekin   qo'shilsa,   dasturchi   dasturni
keng   miqyosda   qayta   qurish   qila   olmaydi,   bu   ko'pincha   maksimal   ishlash   uchun
zarur bo'ladi.
OpenMP doimiy rivojlanayotgan standartdir. OpenMP Architecture Review
Board deb nomlangan sanoat guruhi ushbu tilga yangi kengaytmalar kiritish uchun
muntazam   uchrashuvlar  o'tkazadi.  OpenMP  ning  keyingi  versiyasi  (3.0  versiyasi)
vazifa   navbatini   tashkil   etish   qobiliyatini   o'z   ichiga   oladi.   Bu   esa,   OpenMP-ga
yanada   keng   boshqaruv   tuzilmalarini   boshqarish   va   umumiy   umumiy   recursiv
algoritmlardan foydalanish imkonini beradi.
OpenMP   texnologiyasi   foydalanuvchi   dasturning   parallel   va   ketma-ket   ijro
etilishi   uchun   dasturning   bitta   versiyasiga   ega   bo'lishini   ta'minlashni   maqsad
qiladi. Biroq, faqat parallel rejimda to'g'ri ishlashi yoki ketma-ket rejimda boshqa
natija   beradigan   dasturlarni   yaratish   mumkin.   Bundan   tashqari,   yaxlitlash xatolarining   to'planishi   tufayli   turli   xil   ish   zarrachalaridan   foydalangan   holda
hisoblash natijalari ayrim hollarda farq qilishimumkin.
Ushbu   standart   OpenMP   ARB   notijorat   tashkiloti   tomonidan   ishlab
chiqilgan   (Arxitektura   tadqiqoti   kengashi)   [1],   bu   SMP-arxitektura   va   dasturiy
ta'minotni   ishlab   chiqaruvchi   yirik   kompaniyalarning   vakillari   hisoblanadi.
OpenMP FORTRAN va C / C ++ tillari bilan ishlashni qo'llab-quvvatlaydi. Fortran
tilining   birinchi   spetsifikatsiyasi   oktyabr   1997-yilda   va   C/C++   tilining   1998   yil
oktyabrida   paydo   bo'lishi.   Hozirgi   vaqtda   eng   so'nggi   rasmiy   standart
spetsifikatsiya OpenMP[3] (2008 yil may oyida qabul qilingan).
OpenMP mexanizmlarini ishlatish uchun OpenMP derivatori bilan mos kalit
bilan kompilyatsiya qilishingiz kerak (masalan, icc / ifort -openmp derleyici kaliti,
gcc/gfortran-fopenmp,SunStudio-xopenmp,VisualC++-/openmp,PGI-mp).
Derleyici OpenMP direktivalarini sharhlaydi va parallel kod yaratadi. OpenMP-ni
qo'llamaydigan   kompilyatorlardan   foydalanilganda   OpenMP   direktivlari
qo'shimcha xabarlarsiz e'tiborsizqilinadi.
OpenMP   yordamiga   ega   bo'lgan   kompilyator,   dasturning   parallel   versiyasi
uchun odatiy bo'lgan alohida bloklarni shartli ravishda kompilyatsiya qilish uchun
ishlatilishi mumkin bo'lgan _OPENMP so'lini belgilaydi. Bu so'l yyyym formatida
aniqlanadi, bu erda yyyy va mm - qo'llab-quvvatlanadigan OpenMP standarti qabul
qilingan   yil   va   oy   uchun   raqamlar.   Masalan,   OpenMP   3.0   standartini   qo'llab-
quvvatlaydigan derleyici 2008/05 da _OPENMP ni belgilaydi.
Derivatning   OpenMP   ning   har   qanday   versiyasini   qo'llab-quvvatlashini
tekshirish uchun, shartli derleme ko'rsatmalarini #i fdef yoki #i f ndef yozib olish
kifoya.   C   va   Fortran   dasturlarida   shartli   kompilyatsiya   qilishning   eng   oddiy
ko rinishi quyidagi misolda keltirilgan:ʻ
#include <stdio.h>
 int main(){ 
#if def _OPENMP
printf("OpenlVPis supported!\n"); 
#end if
}
OpenMP   da   parallelizatsiya   dasturiy  matnga   maxsus   ko'rsatmalar   kiritilishi
va yordamchi funktsiyalarni chaqirish orqali aniq amalga oshiriladi. OpenMP dan
foydalanilganda, parallel dasturlashtirilgan SPMD (Single Program Multiple Data)
parallel   dasturiy   modeli   qabul   qilinadi,   uning   ichida   bir   xil   kod   barcha   parallel
iplar uchun ishlatiladi.
OpenMP tuzilishi:
•Direktivlar;
•Funksiyalarkutubxonasi;
•Bir qatoro'zgaruvchilari.
Ushbu tartibda OpenMP texnologiyasining imkoniyatlari ko'rib chiqiladi.
Ushbu standart C90, C99, C ++, Fortran 77, Fortran 90 va Fortran 95 algoritmlari
uchun   OpenMP   foydalanishni   ta'minlaydi.   OpenMP   direktivasining   formatini   va
barcha dasturlarning misollaridan C da taqdim etiladi; Fortran tili uchun OpenMP texnologiyasidan   foydalanish   xususiyatlari   5.8.1-bandda   keltirilgan.   Eng   umumiy
shaklida OpenMP direktivasining formati quyidagicha ifodalanishi mumkin:
#pragma omp <directive_name> [<parametr> [[,] <parametr>] ...]
Direktivning boshlang'ich qismi (#pragma omp) sobit bo'ladi, direktivaning
turi uning nomi (Direktiv_yeni) bilan belgilanadi, har bir direktiv o'zboshimchalik
bilan   parametrlar   soni   bilan   birga   bo'lishi   mumkin   (ingliz   tilida,   OpenMP
direktivasining parametrlari atamalar jumlasidan foydalanadi).
2.2.   OpenMP dasturini kompilyatsiya qilish va ishga tushirish
OpenMP API elementlarining har xil turlarini tasvirlash uchun biz 3.1 rasmda  
oddiy dasturdan boshlaymiz.
 3.1rasm: "Salom dunyo" dasturi, OpenMP uslubi.
Ushbu dastur salomni birinchi bo'lib chiqaradigan bitta MP sifatida boshlanadi. 
Amalga oshirish op parallel direktivasiga yetgandan so'ng, bir nechta qo'shimcha 
MP lar mavjud .
 Ko'p oqimli dasturlarni yozish uchun OpenMP dan foydalanish
OpenMP: parallel hududlar
Dastur ichidagi parallel mintaqa sifatida belgilanadi
#pragma omp parallel [[[,] bandi] ...]
tuzilgan blok
                Iplar   jamoasi   hosil   bo'ladi   va   parallel   direktivasiga   duch   kelgan   ip   bu
jamoaning asosiy ipiga aylanadi. Strukturaviy blok jamoadagi har bir ip tomonidan
bajariladi.   Bu   yuqorida   bitta   kirish   va   pastki   qismida   bitta   chiqish   bo'lgan   bitta
bayonot, ehtimol murakkab yoki boshqa OpenMP konstruktsiyasi. Oxirida yashirin
to'siq   mavjud,   ya'ni   barcha   oqimlar   tugagandan   keyingina   ushbu   direktiv
tomonidan yaratilgan iplar tugatiladi va faqat master bajarishni davom ettiradi.
         Parallel soha, masalan, bandlar ro'yxati bilan aniqlanishi mumkin num_threads(integer) tizimli blokni parallel ravishda bajarishikerak bo'lgan iplar 
sonini belgilaydi.
Omp parallel uchun qo'llaniladigan ba'zi boshqa bandlar keyinroq kiritiladi.
mavjud bilan birga yaratilgan. Barcha iplar, dastlabki  ip va yangi  yaratilgan iplar
birgalikda iplar jamoasini tashkil qiladi. Yangi tashkil etilgan iplar jamoasidagi har
bir   ip   direktivadan   so'ng   darhol   bayonotni   bajaradi:   bu   misolda   u   OpenMP
funksiyasini   omp_get_thread_num   chaqirish   orqali   olingan   yagona   ip   raqamini
chop   etadi.   Barcha   ish   zarralari   buni   bajargandan   so'ng,   omp   parallel   direktivasi
tomonidan yaratilgan ish zarrachalari tugatiladi va dastur bitta yangi satr belgisini
chiqaradigan yakka tartibdagi ish zarrasi sifatida davom etadi va dasturni qaytarish
0 ni bajarish orqali tugatadi.
GNU GCC C/C++ kompilyatoridan foydalangan holda Listing 3.1 da 
ko'rsatilgan dasturni kompilyatsiya qilish va ishga tushirish uchun -fopenmp 
buyruq qatoridan quyidagi tarzda foydalaning:
$ gcc -fopenmp -o salom-dunyo salom-dunyo.c
$ envOMP_NUM_THREADS=8 ./salom-dunyo
(Linux,   macOS   va   MS   Windows   tizimlarida   OpenMP   ni   qanday   ishlashga   oid
ko rsatmalar uchun A ilovasiga qarang.)ʻ
Ushbu   dasturda   mavzular   soni   aniq   ko'rsatilmagan.   Demak,   iplar   soni
OMP_NUM_THREADS   qobiq   o'zgaruvchisining   qiymatiga   mos   keladi.
OMP_NUM_THREADS qiymati 8 ga o'rnatilsa, dastur chop etilishi mumkin
Salom, dunyo: 2 5 1 7 6 0 3 4
OMP_NUM_THREADS   o'rnatilmagan   bo'lsa,   dastur   ishlayotgan   mantiqiy
yadrolar soniga mos keladigan iplar sonini o'rnatadi. Masalan, 2 yadroli va giper-
tortishuvli protsessorda 4 ta ipdan foydalaniladi va 0 dan 3 gacha bo'lgan raqamlar
almashinuvi chop etiladi.
OpenMP yordamida ko'p yadroli va umumiy xotira multiprotsessorlarini dasturlash
OpenMP: iplar sonini boshqarish
Dastur tuzilgandan so'ng, iplar sonini quyidagi qobiq o'zgaruvchilari yordamida 
boshqarish mumkin:
OMP_NUM_THREADS vergul bilan ajratilgan-musbat-ro'yxati-
butun sonlar OMP_THREAD_LIMIT musbat-butun son
Birinchisi,   dastur   foydalanishi   kerak   bo'lgan   ish   zarralari   sonini   belgilaydi   (yoki
parallel   bajarishning   har   bir   ichki   o'rnatilgan   darajasida   qancha   ip   ishlatilishi
kerak).   Ikkinchisi,   dastur   foydalanishi   mumkin   bo'lgan   iplar   sonini   cheklaydi   (va
OMP_NUM_THREADS dan ustunlikka ega). Dastur   ichida   iplar   sonini   boshqarish   uchun   quyidagi   funksiyalardan   foydalanish
mumkin:
void   omp_set_num_threads()   iplar   sonini   aniq   belgilamasdan   keyingi   parallel
hududlarda ishlatiladigan iplar sonini belgilaydi;
int omp_get_num_threads() eng ichki o'rab turgan parallel mintaqaga tegishli joriy
jamoadagi iplar sonini qaytaradi;
int   omp_get_max_threads()   keyingi   parallel   hududlar   uchun   mavjud   bo'lgan
iplarning maksimal sonini qaytaradi;
int   omp_get_thread_num()   joriy   mavzular   jamoasi   ichida   chaqiruvchi   ipning   ip
raqamini qaytaradi.
almashtirish  bosilgan  yagona  standart  chiqish  uchun  raqobat. Shunday  qilib, agar
dastur   bir   necha   marta   ishga   tushirilsa,   har   safar   ip   raqamlarining   boshqa
almashtirilishi chop etilishi mumkin. Urunib ko'r.
2.3. OpenMP dasturini monitoring qilish
  Parallel dasturlarni loyihalash, ishlab chiqish jarayonida parallel algoritmlar va
ularni   qanday   qilib   yaxshiroq   kodlash   haqida   fikr   yuritish   kamdan-kam   hollarda
kifoya   qiladi.   OpenMP   dasturi   aslida   ko'p   yadroli   tizimda   qanday   ishlashini
tushunish   uchun   dasturning   ishlashini   kuzatish   va   o'lchash   yaxshiroqdir.   Bundan
tashqari, bu sizning dasturingiz qancha yadroda ishlashini bilishning eng oddiy va
eng ishonchli usuli.
Keling,   illyustratsiya   sifatida   3.2   rasmdagi   dasturdan   foydalanamiz.   Dastur   bir
nechta   iplarni   ishga   tushiradi,   ularning   har   biri   sodda   va   vaqt   talab   qiluvchi
rekursiv algoritm yordamida hisoblangan bitta Fibonachchi raqamini chop etadi.
Ko'pgina  operatsion  tizimlarda  dasturning  ishlash  vaqtini  o'lchash  odatda  oson.
Masalan,   yuqoridagi   dasturni   kompilyatsiya   qilish   va   uni   Linuxda   time   utility
yordamida ishga tushirish
$ gcc -fopenmp -O2 -o fibonacci fibonacci.c
 Ba'zi Fibonachchi sonilarini hisoblash. $ env OMP_NUM_THREADS=8 marta ./fibonachchi
ba'zi Fibonachchi raqamlarini beradi, so'ngra oxirgi qator sifatida dasturning 
ishlash vaqti haqida ma'lumot beradi:
106,46 haqiqiy 298.45 foydalanuvchi 0,29 tizim
(Linux, macOS va MS Windows-da vaqtni o'lchash va dasturning bajarilishini 
nazorat qilish bo'yicha ko'rsatmalar uchun A ilovasiga qarang.)
Foydalanuvchi   va   tizim   vaqti   barcha   mantiqiy   yadrolar   birgalikda   dasturni
bajarish uchun sarflagan umumiy vaqtga teng. Yuqoridagi misolda foydalanuvchi
va   tizim   vaqtining   yig'indisi   real   vaqtdan,   ya'ni   o'tgan   yoki   devor   soati   vaqtidan
kattaroqdir.   Demak,   dasturning   turli   qismlari   bir   vaqtning   o'zida   bir   nechta
mantiqiy yadrolarda ishlagan bo'lishi kerak.
Aksariyat operatsion tizimlar boshqa ko'rsatkichlar qatorida alohida yadrolar
tomonidan bajarilgan hisoblash miqdorini ko'rsatadigan tizim monitorlarini taqdim
etadi.   Bu   OpenMP   dasturini   ishlab   chiqishda   juda   ma'lumotli   bo'lishi   mumkin,
lekin   ehtiyot   bo'ling,   chunki   ko'pchilik   tizim   monitorlari   individual   mantiqiy
yadrodagi umumiy yukni, ya'ni mantiqiy yadroda ishlaydigan barcha dasturlarning
yukini xabar qiladi.
Ro'yxat   3.2   da   ko'rsatilgan   dastur   boshqa   holatda   bo'sh   turgan   tizimda
ishlayotgan   vaqtda   tizim   monitoridan   foydalanib,   dasturni   bajarish   jarayonida
individual   mantiqiy   yadrolarga   yukni   kuzatish   mumkin.   Mavzular   birin-ketin
tugashi   bilan,   bajarilish   davom   etar   ekan,   individual   mantiqiy   yadrolarga   yuk
qanday tushishini kuzatish mumkin. Amalga oshirishning oxiriga kelib, faqat bitta
ish   zarracha   qolganda,   operatsion   tizim   vaqti-vaqti   bilan   oxirgi   ipni   bir   mantiqiy
yadrodan ikkinchisiga qanday o'tkazishini ko'rish mumkin.
2.4. Parallel takrorlash natijalarini birlashtirish B iz   pa rallelashtirishni     misolidan   boshlaymiz :   chop   etishni   o ' ylab   ko ' ring
1   dan   ba ' zi   bir   foydalanuvchi   tomonidan   belgilangan   qiymatgacha   bo ' lgan   barcha
butun   sonlarni ,  aytaylik .
Parallel dastur 3.3-rasmda  ko'rsatilgan.
3.3-rasm : 1 dan maksimalgacha barcha butun sonlarni alohida tartibda chop etish.
3.3-rasm dagi   dastur   bitta  boshlang'ich   t ip  sifatida   boshlanadi.   Maksimal   qiymat
max o'zgaruvchida o'qiladi va saqlanadi. Keyin ijro eng muhim qismga etib boradi
dasturning,   ya'ni   raqamlarni   chop   etadigan   for   tsikli   (har   bir   oldin   uni   chop
etadigan ip raqami). Lekin omp parallel uchun   6-satrdagi direktiv for tsikli parallel
ravishda bajarilishi kerakligini bildiradi, ya'ni uning   iteratsiyalar o'rtasida bo'linishi
va   barchasida   ishlaydigan   bir   nechta   iplar   tomonidan   bajarilishi   kerak   mavjud
qayta   ishlash   birliklari.   Shunday   qilib,   har   biriga   bir   nechta   qul   iplari   yaratiladi
har   bir   mavjud   ishlov   berish   birligi   yoki   aniq   ko'rsatilgandek   (boshlang'ichdan
minus   ipishlaydi).  
•   parallel   for   tsiklining   iteratsiyalari   har   bir   iteratsiya   bo'lgan   iplar   orasida
bo'linadi . 
•   barcha   iteratsiyalar   bajarilgandan   so'ng,   jamoadagi   barcha   iplar
sinxronlashtiriladi .
oxiridagi yashirin to'siqda va barcha tobe iplar mavjud   tugatildi.   Nihoyat, bajarish
ketma-ket   davom   etadi   va   asosiy   ip   ni   tugatadi   qaytish   0   ni   bajar ish   orqali
dastur.   3.3-rasmda gi   dasturning   bajarilishi   3.5-rasmda   tasvirlangan.   3.3
ro'yxatdagi   dastur   bo'yicha   bir   nechta   kuzatuvlarni   amalga   oshirish   kerak   (va
umuman parallel for döngülerinin bajarilishi). Birinchidan, 3.3 ro'yxatidagi dastur
bunday   qilmaydi   iteratsiyalar   iplar   orasida   qanday   taqsimlanishi   kerakligini
aniqlang   (aniq   rejalashtirish   sifatida   iteratsiyalar   haqida   keyinroq   tavsiflanadi).
Bunday   hollarda,   OpenMP   ilovalarining   ko'pchiligi   butun   iteratsiya   bo'shlig'ini
bo'laklarga bo'ling, bunda barcha iteratsiyalar   subintervalini o'z ichiga olgan har bir
bo'lak   bitta   ip  tomonidan   bajariladi.  Biroq,   bunday  bo'lmasligi   kerakligiga   e'tibor
bering ,   Agar   aniqlanmagan   holda   qoldirilgan   bo'lsa,   bu   ma'lum   bir   OpenMP
dasturiga bog'liq   xohlaganicha qiling.
OpenMP:parallel halqalar
Paralleluchuntsikllar   sifatida   e'lon   qilinganligi   uchun   #pragma   omp [band   [[ , ]
bandi].   .   .   ]for-loops.   Parallel   mintaqada   ishlatilishi   kerak   bo'lgan   ushbu   direktiv
bir yoki bir nechta ichki o'rnatilgan takrorlashlarni bildiradiuchunhalqalar parallel
hududdagi   iplar   jamoasi   tomonidan   bajariladi   (uchun   parallela   yozish   uchun qisqartma hisoblanadiuchun butun parallel  mintaqani  o'z ichiga olgan halqa). Har
biriuchunorasida   halqa   for-looplar bilan   bog'liquchun   ompdirektivada   bo'lishi
kerak  Kanonik shakl .
C da bu shuni anglatadi
• loop o'zgaruvchisi  jamoadagi  har bir ish zarrachasi  uchun shaxsiy qilib qo'yiladi
va (belgisiz) butun son yoki ko'rsatkich bo'lishi kerak,
• loop   o'zgaruvchisi   har   qanday   iteratsiyani   bajarishda   o'zgartirilmasligi   kerak;
• dagi   holatuchunloop   oddiy   munosabat   ifodasi   bo'lishi   kerak,
• dagi   o'sishuchunloop   doimiy   qo'shimcha   ifoda   orqali   o'zgarishlarni   ko'rsatishi
kerak;
• Barcha   bog'langan   halqalarning   iteratsiyalar   soni   eng   tashqisi   boshlanishidan
oldin ma'lum bo'lishi kerak.
A bandi masalan,   parallel   halqani   batafsil   tavsiflovchi   spetsifikatsiya
• qulash   ( butun   son )eng   tashqarida   qancha   ekanligini   aniqlaydiuchunning
halqalari for-looplar
direktiva   bilan   bog'langan   va   shuning   uchun   birga   parallellashtirilgan;
• hozirning   oxirida   yashirin   to'siqni   va   shu   tariqa   sinxronlashni   yo'q   qiladi
for-looplar .Qo'llaniladigan   ba'zi   boshqa   bandlaruchun   parallelkeyinroq
tanishtiriladi.
Ikkinchidan, takrorlash maydoni bo'laklarga bo'lingandan so'ng, alohida bo'lakning
barcha takrorlashlari ke tma-ket, birin-ketin bajariladi v a uchinchidan,
3.5-rasm:   3.3   ro'yxatda   ko'rsatilganidek,   butun   sonlarni   chop   etish   dasturining
bajarilishi.
OpenMP:ma'lumotlarni almashish
Ma'lumot   almashish   bo'yicha   har   xil   bandlardan   foydalanish   mumkin
parallel   Ma'lumotlarning  iplar  o'rtasida   taqsimlanishini   va  qanday  taqsimlanishini
ko'rsatish uchun direktiv:
• umumiy( ro'yxati ) dagi har bir o'zgaruvchi ekanligini bildiradi   ro'yxati   jamoadagi
barcha   ish   zarrachalari   tomonidan   baham   ko'riladi,   ya'ni   barcha   ish   zarrachalari
o'zgaruvchining bir xil nusxasini baham ko'radi;
• shaxsiy   ( ro'yxati )dagi   har   bir   o'zgaruvchi   ekanligini   bildiradi ro'yxati jamoadagi
har   bir   mavzu   uchun   shaxsiydir,   ya'ni   har   bir   ip   o'zgaruvchining   o'z   mahalliy
nusxasiga   ega;
• birinchi   xususiy( ro'yxati )kabidirxususiylekin   sanab   o'tilgan   har   bir   o'zgaruvchi
parallel   mintaqaga   duch   kelganda   o'z   ichiga   olgan   qiymat   bilan   ishga   tushiriladi;
• oxirgi   xususiy( ro'yxati )kabidirxususiylekin   parallel   mintaqa   tugagach,   ro'yxatga olingan har bir o'zgaruvchi parallel mintaqadagi yakuniy qiymati bilan yangilanadi.
Ushbu   bandlarda   sanab   o'tilgan   hech   bir   o'zgaruvchi   boshqa   o'zgaruvchining   bir
qismi   bo'lishi   mumkin   emas.   Agar   boshqacha   ko'rsatilmagan   bo'lsa,
  • Parallel   konstruksiyadan   tashqarida   e'lon   qilingan   avtomatik   o'zgaruvchilar
taqsimlanadi,
  • Parallel   konstruktsiyada   e'lon   qilingan   avtomatik   o'zgaruvchilar   shaxsiydir,
  • statik va dinamik ravishda ajratilgan o'zgaruvchilar  umumiydir. Poyga shartlari,
masalan,   turli   xil   hayot   vaqtlari   natijasidaoxirgi   xususiyo'zgaruvchilar   yoki
umumiy   o'zgaruvchilarni   yangilash,   keyinroq   tasvirlangan   OpenMP
konstruksiyalari yordamida aniq oldini olish kerak.
Parallel uchun loop o'zgaruvchi  har bir ipda bir nechta takroriy takrorlashlar
amalga   oshiriladi,   chunki   har   bir   ipning   o'z   nusxasi   bo'lishi   kerak.i.   Boshqa
tomondan,   o'zgaruvchan   maks   oldin   o'rnatilganidek   barcha   mavzular   bilan
bo'lishish mumkin va faqat parallel mintaqada o'qiladi. Biroq, e'tibor berish kerak
bo'lgan eng muhim  tafsilot  shundaki,  1 dan barcha  butun sonlarni  chop etishning
umumiy   vazifasi. maks hech   qanday   alohida   tartibda   bo'linmaydi N   mutlaqo
mustaqil ning   kichik   vazifalari deyarli   bir   xil   o'lchamda .   Bunday   hollarda
parallellashtirish   ahamiyatsiz   bo'ladi.   Standart   chiqishga   kirish   ketma-
ketlashtirilganligi sababli, butun sonlarni chop etish ko'rinadigan darajada parallel
bo'lmaydi. Shunday qilib, haqiqiy parallel hisoblash misoli quyida keltirilgan.
Vektor   qo'shishni   ko'rib   chiqing.   Uni   amalga   oshiradigan   funktsiya   3.4
ro'yxatda ko'rsatilgan. Uni sinab ko'rish dasturini yozing. Vektor qo'shish umuman
murakkab   hisoblash   emasligi   sababli,   uni   o'lchash   va   kuzatish   uchun   uzun
vektorlardan   foydalaning   va   ko'p   sonli   vektor   qo'shimchalarini   bajaring.
Funktsiya   tuzilishivectAddListing   3.3   da   ko'rsatilgan   butun   sonlarni   chop   etish
dasturiga   juda   o'xshaydi:   oddiy   paralleluchunloop,   bunda   bir   iteratsiya   natijasi
boshqa tsikllar tomonidan ishlab chiqarilgan natijalardan butunlay mustaqil bo'ladi.
Bundan   tashqari,   turli   iteratsiyalar   massivning   turli   elementlariga   kirishadi,   ya'ni
ular butunlay boshqa xotira joylaridan o'qiydilar va yozadilar. Shunday qilib, hech
qanday poyga sharoitlari yuzaga kelishi mumkin emas.
Listing 3.4: Parallel vektor qo'shish.
Endi 1 dan maksimalgacha bo'lgan barcha juft sonlarni alohida chop etishni
o'ylab ko'ring   buyurtma, ikkita ichki o'rnatilgan for looplarini talab qiladigan narsa.
Ikkala   ichki   o'rnatilgan   barcha   iteratsiyalar   kabi   tsikllar   mustaqil   bo'lib,   ikkala
tsiklni   parallellashtirish   mumkin,   ikkinchisi   esa   yo'q.   Bu   direktiv   uchun   omp
parallelni   mo'ljallangan   halqa   oldiga   qo'yish   orqali   erishiladi   parallellashtirish
uchun.   Masalan,   tashqi   for   tsikli   parallellashtirilgan   dastur   3.5   ro'yxatda
ko'rsatilgan.  3.5-rasm: 1 dan butun son juftlarini chop etish maks eng tashqisini parallellashtirish
orqali   alohida   tartibdauchunfaqat   tsikl.   1   dan   butun   sonlar   juftligini   faraz
qiling maks kvadrat   jadval   shaklida   joylashtirilgan.   Agar
4   ta   ip   ishlatiladi   va maks =6,   parallellashtirilgan   tashqi   har   bir   iteratsiyauchun3.6
(a)-rasmda   ko'rsatilganidek,   jadvalning   bir   nechta   satrini   ko'chadan   chiqaradi.
E'tibor bering, birinchi ikkita ipga boshqa ikkita ipga qaraganda ikki baravar ko'p
ish   yuklanadi,   ular   4   ta   mantiqiy   yadroda   ishga   tushirilsa,   birinchi   ikkitasi   ham
tugaguncha   bo'sh   turishga   to'g'ri   keladi.   Biroq,   ichki   o'rnatilgan   halqalarni
parallellashtirishning   yana   ikkita   usuli   mavjud.   Birinchidan,   ikki
uyaliuchuniboralar   yordamida   parallel   holga   keltirish   uchun   siqilish   mumkin
qulash (2)3.6 ro'yxatda ko'rsatilganidek.
  3.6 -rasm :   1   dan   maksimalgacha   butun   son   juftlarini   alohida   tartibda   chop   etish
ikkala for tsiklini birga parallellashtirish orqali.
3.6-rasm: 1 dan 6 gacha bo'lgan barcha juft sonlar 4 ta ip yordamida chop etilishi
kerak bo'lganda muammoli domenning bo'linishi: (a) faqat tashqi bo'lsa.uchunsikl
parallellashtiriladi,   (b)   ifbothuchunilmoqlar   birgalikda   parallellashtiriladi   va   (c)
agar   ikkalasi   hamuchunaylanalar   alohida   parallellashtiriladi.   Bog‘lovchi
tufayliqulash   (2)6-qatorda   kompilyator   ikkita   ichki   joyni   birlashtiradi   halqalarni
biriga aylantiradi va natijada olingan bitta pastadirni parallel qiladi. Tashqiuchun1
dan   looprunning maks va maks ichkiuchun1   dan   1   gacha   bo'lgan   sikllar   maks
shuningdek,   1   dan   gacha   bo'lgan   bitta   tsikl   bilan   almashtiriladi   maks 2.   Hammasi
maks 2   iteratsiyalar   birgalikda   mavjud   iplar   o'rtasida   bo'linadi.   Faqat   bitta   tsikl
parallellashtirilganligi sababli, ya'ni ikkala ichki o'rnatilganning takrorlanishini o'z
ichiga   olganuchun3.6   ro'yxatdagi   dasturning   bajarilishi   hali   ham   3.5-rasmda ko'rsatilgan   sxema   bo'yicha.   Masalan,   agar   maks =6,   3.6   (b)-rasmda
ko'rsatilganidek, yiqilgan bitta halqaning barcha 36 iteratsiyasi 4 ta ipga bo'lingan.
3.5   ro'yxatdagi   dastur   bilan   solishtirganda,   ish   iplar   o'rtasida   teng   taqsimlangan.
Ichimli   halqalarni   parallellashtirishning   yana   bir   usuli   har   birini
parallellashtirishdir. 3.7 da ko'rsatilganidek, alohida-alohida.
  3.7-rasm:   1   dan   maksimalgacha   butun   son   juftlarini   har   bir   ichkariga
parallellashtirish   orqali   alohida   tartibda   chop   etishuchun3.7   ro yxatdaʻ
ko rsatilganidek,   bir   vaqtning   o zida   faol   bo lganidek,   bir   parallel   hududning	
ʻ ʻ ʻ
ikkinchisida   bir   vaqtning   o zida   faol   bo lishi   uchun   avval   parallel   hududlarni	
ʻ ʻ
joylashtirishni yoqish kerak. 
XULOSA
Kurs   ishi   davomida   parallel   dasturlash   texnologiyalari,   xususan   OpenMP
o'rganildi. OpenMP bilan ishlash usullari o'rganildi,  Open MP dan foydalanib ko’p
yadroli   va   umumiy   xotirali   dasturlash   o'rganildi,   OpenMPni   qo'llab-
quvvatlaydigan   kompilyatorlar.   Texnologiyani   o'rganish   jarayonida   olingan
bilimlar amaliy muammolarni hal qilishda amaliyotda qo’llash mumkun.
Bu   yerda   OpenMP   texnologiyasini   o rganish,   OpenMP   texnologiyasidan	
ʻ
foydalangan holda parallellashtirilgan ketma-ket dastur, dastur bilan o zaro ishlash	
ʻ
uchun foydalanuvchi interfeysini yaratish, OpenMP dasturini kompilyatsiya qilish
va   ishga   tushurish,   Open   MP   dasturini   monitoring   qilish   bosqichlarini   ko’rib
chiqdik. FOYDALANGAN ADABIYOTLAR
1. MPICH: High-Performance Portable MPI. https://www.mpich.org/. Accessed 28
Dec2017
2.   Open   MPI:   A   High   Performance   Message   Passing   Library.   https://www.open-
mpi.org/.Accessed28Dec2017
3.   Foster,   I.:   Designing   and   Building   Parallel   Programs:   Concepts   and   Tools   for
Parallel   Software   Engineering.   Addison-Wesley   Longman   Publishing   Co.,   Inc.,
Boston,MA,USA(1995)
4. Gabriel, E., Fagg, G.E., Bosilca, G., Angskun, T., Dongarra, J.J., Squyres, J.M.,
Sahay, V., Kambadur, P., Barrett, B., Lumsdaine, A., Castain, R.H., Daniel, D.J.,
Graham,   R.L.,   Woodall,   T.S.:   Open   MPI:   Goals,   concept,   and   design   of   a   next
generation MPI implementation. In: Proceedings, 11th European PVM/MPI Users’
Group Meeting, pp. 97–104. Budapest, Hungary (2004) Addison-Wesley, Reading,
MA,USA(1979)
5.   Jason   Long:   Hands   On   OpenCL:   An   open   source   two-day   lecture   course   for
teaching and learning OpenCL. https://handsonopencl.github.io/  (2018). Accessed
25Jun2018
6.   Khronos   Group:   OpenCL:   The   open   standard   for   parallel   programming   of
heterogeneous   systems.   https://www.khronos.org/opencl/f   (2000–2018).   Accessed
25Jun2018
7.   MPI   Forum:   MPI:   A   message-passing   interface   standard   (Version   3.1).   Tech.
rep.,   Knoxville,TN,USA(2015)
8.   Munshi,   A.,   Gaster,   B.,   Mattson,   T.G.,   Fung,   J.,   Ginsburg,   D.:   OpenCL
Programming   Guide,   1st   edn.   Addison-Wesley   Professional   (2011)
9.   OpenMP   Architecture   Review   Board:   OpenMP   Application   Programming Interface,   Version   4.5,   November   2015.
http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf   (1997–2015).
Accessed 18 Dec 2017

OpenMP dasturi Reja 1. KIRISH 2. ASOSIY QISM 2.1. Umumiy xotira dasturlash modeli 2.2. OpenMP dasturini kompilyatsiya qilish va ishga tushiris 2.3. OpenMP dasturini monitoring qilish 2.4. Parallel takrorlash natijalarini birlashtirish 3. XULOSA 4. FOYDALANILGAN ADABIYOTLAR

KIRISH Zamonaviy texnologiyalar parallel texnologiyalar bir-biridan dasturlash tillarida emas, balki parallel tizimlarni qurishning arxitekturaviy yondashuvlarida ham farqlanadi. Masalan, ba'zi texnologiyalar bir nechta kompyuterlar asosida parallel dasturlarni qurishni taklif qilsa, boshqalari bir nechta protsessorli bitta mashinada ishlashga imkon beradi. Uzoq vaqt davomida bir nechta kompyuterlarga asoslangan tizimlar ishlatilgan, ular taqsimlangan hisoblash tizimlariga tegishli. Tarqalgan hisoblashning eng yorqin misoli MPI (Message Passing Interface (xabarni uzatish interfeysi)) parallel dasturlashda ma'lumotlar almashish interfeysi uchun eng keng tarqalgan standart bo'lib, ko'plab kompyuter platformalari uchun ilovalar mavjud. MPI dasturchiga mashina arxitekturasidan (birgalikda/alohida xotiraga ega bir protsessorli/ko‘p protsessorli), filiallarning nisbiy joylashuvidan (bir xil protsessorda yoki boshqa protsessorda) qat’iy nazar, parallel dastur doirasida filiallarning o‘zaro ta’sirining yagona mexanizmini taqdim etadi. birlar).[8] Bitta kompyuterda ishlash uchun parallel dasturlash tizimlari o'z rivojlanishini nisbatan yaqinda boshladi. Darhaqiqat, ilovalarni ishlab chiqishda ishlab chiquvchi qo'l ostidagi resurslar, ya'ni bir nechta kompyuter yadrolaridan foydalanish bilan ishlashni qanday oshirish kerakligi haqidagi savolga duch keladi va Open MP API dasturchiga yordam beradi. 1997 yilda ishlab chiqilgan OpenMP texnologiyasi umumiy xotiraga ega bo'lgan ko'p protsessorli hisoblash tizimlarining imkoniyatlaridan maksimal darajada samarali foydalanish imkonini beradi, bu esa protsessorlararo xabarlarni ko'p vaqt talab qilmasdan parallel oqimlar uchun umumiy ma'lumotlardan foydalanishni ta'minlaydi.

2.1. Umumiy xotira dasturlash modeli Dasturchi nuqtai nazaridan, umumiy xotira multiprotsessorlari modeli 1- rasmda ko'rsatilganidek, bitta asosiy xotiraga ega bo'lgan bir qancha mustaqil protsessorlarni o'z ichiga oladi. Har bir protsessor to'g'ridan-to'g'ri asosiy xotiradagi ma'lumotlarning istalgan joyiga kirishi mumkin va istalgan vaqtda turli protsessorlar turli ma'lumotlar bo'yicha turli ko'rsatmalarni bajarishi mumkin, chunki har bir protsessor o'zining boshqaruv bloki tomonidan boshqariladi. Flinning parallel tizimlar taksonomiyasidan foydalangan holda, bu model MIMD, ya'ni bir nechta ko'rsatmalar bir nechta ma'lumotlar deb ataladi. 1-rasm: Umumiy xotirali multiprotsessor modeli. Mumkin bo'lgan maksimal tezlikka erishish uchun parallel tizimdan to'liq foydalanish muhim ahamiyatga ega bo'ladi. OpenMP yordamida ko'p yadroli va umumiy xotira multiprotsessorlarini dasturlash. Oddiy va umumiy bo'lishi uchun asosiy xotiraning ichki tuzilishi ushbu modeldan tashqarida qoldirilgan. Oddiy va umumiy modeldan foydalanish, shuningdek, parallel tizim spetsifikatsiyalari ma'lum bo'lganidan keyin ma'lum bir tizim uchun optimallashtirilishi mumkin bo'lgan portativ dasturlarni loyihalash va amalga oshirishni soddalashtiradi. Ko'pgina zamonaviy protsessorlar ko'p yadroli protsessorlardir va shuning uchun ular yadro deb ataladigan bir nechta mustaqil hisoblash bloklaridan iborat. Bundan tashqari, ushbu protsessorlar (bir vaqtning o'zida) multithreading (SMT) ni qo'llab-quvvatlaydi, shuning uchun har bir yadro (deyarli) bir vaqtning o'zida iplar deb ataladigan bir nechta mustaqil ko'rsatmalar oqimini bajarishi mumkin. Dasturchi uchun har bir protsessor ichidagi har bir yadro bir nechta mantiqiy yadro vazifasini bajaradi, ularning har biri o'z dasturini yoki dastur ichidagi ipni mustaqil ravishda ishga tushirishga qodir.

Bugungi kunda mobil, ish stoli va server protsessorlari odatda 2 dan 24 gacha yadrolarni o'z ichiga oladi va ko'p ish zarralarini qo'llab-quvvatlash bilan ular bir vaqtning o'zida 4 dan 48 tagacha oqimlarni ishga tushirishlari mumkin. Misol uchun, ikki yadroli mobil Intel i7 protsessori giper-threading (Intel's SMT) 2 (jismoniy) yadrodan iborat bo'lib, 4 ta mantiqiy yadroni ta'minlaydi. Xuddi shunday, 3.2-rasmda ko'rsatilganidek, to'rt yadroli Intel Xeon protsessori giper- threading bilan 8 ta mantiqiy yadroni va ikkita shunday protsessorli tizim 16 ta mantiqiy yadroni ta'minlaydi. Agar avtobus yoki kesh kabi ma'lum resurslardan umumiy foydalanish bir chetga surilsa, har bir mantiqiy yadro o'z ish zarrachasini mustaqil ravishda bajarishi mumkin. Jismoniy amalga oshirishdan qatiy nazar, dasturchi bunday tizimda 3.1-rasmda ko'rsatilganidek, har biri individual protsessor sifatida ishlaydigan 16 ta mantiqiy yadroni o'z ichiga oladi, bu erda n = 16. 3.2- rasm : Bir vaqtning o ' zida ko ' p trithreadingni qo ' llab - quvvatlaydigan ikkita to ' rt yadroli protsessorli parallel tizim bir xil xotiraga ulangan 16 ta mantiqiy yadroni o ' z ichiga oladi . Ko ' p yadroli protsessorlardan tashqari , o ' nlab yoki yuzlab jismoniy yadrolarni o ' z ichiga olgan ko ' p yadroli protsessorlar ham mavjud . Masalan , Intel Xeon Phi bir vaqtning o ' zida 240 dan 288 tagacha ipni ishga tushirishga qodir 60 dan 72 gacha jismoniy yadrolarni ta ' minlaydi . Zamonaviy tizimlarning turli protsessorlar yoki ( mantiqiy ) yadrolar yordamida bir vaqtning o ' zida bir nechta ish zarralarini bajarish qobiliyati qimmatga tushadi . Alohida iplar asosiy xotiradagi istalgan xotira joyiga kirishi va ko ' rsatmalar oqimlarini mustaqil ravishda bajarishi uchun poyga holatiga olib kelishi mumkin , ya ' ni natija asosiy xotiraning bir xil joyiga o ' qish va yozishning aniq vaqtiga bog ' liq bo ' lgan vaziyatga olib kelishi mumkin . Masalan , ikkita ip bir xil xotira joyida saqlangan qiymatni biri 1 ga , ikkinchisi esa oshirishi kerak deb faraz qilaylik . Har bir ip qiymatni o ' qiydi , uni oshiradi va uni qayta yozadi . Agar ushbu uchta ko ' rsatma birinchi navbatda bitta ip tomonidan , keyin esa ikkinchisi

tomonidan bajarilsa , to ' g ' ri natija chiqariladi . Ammo iplar ko ' rsatmalarni mustaqil ravishda bajaradiganligi sababli , har bir ip tomonidan bajariladigan ushbu uchta ko ' rsatmalarning ketma - ketligi 3.3- rasmda ko ' rsatilganidek , vaqt o ' tishi bilan bir - biriga mos kelishi mumkin . Bunday vaziyatlarda natija ham noto ' g ' ri , ham aniqlanmagan : har ikkala holatda ham xotiradagi qiymat 1 yoki 2 ga oshiriladi , lekin 1 va 2 ga emas . 3.3- rasm : Ikki ip asosiy xotirada bir xil joyda qiymatni oshirishga harakat qilganda poyga holatining ikkita misoli . Poyga holatini oldini olish uchun asosiy xotiradagi umumiy manzilga eksklyuziv kirish yordamida qulflash yoki o ' qish - o ' zgartirish - yozish ko ' rsatmalari yordamida atomik kirish kabi mexanizmlar yordamida ta ' minlanishi kerak . Agar qulflash ishlatilsa , har bir ip o ' zgartirishdan oldin umumiy xotira joyiga kirishni bloklashi va 3.4- rasmda ko ' rsatilganidek , keyin uni qulfdan chiqarishi kerak . Agar ip boshqa ip allaqachon qulflangan narsani bloklashga urinsa , u boshqa ip uni qulfdan chiqarguncha kutishi kerak . Ushbu yondashuv bitta ipni kutishga majbur qiladi , lekin to ' g ' ri natijani kafolatlaydi . 3.4-rasm: Qulflash yordamida 3.3-rasmda ko'rsatilganidek, poyga sharoitlarini oldini olish. OpenMP yordamida ko'p yadroli va umumiy xotira multiprotsessorlarini dasturlash mantiqiy yadrolarga qaraganda, ba'zi mantiqiy yadrolar ishlamay qoladi va tizim to'liq foydalanilmaydi. Agar mantiqiy yadrolardan ko'proq iplar mavjud bo'lsa, operatsion tizim bir xil mantiqiy yadrolarda ishlaydigan iplar orasida ko'p vazifalarni qo'llaydi. Dasturni bajarish jarayonida operatsion tizim yuk balansini amalga oshirishi mumkin, ya'ni barcha mantiqiy yadrolardan bir xilda foydalanishga harakat qilib, iplarni bir mantiqiy yadrodan boshqasiga o'tkazishi mumkin.