Оқулық Қазақстан Республикасы Білім және ғылым министрлігі бекіткен Алматы, 2011



Pdf көрінісі
бет78/121
Дата31.08.2022
өлшемі2,81 Mb.
#38343
түріОқулық
1   ...   74   75   76   77   78   79   80   81   ...   121
Байланысты:
duisembiev-parallel-esep

Жіптер жұмысын синхрондау үшін ОреnМР тұтас директивалар 
жиынын пайдаланады. Ең кең таралған және қарапайым синхрондау әдісі - 
барьер. Ол
!$ОМР BARRIER 
директивасы кӛмегімен орындалады. Барлық жіптер осы 
директиваға жетісімен «тоқтайды», және қалған барлық жіптердің 
бағдарламаның осы нүктесіне жетуін күтеді, барлығы жетісімен ары қарай 
жұмыстарын жалғастырады. 
Директивалар 
MASTER
.
. .
END MASTER
жұбы тек қана жіп-мастермен 
орындалатын код участогын белгілейді. Қалған жіптер бұл участокты елемей 
ӛткізіп жібереді де 
END MASTER 
директивасынан кейін орналасқан 
оператордан бастап жұмыстарын жалғастырады. Бұл директива айқын емес 
синхрондауды ниет етпейді. 
Келесі директивалар кӛмегімен
!$ОМР CRITICAL [ (< критикалық секцияның аты>) ] 


151 
!$ОМР END CRITICAL [ (<критикалық секцияның аты >) ] 
бағдарламаның критикалық секциясы құжатталады. Әрбір уақыт мезетінде 
критикалық секцияда біреуден артық жіп болмайды. Егер критикалық секция 
қандай да бір Р

жіппен орындалып жатса, онда қашан Р

бұл секцияны 
орындауын аяқтағанша, осы секция үшін 
CRITICAL
директивасын 
орындаған барлық қалған жіптер бұғатталады. Қалай Р
0
жібі 
 
END
CRITICAL
директивасын орындайды, солай кірістегі бұғатталған жіптердің бірі секцияға 
кіреді. Егер критикалық секцияның кірісінде бірнеше жіптер тұрса, онда 
олардың бірі кездейсоқ түрде алынады, ал қалған бұғатталған жіптер күтулерін 
жалғастырады. Барлық аталмаған критикалық секциялар шартты түрде бір 
атпен қаралады, ал бірдей атты иеленетін критикалық секциялар бірегей (бір) 
секция ретінде қарастырылады. 
Жоғарыда келтірілген жіп нӛмірін баспалауға қатысты мысалды келесі 
түрде жетілдіріп қарастырайық: 
!$ОМР CRITICAL 
I = OMP_GET_THREAD_NUM() 
PRINT *, I
!$OMP END CRITICAL 
Бұл жағдайда, егер I айнымалысы жалпы деп хабарланғанның ӛзінде, бәрібір 
шығысында міндетті түрде 0 ден 
OMP
_
NUM
_
THREADS 
– 1
-ге дейінгі 
барлық сандар пайда болады. Енді, критикалық секция және жалпы 
айнымалы I пайдаланылатын фрагмент пен критикалық секциясыз жергілікті 
айнымалыны I пайдаланатын фрагмент арасында қандай айырмашылық бар 
екенін қарап кӛрелік. Қазір ғана кӛргеніміздей нәтиже тек сандардың пайда 
болу ретінде ғана. Сандар жиыны бірдей болады. Бірақ бұл фрагменттердің 
орындалуында айтарлықтай айырмашылық бар. Егер критикалық секция бар 
болса, онда әрбір уақыт мезетінде фрагмент тек қандай да бір жіппен ғана 
ӛңделеді. Қалған жіптер, бағдарламаның осы нүктесіне келіп тұрғандарына 
және жұмысқа дайын болғандарына қарамастан ӛз кезектерін күтеді. Егер 
критикалық секция болмаса, онда барлық жіптер бір мезгілде кодтың берілген 
участогын орындайды. Бір жағынан, критикалық секциялар жалпы 
айнымалылармен жұмыс істеу үшін ыңғайлы механизм ұсынады. Ал басқа 
жағынан пайдаланушыға абай болу керек, себебі критикалық секциялар 
параллель бағдарламаға тізбекті код участкілерін қосады, олар ӛз кезегінде 
оның тиімділігін тӛмендетеді. 
Тәжірибе жүзінде критикалық секцияны пайдаланудың дербес жағдайы 
ретінде жалпы айнымалыларды жаңартуды алуға болады. Мысалы, егер 
SUM 
айнымалысы жалпы болып және 
SUM 

