Ko'p yillar mobaynida protsessorlarning ish faoliyatini oshirishning asosiy
usuli bo'lgan "megahertz poygasi" yadro sonini ko'paytirish tendentsiyasiga aylandi.
Yaxshiyamki, protsessor ishlab chiqaruvchilari bir nechta protsessorlarni bitta
chipga qanday qilib qo'yish kerakligini o'rgandi. Endi deyarli har bir kompyuterda
ko'p yadroli protsessor o'rnatilgan. Hatto kirish stoli ish stoli tizimlarida ikkita yadro
mavjud - to'rt va sakkizta yadroli tizimlar mavjud. Agar Mur qonuni kuchini
yo'qotmasa, 5 yil ichida o'rtacha kompyuter chip ustida 16 yoki hatto 32 yadroli
bo'ladi.
Muammo shundaki, dasturiy ta'minot sohasi apparatni nazorat qila olmaydi
va dasturlarning faqat bir qismi ko'p yadroli protsessorlarning resurslaridan samarali
foydalanishi mumkin. Har bir dasturda bir asosiy ijro etuvchi bor. Bu ketma-ket
ketma-ket bir-birini ketma-ket bajaradigan ko'rsatmalar majmui. Tabiiyki, bu holda
protsessorning bir yadrosi shug'ullanadi. Dasturchi qolgan yadrolarni ish bilan
ishlashga g'amxo'rlik qilishi kerak, boshqacha qilib aytganda, ba'zi ko'rsatmalar
ketma-ket bajarilmasligini, bir vaqtda parallel rejimda bajarilishini ta'minlashi
kerak.
Ta'kidlash joizki, bu ko'rsatkich yadro sonining ko'payishi bilan linear
ravishda oshmaydi. Ya'ni, to'rtta yadrodan foydalanish hosildorlikning to'rt barobar
ko'payishini kafolatlamaydi. Shunga qaramay, o'sish bor va har yili kuchli bo'ladi -
ko'p yadroli protsessorlar uchun optimallashtirilgan dasturlar paydo bo'ladi.
Protsessorning to'liq quvvatini ishlatish uchun dasturchilar threadlarni qanday
qilib boshqarishi mumkin? Dasturni iloji boricha tezroq bajarish, yadro sonini
ko'paytirish bilan o'lchab qo'yish va bunday dasturni yozish dasturchining kabusu
emasmi? Bittasi dastur kodida ish zarrachalaridan tuzish, bajarish uchun vazifalarni
bajarish, so'ng ularni o'chirishdir. Ammo bu holda, siz juda muhim narsa -
sinxronizatsiya haqida g'amxo'rlik qilishingiz kerak. Agar bitta vazifa boshqa
topshiriq bilan hisoblangan ma'lumotlarga muhtoj bo'lsa, vaziyat yanada
murakkablashadi. Turli bir vaqtning o'zida umumiy o'zgaruvchan qiymatlarni
o'zgartirmoqchi bo'lganda nima sodir bo'lishini tushunish qiyin. Ha, men qo'l bilan
ish zarrachalari yaratmoqchi emasman va vazifalarni ularga topshirishni
xohlamayman. Parallel dasturlash uchun turli kutubxonalar va standartlar qutqarish
uchun keladi. C, C ++, Fortran-OpenMP dasturlarini parallellashtirish uchun eng
keng tarqalgan standartni ko'rib chiqaylik.
OpenMP - umumiy xotira bilan birga ko'p protsessorli tizimlarda multi-
threadli dasturlar dasturlash uchun mo'ljallangan API. OpenMP spesifikatsiyasi bir
necha yirik kompyuter uskunalari va dasturiy ta'minot ishlab chiqaruvchilari
tomonidan ishlab chiqilgan. OpenMP asosiy kompilyatorlari tomonidan qo'llab-
quvvatlanadi.
OpenMP-da siz koddagi oqimlarni "ko'rmaysiz". Buning o'rniga,
kompilyatorga #pragma ko'rsatmalariga kod blokini parallel holga keltirishi
mumkinligini aytasiz. Ushbu ma'lumotni bilgan holda, kompilyator parallel parol
bloklari uchun boshqa bir nechta iplarni yaratadigan bitta asosiy threaddan iborat
bo'lgan dasturni ishlab chiqishi mumkin. Ushbu iplar parallel bloklar blokining
oxirida sinxronlashtiriladi va biz yana bir xil asosiy threadka qaytamiz.
OpenMP #pragma tomonidan nazorat qilinganligi sababli, C ++ kodi har
qanday C ++ kompilyatori tomonidan to'g'ri tuzilgan, chunki qo'llab-
quvvatlanmaydigan #pragma e'tiborga olinmasligi kerak. Biroq, OpenMP API-da,
bir nechta vazifani o'z ichiga oladi va ulardan foydalanish uchun nom faylini
kiritishingiz kerak. Derivatning OpenMP-ni qo'llab-quvvatlab turishini aniqlashning
eng oson yo'li omp.h faylini kiritishga urinishdir: #include
Agar OpenMP qo'llab-quvvatlanadigan bo'lsa, uni maxsus kompilyatorlar
yordamida yoqishga to’g’ri keladi:
gcc -fopenmp
Intel
-openmp (Linux, MacOSX), -Qopenmp (Windows)
Microsoft
-openmp (Настройки проекта в Visual
Studio)
Do'stlaringiz bilan baham: