MAVZU: OpenMP TEXNOLOGIYASI VA UNING IMKONIYATLARI
Ishdan maqsad: OpenMP texnologiyasini va uning samarali natijalarini o’rganish
hamda CUDA, OpenCL kabi texnologiyalar bilan taqqoslash va tahlil qilish. OpenMP
texnologiyasini va uning samarali natijalarini o’rganish hamda OpenMP
texnologiyasi yordamida misollar yechish.
Nazariy qism:
OpenMP (Ochiq Multi-Processing) - bu C, C++ va Fortran tillarida ko'p platformali
umumiy xotirali multiprocessing dasturlashni qo'llab-quvvatlaydigan amaliy
dasturlash interfeysi (API) ko'plab
platformalarda, ko'rsatmalar to'plami
arxitekturalarida va operatsion tizimlarda, jumladan Solaris, AIX, FreeBSD , HP-UX,
Linux, macOS va Windows. U ishlash vaqtidagi xatti-harakatlarga ta'sir qiluvchi
kompilyator direktivalari, kutubxona tartiblari va muhit o'zgaruvchilari to'plamidan
iborat.
OpenMP, Arm, AMD, IBM, Intel, Cray, HP, Fujitsu, Nvidia, NEC kabi etakchi
kompyuter uskunalari va dasturiy ta'minot sotuvchilari tomonidan birgalikda
aniqlangan OpenMP Architecture Review Board (yoki OpenMP ARB)
notijorat
texnologiyalar konsortsiumi tomonidan boshqariladi. , Red Hat, Texas Instruments
va Oracle korporatsiyasi
OpenMP portativ, kengaytiriladigan modeldan foydalanadi, bu dasturchilarga
standart ish stoli kompyuteridan superkompyutergacha bo'lgan platformalar uchun
parallel ilovalarni ishlab chiqish uchun oddiy va moslashuvchan interfeysni beradi.
Parallel dasturlashning gibrid modeli bilan yaratilgan dastur OpenMP va Message
Passing Interface (MPI) yordamida kompyuter klasterida ishlashi mumkin, shuning
uchun OpenMP (ko'p yadroli)
tugun ichida parallellik uchun, MPI esa tugunlar
orasidagi parallellik uchun ishlatiladi. . Bundan tashqari, OpenMP ni MPI ga tarjima
qilish va umumiy bo'lmagan xotira tizimlari uchun OpenMP ni kengaytirish uchun
tarqatilgan umumiy xotira tizimlarida OpenMP ni ishga tushirishga harakat qilindi.
OpenMP ko'p ish zarrachalarining amalga oshirilishi bo'lib, birlamchi ip (ketma-ket
bajariladigan
ko'rsatmalar
qatori)
ma'lum
miqdordagi pastki iplarni ajratib turadi va tizim ular
orasida vazifani ajratadigan parallellashtirish
usulidir. Keyin iplar bir vaqtning o'zida ishlaydi, ish
vaqti muhiti iplarni turli protsessorlarga ajratadi.
Parallel ishlash uchun mo'ljallangan kod bo'limi
tegishli ravishda kompilyator direktivasi bilan
belgilanadi, bu bo'lim bajarilishidan
oldin iplarning
shakllanishiga olib keladi. Har bir ipga identifikator
biriktirilgan, uni funksiya yordamida olish mumkin
(omp_get_thread_num()). Tarmoq identifikatori butun son bo'lib, asosiy ip
identifikatori 0 ga teng. Parallellashtirilgan kod bajarilgandan so'ng, iplar dasturning
oxirigacha davom etadigan asosiy ipga qaytadan qo'shiladi.
Odatiy bo'lib, har bir oqim kodning parallellashtirilgan qismini mustaqil ravishda
bajaradi. Ish almashish konstruksiyalari vazifani iplar o'rtasida
taqsimlash uchun
ishlatilishi mumkin, shunda har bir ip kodning ajratilgan qismini bajaradi. Shu tarzda
OpenMP yordamida vazifalar parallelligi va ma'lumotlar parallelligiga erishish
mumkin.
Ish vaqti muhiti foydalanish, mashina yuki va boshqa omillarga qarab
protsessorlarga yo’llarni ajratadi. Ish vaqti muhiti muhit o'zgaruvchilari asosida ish
zarralari sonini belgilashi mumkin yoki kod buni funksiyalar
yordamida amalga
oshirishi mumkin. OpenMP funksiyalari C/C++ da omp.h deb nomlangan sarlavha
fayliga kiritilgan.
1. omp for yoki omp do: sikl konstruksiyalari deb ham ataladigan oqim orasida
sikl iteratsiyalarini ajratish uchun ishlatiladi.
2. bo'limlar: turli mavzularga ketma-ket, lekin mustaqil kod bloklarini belgilash
3. yagona: faqat bitta oqim tomonidan bajariladigan kod blokini ko'rsatish,
oxirida to'siq nazarda tutiladi
4. master: bittaga o'xshaydi, lekin kod bloki faqat asosiy oqim tomonidan
bajariladi va oxirida hech qanday to'siq bo'lmaydi.
Amaliy misollar:
Ishning bir qismini bajarish uchun har bir yo’ldan foydalanib, parallel ravishda katta
massivning qiymatini for takrorlash operatori yordamida ishga tushirish!
int
main
(
int
argc,
char
**
argv)
{
int
a[
100000
];
#pragma omp parallel for
for
(
int
i
=
0
;
i
<
100000
;
i
++
)
{
a[i]
=
2
*
i;
}
return
0
;
}
Endi barcha dasturlash tillarida birinchi o’rganganimiz “Hello word” sozini OMP
kutubxonasi yordamida parallel oqimli
ekranga chop etamiz
#include
#include
int
main
(
void
)
{
#pragma omp parallel
printf(
"Hello, world.