Samarqand davlat universiteti intelektual tizimlar va kompyutyer texnalogiyalari fakulteti kompyuter ilmlari va dasturlash texnologiyalari yo


Download 50.02 Kb.
Sana03.04.2023
Hajmi50.02 Kb.
#1322507
Bog'liq
Paralel dasturlash


SHAROF RASHIDOV NOMIDAGI
SAMARQAND DAVLAT UNIVERSITETI
INTELEKTUAL TIZIMLAR VA KOMPYUTYER TEXNALOGIYALARI FAKULTETI


KOMPYUTER ILMLARI VA DASTURLASH TEXNOLOGIYALARI YO’ NALISHI
Parallel dasturlash fanidan

Mustaqil ish
Bajardi: 202- guruh talabasi
___________Faxridinov.U

Tekshirdi:


_________ass. Obloqulov.S

Mavzu:Open mp kutubxonasi.Open mp direktoriyasi.Thread kutubxonasi metodlari.Chrono kutubxonasi metodlari.


Reja:
1.Open mp kutubxonasi va open mp haqida;
2.Thread kutubxonasi metodlari haqida;
3.Chrono kutubxonasi metodlari haqida;
OpenMP umumiy xotira parallel dasturlash uchun standartdir. U direktivalar va pragmalardan iborat bo'lib, ular birgalikda OpenMP Application Pro gramming Interface (OpenMP API) spetsifikatsiyasini belgilaydi. OpenMP-dan foydalanish uchun OpenMP spetsifikatsiyasini qo'llab-quvvatlaydigan va API-ni amalga oshiradigan kompilyator talab qilinadi. GCC Intel C++ Compiler va LLVM Clang kabi ko’plab mashhur kompilyatorlar allaqachon spetsifikatsiyani qo’llab-quvvatlaydi va dasturlarni parallellashtirish uchun ishlatilishi mumkin. OpenMP-ni qo'llab-quvvatlaydigan kompilyatorlar C, C++ va Fortran tillaridan birini yoki bir nechtasini kompilyatsiya qilishlari mumkin. 4-algoritm bo'lak o'lchamlarini hisoblash va iteratsiyalarni taqsimlash uchun AFdagi qadamlarni ko'rsatadi.1-qadam iteratsiyalarni to'plamga ajratadi. Keyinchalik, ajratishning hojati yo'q qadam n, Rn takrorlash qoldi.OpenMP umumiy xotira dasturlash modelidan foydalanadi, ya'ni bajarish bir xil manzil maydoniga ega bo'lgan bitta tugunda amalga oshiriladi. Direktivlar yoki pragmalar dastur qismlarini bevosita parallellashtirish uchun manba kodida oqlangan tarzda ishlatilishi mumkin. Direktivlar kompilyatorga bayonotlar qanday bajarilishini va qaysi qismlar parallel ekanligini aytadi. Keyin kompilyator direktivalarni o'qish orqali ko'p oqimli kodni yaratadi. OpenMP-da dasturni parallellashtirish uchun parallel mintaqalar,ishni almashish, o'zgaruvchan qamrov, tanqidiy hududlar va sinxronizatsiya kabi ko'plab konstruktsiyalar mavjud, ammo biz ish almashish qismiga e'tibor qaratamiz, bu erda tsikl va uning iteratsiyasi iplar orasida bo'linadi. Looplarni parallellashtirish OpenMP ning eng mashhur xususiyatlaridan biridir. Faqat buni qilish for-loopdan oldin C/C++ da bitta satr talab qiladi, ya'ni,
#pragma omp for schedule (runtime)
Shuningdek,foydalanuvchi pragma ichida bandlarni o'rnatishi mumkin,masalan,iplar o'zgaruvchining.o'znusxasiga.ega.yoki.yo'qligini.yoki.tsiklni.qanday.rejalashtirish.kerakligini.tanlash.Spetsifikatsiyada.tavsiflanganidek,C/C++.uchun.ish.almashish-loop konstruktsiyasining aniq sintaksisi,
#pragma omp for [clause[[,]clause]...]new-line for-loops

OpenMP da biz pragma omp parallel kalit so'zidan foydalanib, biz uni parallel qiladigan mintaqani eslatib o'tishimiz kerak . Pragma omp parallel parallelga o'ralgan ishni bajarish uchun qo'shimcha iplarni vilkalash uchun ishlatiladi . Asl ip ip identifikatori 0 bo'lgan asosiy ip sifatida belgilanadi . Parallel mintaqa yaratish uchun kod: 
#include
{
printf("Hello World... from thread = %d\n",
omp_get_thread_num());
}

