151
!$ОМР END CRITICAL [ (<критикалық секцияның аты >) ]
бағдарламаның
критикалық секциясы құжатталады. Әрбір уақыт мезетінде
критикалық секцияда біреуден артық жіп болмайды. Егер критикалық секция
қандай да бір
Р
0
жіппен
орындалып жатса, онда қашан
Р
0
бұл секцияны
орындауын аяқтағанша, осы секция үшін
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МР технологиясының келесі артықшылығы бағдарламаны
біртіндеп "инкрементті" параллельдеу мүмкіндігі. Негізіне тізбекті кодты ала
отырып, пайдаланушы әр қадам сайын жаңа параллель конструкцияларды
бейнелейтін жаңа директиваларды қосып отырады. Мұнда бірден тұтас
параллель бағдарламаны құрудың қажеттілігі жоқ, оны құру тізбекті түрде
жүргізіледі. Бұл ӛз кезегінде бағдарламалау процесін де жӛндеуді де
ықшамдауға мүмкіндік береді.
Достарыңызбен бөлісу: