Amaliy qism OpenMP kutubxonasi yordamida oddiy misol ishlash: Ushbu misol juda oddiy bo‘ladi, bir nechta oqimdan “Salom dunyo”so‘zini ekranga chop etamiz (natija: 12.1-rasm).
// OpenMP.cpp
#include “stdafx.h”
#include #include using namespace std;
int _tmain(int argc, _TCHAR* argv[]) {
#pragma omp parallel
{
cout << “Salom Dunyo”; }
return 0;
}
12.1-rasm. OpenMP paketida misollar
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: 12.2-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 << “Salom Dunyo” << “\n”; // har bir oqimda bajarish
}
return 0;
}
12.2-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 12.3-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;
}
12.3-rasm. Parallel mintaqasiz olingan natija
12.3-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:
OpenMP da parallel bilan ishlash (natija: 12.4-rasm) // 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;
}
12.4-rasm. Parallel mintaqada olingan natija
Yuqorida keltirilgan natijalarga ko‘rib turgamnimizdek, OpenMP C/C++ da multi-threading(ko‘p-oqimlar)dan foydalanish bizga ko‘p vaqtni tejash imkonini beradi.