|
Kompyuter injiniringi 210-21 guruh talabasi
|
Sana | 06.12.2023 | Hajmi | 1,31 Mb. | | #112630 |
Bog'liq arxitekura-5
Kompyuter injiniringi
210-21 guruh talabasi
KOMPYUTER ARXITEKURASI FANIDAN
5-TOPSHIRIQ
MAVZU: OpenMP PAKET TARKIBINI VA ISHLASHINI O‘RGANISH
Ishdan maqsad: OpenMP paketini va uning ishlash algoritmlarini o‘rganish va shaxsiy kompyuterda OpenMP kutubxonasini sozlash hamda undan foydalana olish ko‘nikmasiga ega bo‘lish.
Nazariy qism
OpenMP API umumiy xotira tizimlarida parallel dasturlarni ishlab chiqishga imkon beruvchi kompilyator direktivalari, kutubxona tartiblari va muhit o'zgaruvchilari to'plamidan iborat. Bu yerda asosiy komponentlar va ular qanday ishlashi haqida umumiy ma'lumot:
1. Tuzuvchi ko'rsatmalari:
- Kompilyator direktivalari - bu kodni parallellashtirish bo'yicha kompilyatorga ko'rsatma berish uchun manba kodiga kiritilgan maxsus izohlar.
- Asosiy direktivalarga `#pragma omp parallel`, `#pragma omp for`, `#pragma omp sections` va boshqalar kiradi.
- Direktivlar parallel hududlarni, tsiklni parallellashtirishni, kod bo'limlarini, sinxronizatsiyani va boshqalarni belgilaydi.
2. Kutubxona tartiblari:
- OpenMP ijro muhitini so'rash yoki boshqarish uchun ilovadan chaqirilishi mumkin bo'lgan ish vaqti kutubxonasi tartiblarini taqdim etadi.
- Masalan, `omp_get_num_threads()`, `omp_get_thread_num()` va `omp_set_num_threads()`.
3. Atrof-muhit o'zgaruvchilari:
- Atrof-muhit o'zgaruvchilari OpenMP dasturlari xatti-harakatlarini boshqarish uchun ishlatilishi mumkin.
- "OMP_NUM_THREADS" o'zgaruvchisi, masalan, dastur uchun mavjud bo'lgan mavzularning maksimal sonini belgilaydi.
4. Parallel hududlar:
- #pragma omp parallel direktivasi koddagi parallel hududni belgilaydi.
- Parallel mintaqada kod bir vaqtning o'zida bir nechta iplar tomonidan bajariladi.
- Mavzular odatda dinamik tarzda yaratiladi va iplar sonini direktivlar yoki muhit o'zgaruvchilari yordamida boshqarish mumkin.
5. Mavzuni boshqarish:
- OpenMP dinamik yaratish va iplarni boshqarishni qo'llab-quvvatlaydi.
- Iplar parallel hududlarda ish bilan ta'minlanadi va ish vaqtida iplar sonini sozlash mumkin.
Maʼlumotlar doirasi va almashish:
- OpenMP parallel hududlarda ma'lumotlar doirasini aniqlash mexanizmlarini taqdim etadi.
- O'zgaruvchilar mavzular o'rtasida taqsimlanishi mumkin (`shared` bandi) yoki har bir mavzu uchun shaxsiy nusxalari bo'lishi mumkin (`private' band).
7. Parallel tsikllar:
- “#pragma omp for” direktivasi tsikllarni parallellashtirish uchun ishlatiladi.
- Turli rejalashtirish strategiyalari variantlari bilan iplar o'rtasida tsiklning takrorlanishini avtomatik ravishda taqsimlaydi.
8. Sinxronizatsiya:
- `#pragma omp barrier`, `#pragma omp kritik` va `#pragma omp atomic` kabi direktivalar sinxronizatsiya mexanizmlarini ta`minlaydi.
- Ular umumiy resurslarga kirishni nazorat qiladi va mavzulararo aloqani boshqaradi.
9. Kamaytirishlar:
- “Kamaytirish” bandi parallel aylanishlarda summalar yoki mahsulotlar kabi qisqartirishlarni samarali bajarish uchun ishlatiladi.
10. Xato bilan ishlash:
- OpenMP `omp_set_num_threads()` funksiyasi kabi xatolarni qayta ishlash mexanizmlarini taqdim etadi.
11. Tuzish va bajarish:
- OpenMP-ni yoqish uchun manba kodi odatda ma'lum bir bayroqdan (masalan, GCC uchun `-fopenmp`) foydalanib, OpenMP-ni qo'llab-quvvatlaydigan kompilyator bilan kompilyatsiya qilinadi.
- Keyin kompilyatsiya qilingan dastur ko'p yadroli mashinada bajarilishi mumkin.
12. Hujjatlar va manbalar:
- OpenMP spetsifikatsiyalari API tafsilotlarini hujjatlashtiradi va chuqur ma'lumot uchun ularga murojaat qilish mumkin.
13. Tuzuvchini qo‘llab-quvvatlash:
- Turli kompilyatorlar OpenMP-ni qo'llab-quvvatlash va qo'shimcha funktsiyalarda o'zgarishlarga ega bo'lishi mumkin. Muayyan kompilyatoringiz uchun hujjatlar bilan maslahatlashing.
Ushbu komponentlarning birgalikda ishlashini tushunish ishlab chiquvchilarga OpenMP yordamida parallel kod yozish imkonini beradi, bu esa unumdorlikni oshirish uchun ko'p yadroli arxitekturalardan foydalanishni osonlashtiradi. OpenMP-ni o'zlashtirish va kodni samarali parallellashtirish uchun tajriba va amaliyot juda muhimdir.
Amaliy qism
OpenMP kutubxonasini sozlash
OpenMP kutubxonasini Visual Studio 2012 muhitiga sozlash uchun quyidagi
ketma-ketliklarni amalga oshiramiz:
1-qadam. Visual Studio 2012 muhitida yangi project yaratib olamiz va uni
OpenMP.cpp kengaytmada nomlaymiz (1.2-rasm).
1.2-rasm Yangi .cpp proyekt yaratib olish
2-qadam. Yaratgan OpenMP.cpp projectimizni xususiyatlari (properties)ga
kirib uning xususiyatlarini o‘zgartiramiz (1.3-rasm).
1.3-rasm Yaratilgan OpenMP.cpp faylini xususiyatini o’zgartirish
3-qadam. Ushbu qadamda, C/C++ -> Language bo‘limiga kirib OpenMP
kutubxonasini yuklashni tasdiqlab quyamiz (1.4-rasm).
1.4-rasm. OpenMP kutubxonasini yuklashini tasdiqlash belgilash
OpenMP paketini Visual Studio muhitiga samarali o‘rnatilganiga ishonch
hosil qilish uchun quyidagi kodni amalga oshiramiz, va natija (1.5-rasm) ni
ko‘ramiz:
#include "stdafx.h"
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
#pragma omp parallel
{
// parallel mintaqa
cout<<"Tuit kif 210-21 "<system("pause");
return 0;
}
1.5-rasm OpenMP paketi yordamida yaratilgan “Tuit kif 23” so’zini har bir oqimlarga yuklash
// OpenMP.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
#include
using namespace std;
#define THREAD_NUM 4
int main()
{
// “parallel” blokdagi thredlar sonini belgilash
omp_set_num_threads(THREAD_NUM);
#pragma omp parallel
{
cout<<"Thredlar soni: "<<cout<<"Thred raqami: "<"\n"; // Joriy holatdagi thred raqami
cout << "Tuit kif 23
" << "\n"; // har bir oqimda bajarish
system("pause");
}
return 0;
}
1.7-rasm OpenMP paketi yordamida oqimlarni boshqarish
OpenMP paketi orqali biz parallel ishlovni amalga oshiramiz va berilgan vazifani sezilarli darajada tezlasshtiradi. Hozirgi misolda jarayonga qancha vaqt talab etilganini ko’rishimiz mumkin:
// OpenMP.cpp
// OpenMP da parallel mintaqasiz ishlash
#include “stdafx.h”
#include
#include
#include
#include
#define ARRAY_SIZE 100000000
#define ARRAY_VALUE 1231
using namespace std;
int main() {
//jarayon bajarilish vaqtini aniqlash uchun kerakli
kalit so‘zlar
double itime, ftime, exec_time;
itime = omp_get_wtime();
int *arr = new int[ARRAY_SIZE];
std::fill_n(arr, ARRAY_SIZE, ARRAY_VALUE);
for (int i = 0; i < ARRAY_SIZE; i++)
{
arr[i]=arr[i]/arr[i]+arr[i]/5-14;
}
// Jarayonga ketgan vaqtni hisoblash
ftime = omp_get_wtime();
exec_time = ftime - itime;
cout << “Sarflangan vaqt: “ << exec_time <<
endl;
return 0;
}
1.8-rasm Parallel ishlov berish orqali olingan natija
Biz massivlar ustida hisob-kitoblarni parallel ishlash jarayoni qancha vaqt talab etganligini ko’rdik.
// OpenMP.cpp
#include
#include
#include
#include
#define ARRAY_SIZE 100000000
#define ARRAY_VALUE 1231
using namespace std;
int main() {
//jarayon bajarilish vaqtini aniqlash uchun kerakli
kalit so‘zlar
double itime, ftime, exec_time;
itime = omp_get_wtime();
omp_set_num_threads(4);
int *arr = new int[ARRAY_SIZE];
std::fill_n(arr, ARRAY_SIZE,ARRAY_VALUE);
#pragma omp parallel for
for (int i = 0; i < ARRAY_SIZE; i++)
{
arr[i] = arr[i] / arr[i] + arr[i]/5-14;
}
// Jarayonga ketgan vaqtni hisoblash
ftime = omp_get_wtime();
exec_time = ftime - itime;
cout << “Sarflangan vaqt: “ << exec_time <<
endl;
return 0;
}
1.9-rasm Parallel ishlov berishda oqimlar sonini bergan holdagi holat
Yuqorida keltirilgan natijalarga ko‘rib turgamnimizdek, OpenMP C/C++ da
multi-threading(ko‘p-oqimlar)dan foydalanish bizga ko‘p vaqtni tejash imkonini
beradi.
Xulosa
Men bu amaliy ishni bajarish davomida OpenMP paket tarkibining ishlashini o’rganib chiqdim .Visual studio orqali OpenMP yordamida berilgan vazifani CPU parallel holatda ishlov olib boorish natijasida vaqtdan samaraliekanligini ko’rib chiqdim.
Foydalanilgan adabiyotlar
https://online.pubhtml5.com/ahqm/lhve/#p=1
chatgpt.com
|
| |