Yuqoridagi rasmga ko'ra, kompilyator parallel mintaqalar kodiga duch kelganidan so'ng, asosiy ip ( ip identifikatori 0 ga ega bo'lgan ip ) ko'rsatilgan iplar soniga bog'lanadi. Bu erda u 5 ta ipga bo'linadi, chunki eksport OMP_NUM_THREADS=5 buyrug'i yordamida bajariladigan iplar sonini 5 deb ishga tushiramiz. Parallel mintaqadagi butun kod bir vaqtning o'zida barcha oqimlar tomonidan bajariladi. Parallel hudud tugagach, barcha iplar asosiy ipga birlashtiriladi.


OpenMP da biz pragma omp parallel kalit so'zidan foydalanib, biz uni parallel qiladigan mintaqani eslatib o'tishimiz kerak . Pragma omp parallel parallelga o'ralgan ishni bajarish uchun qo'shimcha iplarni vilkalash uchun ishlatiladi . Asl ip ip identifikatori 0 bo'lgan asosiy ip sifatida belgilanadi . Parallel mintaqa yaratish uchun kod: Biz bajariladigan iplar sonini 5 deb belgilaganimiz sababli, 5 ta ip bir xil vaqt nuqtasida bir xil chop etish operatorini bajaradi. Bu erda biz iplarni bajarish tartibini kafolatlay olmaymiz, ya'ni parallel mintaqada bayonotni bajarish tartibi barcha bajarilishlar uchun bir xil bo'lmaydi . Quyidagi rasmda dasturni birinchi marta bajarilayotganda birinchi bo'lib 1-iplik bajariladi, ikkinchi ishga tushirishda esa birinchi navbatda 0-ip tugallanadi. 
#include  
#include
#include  
int main(int argc, char* argv[]){
printf("Hello World... from thread = %d\n",
omp_get_thread_num());
}
Multithreading qo'llab-quvvatlash C+11 da joriy qilingan. C++ 11 dan oldin biz C da POSIX iplari yoki p iplar kutubxonasidan foydalanishimiz kerak edi.Ushbu kutubxona ishni bajargan bo'lsa-da, taqdim etilgan xususiyatlar to'plamining standart tilning yo'qligi jiddiy portativ muammolarni keltirib chiqardi. C++ 11 bularning barchasini yo'q qildi va bizga std::thread ni berdi.Tarmoq sinflari va tegishli funktsiyalar ip sarlavhasi faylida aniqlanadi.std::thread - bu C++ da bitta ipni ifodalovchi ip sinfi. Tarmoqni boshlash uchun biz shunchaki yangi ip ob'ektini yaratishimiz va chaqiriladigan bajaruvchi kodni (ya'ni, chaqiriladigan ob'ektni) ob'ekt konstruktoriga o'tkazishimiz kerak. Ob'ekt yaratilgandan so'ng, chaqiriladigan kodda ko'rsatilgan kodni bajaradigan yangi ish zarrachasi ishga tushiriladi.Qo'ng'iroq qilish mumkin bo'lgan uchtadan biri bo'lishi mumkin Funktsiya ko'rsatkichi Funktsiya ob'ekti Lambda ifodasi Chaqiriladiganni aniqlagandan so'ng, uni konstruktorga o'tkazing.

#include
std::thread thread_object(callable)

Funktsiya ko'rsatkichi yordamida ipni ishga tushirish
Quyidagi kod parchasi bu qanday amalga oshirilishini ko'rsatadi

void foo(param)
{
// Do something
}
std::thread thread_obj(foo, params);

Lambda ifodasi yordamida ipni ishga tushirish
Quyidagi kod parchasi bu qanday amalga oshirilganligini ko'rsatadi

auto f = [](params) {
// Do Something
};
std::thread thread_object(f, params);

Bundan tashqari, lambda funktsiyalarini to'g'ridan-to'g'ri konstruktorga o'tkazishimiz mumkin.

std::thread thread_object([](params) {
// Do Something
};, params);

Funktsiya ob'ektlari yordamida iplarni ishga tushirish
Quyidagi kod parchasi bu qanday amalga oshirilganligini ko'rsatadi

class fn_object_class {
void operator()(params)
{
// Do Something
}
}
std::thread thread_object(fn_object_class(), params)

Mavzular tugashini kutmoqda Mavzu boshlangandan so'ng, biz biron bir chora ko'rishimizdan oldin ip tugashini kutishimiz kerak bo'lishi mumkin. Misol uchun, agar dasturning GUI-ni ishga tushirish vazifasini ish zarrachasiga ajratsak, GUI to'g'ri yuklanganligiga ishonch hosil qilish uchun ish zarrachasi tugashini kutishimiz kerak.Mavzuni kutish uchun std::thread::join() funksiyasidan foydalaning. Bu funksiya joriy ish zarrachasini *this tomonidan aniqlangan ip bajarilishini.tugatguncha.kutishga.majbur.qiladi.Masalan,t1 ipi tugaguniga qadar asosiy ipni blokirovka qilish uchun biz shunday qilamiz

int main(){
std::thread t1(callable);
t1.join();
}

Chrono kutubxonasi sana va vaqt bilan ishlash uchun ishlatiladi. Ushbu kutubxona taymerlar va soatlar turli tizimlarda har xil bo'lishi va shuning uchun vaqt o'tishi bilan aniqlik nuqtai nazaridan yaxshilash uchun yaratilgan. Xrono-ning o'ziga xos jihati shundaki, u vaqt va vaqt nuqtasini ("vaqt nuqtasi") ma'lum soatlardan ajratib, aniq-neytral kontseptsiyani ta'minlaydi.chrono - sarlavha va shuningdek, pastki nomlar maydonining nomi: Ushbu sarlavhadagi barcha elementlar (umumiy_turdagi ixtisoslashuvlardan tashqari) to'g'ridan-to'g'ri std nom maydoni ostida (ko'pgina standart kutubxonalar kabi) emas, balki std: ostida aniqlangan:chrono.nomlar.maydoni.Ushbu sarlavhadagi elementlar vaqt bilan bog'liq. Bu asosan uchta tushuncha yordamida amalga oshiriladi:Davomiylik ob'ekti vaqt oralig'ini daqiqa, ikki soat yoki o'n millisekund kabi hisoblash orqali ifodalaydi. Misol uchun, "42 soniya" 1 soniya vaqt birligining 42 ta belgisidan iborat davomiylik bilan ifodalanishi mumkin.
#include  
#include
int main (){
using namespace std::chrono;
milliseconds mil(1000);
mil = mil*60;
std::cout << "duration (in periods): ";
std::cout << mil.count() << " milliseconds.\n";
std::cout << "duration (in seconds): ";
std::cout<<(mil.count()*milliseconds::period::num/milliseconds::period::den);
std::cout << " seconds.\n"; 
return 0;}

Download 50.02 Kb.

Do'stlaringiz bilan baham:




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