OpenMP paketining kamchiliklari.
OpenMP API yagona foydalanuvchi uchun mo’ljallangan. OpenMP dasturga
bog’liq bo’lgan ma’lumotlar bog’liqligini, ma’lumotlar qarama-qarshiligini,
muammoli holatlarni tekshirishni talab qilmaydi. Shu bilan birgalikda dasturdagi
kodlar ketma-ketligini xam tekshirishni talab qilmaydi. Dasturchilar OpenMP API
to’g’ri foydalanib dastur tuzishlari kerak. OpenMP API faqatgina murojaat
qilgandan keyingina ishlaydi.
OpenMP infratuzilmasi C, C++ va Fortran da parallel dasturlash texnologiyalarini samarali amalga oshirish imkonini beradi. 4.2 versiyasining GNU Compiler Collection (GCC) kompilyatori openmp 2.5 spetsifikatsiyasini qo'llab – quvvatlaydi va 4.4 versiyasining GCC versiyasi OpenMP 3 ning eng yangi xususiyatidir. Microsoft ® Visual Studio kabi boshqa kompilyatorlar ham OpenMP-ni qo'llab-quvvatlaydi. Ushbu maqola sizga openmp kompilyatorining pragmalaridan foydalanishni o'rgatadi; shuningdek, ba'zi OpenMP API-lari haqida ma'lumot beradi va OpenMP yordamida parallel hisoblash usullarini ochib beradi. Ushbu maqolaning barcha misollari gcc kompilyatoridan foydalanadi 4.2.
Birinchi OpenMP ilovasini yaratish
Salom, dunyo oddiy ilovasini yozishdan boshlaylik!, qo'shimcha pragma o'z ichiga oladi. Ushbu dastur kodi 1 listingida taqdim etiladi.
Jadval 1. OpenMP yordamida yozilgan "Salom dunyo" dasturi
1
2
3
4
5
6
7
8
|
#include
int main()
{
#pragma omp parallel
{
std::cout << "Hello World!\n";
}
}
|
G++ yordamida ushbu kodni kompilyatsiya qilish va ishga tushirgandan so'ng, ekranda "Hello", "World" yozuvini ko'rasiz!. Endi kodni variant bilan qayta kompilyatsiya qilamiz-fopenmp. Dasturning natijasi 2-jadvalda keltirilgan.
Jadval 2. Variantni ishlatib kodni kompilyatsiya qilish va ishga tushirish
1
2
3
4
5
6
7
8
9
10
|
tintin$ g++ test1.cpp -fopenmp
tintin$ ./a.out
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
|
Nima yuz berdi? Kompilyator opsiyasidan foydalanganda-fopenmp, #pragma omp parallel direktivasi ishga tushadi. Kompilyatsiya jarayonida GCC ichki mexanizmlari tizimning optimal yuklanishi (apparat va operatsion tizim konfiguratsiyalariga qarab) amalga oshirilishi mumkin bo'lgan parallel oqimlar hosil qiladi, har bir oqim pragmadan keyin blokda joylashgan kodni amalga oshiradi. Bunday xatti-harakatlar bevosita parallelizatsiya deb ataladi va OpenMP yadrosi sizni turli xil kod qismlarini yozishdan xalos qiluvchi kuchli pragmalar to'plamidan iborat (qiziqish uchun siz ushbu kodni POSIX oqimlari [pthreads] bilan bir xil vazifani bajarish bilan taqqoslashingiz mumkin). Men 7 jismoniy yadrosi bilan Intel ® Core i4 protsessor bilan ishlaydigan kompyuterni har birida 2 mantiqiy yadrosi bilan ishlataman, bu 2 (8 oqimlari = 8 mantiqiy yadrolari) ro'yxatida olingan natijalarni tushuntiradi.
Do'stlaringiz bilan baham: |