SUM 
+ Expr
түріндегі оператор 


152 
бағдарламаның параллель секциясында бар болса, онда берілген операторды 
бірнеше жіптермен бірмезгілде орындау кезінде дұрыс нәтиже алынбауы 
мүмкін. Мұндай жағдайларды болдырмау үшін, критикалық секциялар 
механизмін немесе осындай жағдайлар үшін арнайы қарастырылған
ATOMIC
директивасын пайдалануға болады: 
!$ОМР ATOMIC 
SUM = SUM + Expr 
ATOMIC
директивасы ӛзінен кейінгі тұрған операторға ғана қатысты. Бұл 
мысалда ол 
SUM жалпы айнымалысымен дұрыс жұмыс істеуге кепілдік 
береді. 
Заманауи параллель есептеу жүйелерінде күрделі құрылым және жады 
иерархиясы пайдаланылуы мүмкін болғандықтан, пайдаланушының ӛзіне 
қажетті уақыт мезеттерінде, әрбір жіп жадының бірегей үйлестірілген 
бейнесін кӛре алатынына кепілдігі болуы керек. 
!$ОМР FLUSH [ айнымалылар_тізімі ] 
Бұл директиваның орындалу барысында, регистрлерде уақытша 
сақталынған барлық айнымалылардың мәндері негізгі жадыға енгізіледі, 
жіптердің жұмыс істеу барысында айнымалыларға жасаған ӛзгертулері 
қалған жіптерге кӛрінетін болады, егер қандай да бір ақпарат шығыс 
буферлерінде сақталынса, олар алынып тасталады. Берілген директиваның 
толық кӛлемде орындалуы айтарлықтай қосымша шығындарға алып 
келетіндіктен, қандай да бір уақыт мезетінде барлығы емес ал жекелеген 
айнымалылардың ғана үйлесімділігін кӛрсетудің кепілдігі керек болған 
жағдайда, бұл айнымалыларды айқын түрде тізіп кӛрсету қажет. Біз бұл 
бӛлімде ОреnМР технологиясының конструкцияларына толық талдау 
жүргізбейміз. Fortran, С және C++ тілдері үшін ОреnМР туралы толық 
текстерді http://www.openmp.org сайтынан ала аласыздар. Сонымен қатар, 
жоғарыда келтірілген және басқа да кӛптеген мысалдардың Fortran, С және 
C++ тілдеріне арналып жасалған толық нұсқаларын А.С.Антоновтың 
«Параллельное программирование с использованием технологии OpenMP» 
атты оқу құралынан кездестіре аламыз. ОреnМР технологиясының 
директивалары, функциялары, опциялары және орта айнымалылары 
қосымша 2-де берілген. 
Сонымен, ОреnМР технологиясы несімен тартымды және қызықты? 
Бірнеше моменттерінің ішінен екеуін арнайы айта кетуге болады. Біріншіден, 
ОреnМР технологиясы алғашында пайдаланушы параллель және тізбекті 
бағдарламалар үшін бір текспен ғана жұмыс істей алатындай етіп жобаланған. 
Тізбекті машинада дәстүрлі компилятор ОреnМР директиваларын жай 
"байқамай" қалады, себебі олар комментарилерде орналасқан. Туындайтын 
мәселелердің бір ғана бастауы орта айнымалылары және арнайы функциялар 
болуы мүмкін. Алайда, олар үшін тізбекті жағдайда ОреnМР-
бағдарламасының 
дұрыс 
жұмысына 
кепілдік 
беретін 
стандарт 


153 
спецификацияларында арнайы "бұқтырмалар" ("заглушки") қарастырылған. 
Ол үшін тек бағдарламаны қайта компиляция жасап, басқа кітапхананы қосу 
керек.
ОреnМР технологиясының келесі артықшылығы бағдарламаны 
біртіндеп "инкрементті" параллельдеу мүмкіндігі. Негізіне тізбекті кодты ала 
отырып, пайдаланушы әр қадам сайын жаңа параллель конструкцияларды 
бейнелейтін жаңа директиваларды қосып отырады. Мұнда бірден тұтас 
параллель бағдарламаны құрудың қажеттілігі жоқ, оны құру тізбекті түрде 
жүргізіледі. Бұл ӛз кезегінде бағдарламалау процесін де жӛндеуді де 
ықшамдауға мүмкіндік береді. 


Достарыңызбен бөлісу:
1   ...   74   75   76   77   78   79   80   81   ...   121




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет