Amaliy qism
OpenMP kutubxonasini sozlash
OpenMP kutubxonasini Visual Studio 2015 muhitiga sozlash uchun quyidagi ketma-ketliklarni amalga oshiramiz:
qadam. Visual Studio 2015 muhitida yangi project yaratib olamiz va uni OpenMP.cpp kengaytmada nomlaymiz (1.2-rasm).
1.2-rasm. Yangi OpenMP.cpp nomli project hosil qilish
qadam. Yaratgan OpenMP.cpp projectimizni xususiyatlari (properties)ga kirib uning xususiyatlarini o ‘zgartiramiz (1.3-rasm).
1.3-rasm. Yaratilgan OpenMP.cpp projectini xususiyatini o‘zgartirish
qadam. Ushbu qadamda, C/C++ -> Language bo‘limiga kirib OpenMP kutubxonasini yuklashni tasdiqlab quyamiz (1.4-rasm).
1.4-rasm. OpenMP kutubxonasini yuklashni tasdiqlash
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<<“Hello world”} system(“pause”);
return 0;
}
1.5-rasm. OpenMP kutubxonasi o’rnatilgandan so’ng kodni amalga oshirish.
1.6-rasm. OpenMP paketi yordamida yaratilgan mintaqada “Hello World” so‘zini har bir oqimlarga yuklash.
OpenMP paketida protsessorimizda alohida ijro birliklari mavjud bo‘lgani uchun shuncha ko‘p ish zarralari ishlaydi. Biroq, bu qiymatlarni quyidagi usullar bilan sozlash mumkin. Quyida keltirilgan misolda barcha thred(oqim)lar ko‘rsatiladi va har bir thred(oqim) berilgan vazifani bajaradi (natija: 1.7-rasm).
// OpenMP.cpp #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: “<cout << “Hello World” << “\n”; // har bir oqimda bajarish
}
return 0;
}
1.7-rasm. OpenMP paketi yordamida oqimlarni boshqarish
OpenMP paketi parallel ishlashni amalga oshiradi va biz bajarayotgan hisob- kitob ishlarni sezilarli darajada tezlashtiradi. Quyida keltirilgan misollar (yordamida massivlar ustida hisob-kitoblarni parallel mintaqasiz ishlaganda masalani ishlash jarayoni qancha vaqt talab etganini ko‘rishimiz mumkin:
OpenMP da parallel mintaqasiz ishlash (Natija 1.8-rasm)
// 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 mintaqasiz olingan natija
|
1.9-rasm.
Parallel mintaqada olingan natija
|
1.8-rasmda keltirilgan natija asosida biz massivlar ustida hisob-kitoblarni parallel mintaqasiz masalani ishlash jarayoni qancha vaqt talab etganini ko‘rdik, ana endi ushbu misolni parallel mintaqa bilan ishlaganimizda masalani ishlash jarayoni vaqti sezilarli darajada kamayganini ko‘rishimiz mumkin:
|