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



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

. . . 
. . . 
тізбекті секция 
параллель секция 
тізбекті секция 
параллель секция 


144 
Бұдан әрі нақты директиваларды суреттеу кезінде жазуды қысқарту 
үшін, кейбір кездерде біз бұл префикстерді кӛрсетпейтін боламыз, әрине 
шын бағдарламаларда олар әрқашан қатысуы қажет.
ОреnМР-ға қатысты барлық функциялар және қоршаған орта айнымалылары 
ОМР
_ префиксынан басталады. 
Параллель 
облыстарды бейнелеу. Бағдарламадағы параллель 
облыстарды анықтау үшін директивалардың келесі жұбы пайдаланылады 
!$ОМР PARALLEL 
<бағдарламаның параллель коды>
!$ОМР END PARALLEL 
Берілген екі директиваның арасына орналасқан параллель кодты 
орындау үшін, жіп-мастер қосымша 
OMP
_
NUM
_
THREADS 
- 1 жіп туғызады, 
мұндағы 
OMP
_
NUM
_
THREADS 
– орта айнымалысы. Оның мәнін пайдаланушы 
бағдарламаны жүктеудің алдында береді және ӛзгерте алады. Жіп-мастердің 
нӛмірі әрқашан 0 болатынын жоғарыда айтқанбыз. Барлық жіптер берілген 
директивалар арасындағы кодты орындайды.
END PARALLEL
директивасынан кейін автоматты түрде барлық жіптердің 
айқын емес синхрондалуы жүреді. Қалай барлық жіптер осы нүктеге жетісімен 
жіп-мастер бағдараманың келесі бӛлігін орындауды жалғастырады, ал қалған 
жіптер жойылады.
Параллель секциялар бірінің ішінде бірі болуы мүмкін. Арнайы айтылмаса, олар 
бір жіппен орындалады. Мұндай қабатталып орналасқан секцияларды ӛңдеуге 
қажетті стратегияны 
OMP
_
NESTED 
айнымалысы анықтайды,
ал олардың мәндерін
OMP
_
SET
_
NESTED 
функциясының кӛмегімен ӛзгертуге болады. 
Параллель секцияларда жіптердің санын өзгертуге болады. Егер 
OMP_DYNAMIC 
айнымалысының 
мәні 
1-ге 
тең 
болса, 
онда 
OMP_SET_NUM_THREADS 
функциясының 
кӛмегімен 
пайдаланушы 
OMP
_
NUM
_
THREADS 
айнымалысының мәнін ӛзгерте алады,
олай болса 
параллель секцияға кірген кездегі туындаған жіптер санын да ӛзгерте 
аламыз. OMP_DYNAMIC айнымалысының мәні OMP_SET_DYNAMIC 
функциясымен бақыланады. 
Параллель секция кодының параллель орындалуын және жіптер 
туындауының қажеттілігін, пайдаланушы 
IF
қосымша опциясы кӛмегімен 
келесі директивада анықтай алады: 
!$ОМР PARALLEL IF(<шарт>) 
Егер <шарт> орындалмаса, онда директива қосылмайды, бағдарламаны 
ӛңдеу бұрынғы режимде жалғасады.


145 
Жоғарыда, туындаған жіптердің бәрі бір ғана кодты орындайды деп 
айтылған болатын. Енді олардың арасында жұмысты қалай тиімді түрде 
бӛлуге болады деген сұрақты талқылау керек. 
ОрепМР шеңберінде жұмысты бөліп беру үшін келесі тӛрт нұсқаны 
пайдалануға болады: 

тӛменгі деңгейдегі бағдарламалау; 

циклдарды параллель орындау үшін
DO
директивасы; 

бағдарламаның тәуелсіз фрагменттерін параллель орындау үшін 
SECTIONS 
директивасы; 

код участогын бір рет қана орындау үшін
SINGLE 
директивасы. 
Төменгі деңгейдегі бағдарламалау OMP_GET_THREAD_NUM және 
OMP_GET_NUM_THREADS функцияларының кӛмегімен жұмысты таратуды 
кӛздейді, олар сәйкесінше жіп нӛмірін және туындаған жіптердің жалпы 
санын қайтарады. Мысалы, егер келесі түрдегі фрагментті жазсақ: 
IF(OMP_GET_THREAD_NUM() .EQ. 3) THEN 
<нөмірі 3 жіп үшін жеке код >
ELSE 
<барлық қалған жіптер үшін код >
ENDIF 
онда 
IF


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




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

    Басты бет