Laboratoriya ishi №2 Openmp parallellashtirish kutubxonasi bilan tanishish va uning yordamida parallel dasturlar tuzush

|
Laboratoriya ishi №2 Openmp parallellashtirish kutubxonasi bilan tanishish va uning yordamida parallel dasturlar tuzush
|
bet | 1/2 | Sana | 14.05.2024 | Hajmi | 0,49 Mb. | | #232952 |
Bog'liq Amaliy ish 2 (1)
Laboratoriya ishi №2
OpenMP parallellashtirish kutubxonasi bilan tanishish va uning yordamida parallel dasturlar tuzush
1.Ishni bajarishdan maqsad: Parallelashtirishning zamonaviy instrumental vositasi hisoblangan OpenMP kutubxonasi imkoniyatlarini o'rganish va uning yordamida parallel dasturlar tuzush ko'nikmasini hosil qilish.
2.Nazariy qisim
OpenMP(Open Multi - Processing) - ko‘p oqimli ilovalarni yaratish uchun mo‘ljallangan amaliy dasturlashning interfeysi bo‘lib, asosan umumiy xotiraga ega bo‘lgan parallel hisoblash tizimlari uchun ishlab chiqilgan. OpenMP kompilyatorlar va maxsus funksiyalar kutubxonasi uchun direktivalar to‘plamidan iborat. OpenMP standarti yaqin 15 yil ichida umumiy xotiraga ega arxitekturalarga qo‘llanilgan holda yaratilgan.So‘nggi yillarda taqsimlangan xotirali parallel hisoblash tizimlari uchun OpenMP standartining kengaytirilgan holda ishlab chiqilmoqda. 2005 - yilning oxirida Intel kompaniyasi Cluster OpenMP mahsulotini taqdim etdi, unda kengaytirilgan OpenMP ishlab chiqilgan bo‘lib taqsimlangan xotirali parallel hisoblash tizimlari uchun mo‘ljallangan.
OpenMP spetsifikatsiyasini hisoblash va dasturlash texnikasi bo‘yicha bir nechta yirik ishlab chiqaruvchi kompaniyalar (Intel, Hewlett-Packard, Silicon Graphics, Sun, IBM, Fujitsu, Hitachi, Siemens, Bull) yaratishmoqda, ularni OpenMP Architecture Review Board(ARB) deb nomlangan notijorat korxonasi tomonidan boshqariladi.
OpenMP ko‘p oqimli ilovalarni tez va yengil yaratishni Fortran va C/C++ algoritmik tillarda amalga oshiradi. OpenMP ning birinchi versiyasi 1997 - yilda Fortran tili uchun yaratilgan. C/C++ dasturlash tillari uchun esa 1998 - yilda yaratilgan. 2008 - yilda esa OpenMP ning 3.0 versiyasi taqdim etildi.
OpenMP da parallel va ketma – ketlik . Parallel muhitga kirilgandan so‘ng yangi OMP_NUM_THREADS-1 oqimlar yaratiladi, har bir oqim o‘zining unikal nomeriga ega bo‘ladi, bunda dastlabki oqim 0 nomer bilan belgialanadi va u bosh oqim (master) bo‘ladi. Qolgan oqimlar raqam sifatida butun sonlar 1 dan OMP_NUM_THREADS – 1gacha bo‘ladi. Oqimlar soni belgilangan parallel muhitda bajariladi va ushbu muhitdan chiqib ketishgacha o‘zgarmay qoladi. Parallel muhitdan chiqib ketgandan so‘ng sinxronizatsiya yordamida bosh oqimdan boshqa barcha oqimlar yo‘q qilinadi.
Quyidagi misolda parallel direktivasi ishlashi keltirilgan. Natijada bosh oqim “1 - ketma – ket muhit” matnini ekranga chop etadi, keyinchalik parallel direktivasi yangi oqimlarni hosil qiladi va ushbu oqimlarning har biri “parallel muhit” matnini ekranda chop etadi, keyin yaratilgan oqimlar tugatiladi va bosh oqim “2 - ketma - ket muhit” matnini ekranga chop etadi.
#include "stdafx.h"
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
cout<<“1 – ketma – ket muhit”;
#pragma omp parallel{
cout<
}
cout<<2 – ketma – ket muhit”;
}
Ayrim hollarda tizimning o‘zi parallel muhitda bajarilayotgan oqimlar sonini tizim resurslarini optimizatsiya qilish uchun dinamik ravishda o‘zgartirishi mumkin. Oqimlar sonini dinamik ravishda o‘zgartirish OMP_DYNAMIC o’zgaruvchisiga true qiymatni berish orqali amalga oshiriladi. Masalan, Linux operatsion tizimining bosh komanda obolochkasida ushbu qiymatni quyidagi buyruq orqali amalga oshirilish mumkin:
export OMP_DYNAMIC = true;
Dinamik ravishda o‘zgaradigan tizimlarda oqimlar soni odatda belgilanmagan bo‘ladi va uning qiymati falsega teng bo‘ladi.
omp_in_parallel() funksiyasi 1 qiymatni qaytaradi, agar aktiv holatdagi parallel muhitdan chaqirilgan bo‘lsa.
Quyidagi misolda omp_in_parallel() funksiyasi qo‘llanilgan. mode funksiyasi qaysi muhitdan chaqirilishiga qarab, “parallel muhit” yoki “ketma - ket muhit” qatorlarini chop etishda qo‘llaniladi.
#include "stdafx.h"
#include
using namespace std;
void mode(void){
if(omp_in_parallel())
cout<<”parallel muhit";
else
cout<<”ketma - ket muhit";
}
int _tmain(int argc, _TCHAR* argv[])
{
mode();
#pragma omp parallel
{
#pragma omp master
{
mode();
}}
return 0; }
C/C++ dasturlashtillaridayuqoridagibarchashartlarsingledirektivasibilanbirgalikdae’lonqilinadi.
Dasturningbelgilanganqisminiqaysioqimbajarishitavsiflanmaydi. Agarda nowait sharti e’lon qilinmasa, bitta oqim belgilangan fragmentni bajaradi, qolgan oqimlar uning ishini tugashini kutib turadi. single direktivasi umumiy o‘zgaruvchilar bilan ishlaganda kerak.
Master direktivasikodning ma’lum bir qismini faqat bosh oqim bajarishi uchun belgilaydi. Qolgan oqimlar ushbu qismni o‘tkazib yuborishadi va undan quyida turgan operator bilan dasturni ishlashini davom ettiradi. Ushbu direktivada sinxronizatsiya amalga oshirilmaydi. C/C++ dasturlash tilida direktiva quyidagicha e’lon qilinadi:
#pragma omp master
Quyidagi misolda masterdirektivasining ishlashi keltirilgan. n o‘zgaruvchi lokal hisoblanib, har bir oqim o‘zining nusxalari bilan ishlaydi. Dastavval barcha oqimlar n o‘zgaruvchiga 1 qiymatini o‘zlashtirishadi. So‘ngra bosh oqim n o‘zgaruvchiga 2 qiymatini o‘zlashtiradi va barcha oqimlar ushbu qiymatni ekranga chop etadi. Misolda ko‘rinib turibdiki, master direktivasini har doim bitta oqim bajaradi. Ushbu misolda barcha oqimlar 1 sonini ekranga chiqarsa, bosh oqim dastlab 2 sonini, so‘ngra esa 3 sonini ekranga chop etadi:
#include "stdafx.h"
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int n;
#pragma omp parallel private(n)
{
n=1;
#pragma omp master
{
n=2;
}
cout<<”n ning birinchi qiymati: “<< n;
#pragma omp barrier
#pragma omp master
{
n=3;
}
cout<}
return 0;
}
Quyidagi misolda private shartini ishlashi keltirilgan. Ushbu misolda parallel muhitda n o‘zgaruvchi lokal o‘zgaruvchi sifatida e’lon qilingan. Bu har bir oqimning n ning nusxlari bilan ishlashini bildiradi va har bir oqimning boshida n o‘zgaruvchi initsializatsiya qilinadi.Dasturning bajarilish vaqtida n o‘zgaruvchining qiymati to‘rtta turli xil joylarda chop etiladi. Birinchi marta n o‘zgaruvchining qiymati 1 ga o‘zlashtirilgandan keyin ketma - ket muhitda chop etiladi, ikkinchi marta barcha oqimlar n o‘zgaruvchining nusxasini parallel muhitning boshida chop etadi. Keyin barcha oqimlar o‘zining tartib nomerini omp_get_thread_num() funksiyasi yordamida olingan qiymatini n ga o‘zlashtirib chop etishadi. Parallel muhit tugagandan so‘ng n o‘zgaruvchining qiymati yana bir marta chop etiladi, bunda uning qiymati 1 ga teng bo‘ladi (parallel muhit ishlashi davomida o‘zgarmagan):
#include "stdafx.h"
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int n;
cout<<”ketma-ket muhitga kirishdagi n ning qiymati: " << n;
#pragma omp parallel private(n)
{
cout<<”parallel muhitga kirishdagi n ning qiymati: "<n=omp_get_num_threads();
cout<<"parallel muhitdan chiqishdagi n ning qiymati: " << n;
}
cout<return 0;
}
C/C++ dasturlashtillaridadasturningparallelmuhitdaaniqlanganstatiko‘zgaruvchilarumumiy (shared) o‘zaruvchihisoblanadi. Dinamik ajratilgan xotira ham umumiy hisoblanadi, ammo ko‘rsatgich ham umumiy, ham lokal bo‘lishi mumkin.
OpenMP da parallel muhitdagi o‘zgaruvchilar 2 turga bo‘linadi:
shared (umumiy, hamma oqimlar ushbu turdagi o‘zgaruvchilarni ko‘radi);
private (lokal, har bir oqim o‘zgaruvchining nusxasini o‘zida ko‘radi).
Umumiy o‘zgaruvchi hamma qismlar uchun har doim faqat bitta nusxada bo‘ladi va barcha oqimlarga bitta nomda bo‘ladi.Lokal o‘zgaruvchilar e’lon qilinganda, har bir oqim uchun bir xil tipdagi va o‘lchamdagi nusxalari yaratiladi. Bitta oqimdagi lokal o‘zgaruvchining qiymati o‘zgarsa ham qolgan oqimlardagi nusxalariniki o‘zgarmaydi.[19,20]
Bundan tashqari dasturning kod qismida har bir kvadrat matritsa ustida parallelashtirish amallari qo‘llanilgan. For siklida oqimlarga ajratish #pragma omp parallel for diriktivasi bilan amalga oshiriladi.
Parallel direktivasi yordamida parallel muhit hosil qilinadi. C/C++ dasturlash tilida quyidagicha ko‘rinishda bo‘ladi:
#pragma omp parallel [shart [[,] shart ]…]
pragma omp parallel
{
#pragma omp for
for(int i = 1; i < size; ++i)
x[i] = (y[i-1] + y[i+1])/2;
}
Yuqorida keltirilganlarga asosan quyidagicha xulosa qilish mumkin: dasturni parallel qismlarga ajratilishi va parallel protsesslarni ishlab chiqish muhimdir.
OpenMP kutubxonasini Intel Parallel Studio XE 2011 muhitiga sozlash.
1-rasm. Yangi project hosil qilamiz
2-rasm. Yaratilgan project ni xususiyatini o’zgartirish
3-rasm. OpenMP kutubxonasini yuklashni tasdiqlash
#include "stdafx.h"
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
#pragma omp parallel
{
cout<<”Salom Dunyo”}
return 0;
}
4-rasm. OpenMP da oddiy dastur
2>
|
|
Bosh sahifa
Aloqalar
Bosh sahifa
Laboratoriya ishi №2 Openmp parallellashtirish kutubxonasi bilan tanishish va uning yordamida parallel dasturlar tuzush
|