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
Достарыңызбен бөлісу: