146
Бұл
директива артынан ілескен
DO
операторы кіретін блокқа қатысты.
SCHEDULE
–
опциясы жіптер арасында цикл итерацияларын таратудың
нақты әдістерін анықтайды.
STATIC
[, m]
— итерацияның блокты-циклдық таратылуы. Бірінші
жіп m итерациядан тұратын бірінші блокты орындайды, екінші жіп –
екінші блокты және т.с.с. соңғы блокқа дейін,
одан кейін таратылу
қайтадан бірінші жіптен басталады. Егер m–нің мәні кӛрсетілмесе,
онда итерациялардың барлық жиыны, ӛлшемдері шамамен бірдей
болатын үздіксіз бӛліктерге (кесектерге) бӛлінеді, және олар жіптер
арасында таратылады.
DYNAMIC
[,m]
- итерациялардың динамикалық таратылуы.
Алғашында барлық жіптер m итерациядан тұратын үлестерін
(порции) алады, ӛз жұмыстарын аяқтағаннан
кейін әрбір жіп тағы
да m итерациядан тұратын келесі үлесін алады. Егер m–нің мәні
кӛрсетілмесе, ол бірге тең деп қабылданады.
GUIDED
[,m]
- итерациялардың ӛлшемдері азаятын блоктармен
динамикалық таратылуы. Алғашында белгіленген блоктардың
ӛлшемдері жеткілікті үлкен етіп алынады, ал бағдарламаның жұмыс
істеу процесінде ол үнемі біртіндеп азая береді. Итерация блогының
минимальді ӛлшемі m. Алғашқы белгіленген блоктың ӛлшемі оның
іске асырылуына байланысты. Егер m–нің мәні кӛрсетілмесе, ол
бірге тең деп қабылданады.
RUNTIME
– цикл итерацияларының таратылу әдісі бағдарламаның
жұмыс
істеу кезінде
OMP
_
SCHEDULE
айнымалысының мәніне
байланысты таңдалады. Таңдалған әдіс
S
CHEDULE
опциясынан кейін
жақша ішінде кӛрсетіледі, мысалы:
!$ОМР DO SCHEDULE (DYNAMIC, 10)
Бұл мысалда, итерациялардың әрбірі 10 итерациядан тұратын блоктар
түрінде динамикалық таратылуы пайдаланылады.
Параллель циклдың соңында, параллель
жұмыс істейтін жіптердің
айқын емес барьерлік синхрондауы іске асады (происходит): олардың ары
қарай орындалуы, берілген нүктеге олардың барлығы жеткен кезде ғана
жалғасады. Егер мұндай бӛгелудің (кідірістің) қажеттілігі болмаса, онда
END DO NOWAIT
аяқтаушы директивасы
цикл соңына жеткен жіптерге
(қалған жіптермен синхрондалу жасалынбайды) орындауды жалғастыра
беруге мүмкіндік береді. Егер
END DO
директивасы
айқын түрде
кӛрсетілмесе,
онда
параллель циклдың соңында синхрондау бәрібір
орындалады.
Параллель циклдарды ұйымдастыруға бірнеше табиғи шектеулер
қойылады.
Дербес жағдайда, дұрыс құрылған бағдарлама қандай жіп
147
параллель циклдің қай итерациясын орындап жатқанына байланысты
болмауы керек деп есептеледі. Параллель циклдан қосымша шығуды
пайдалануға болмайды.
SCHEDULE
опциясында кӛрсетілген
итерация
блогының ӛлшемі цикл шеңберінде ӛзгермеуі керек.
Келесі мысалды қарастырайық. Ол бағдарламаның паралель секциясында
орналасқан деп есептейік.
!$ОМР DO SCHEDULE (STATIC, 2)
DO i = 1, n
DO j = 1, m
A(i, j) = (B(i, j - 1) + B ( i - 1, j))/2.0
END DO
END DO
!$OMP END DO
Бұл мысалда сыртқы цикл параллель деп хабарланған, және мұнда
итерацияның блокты-циклдік таратылуы пайдаланылатын болады (блокта екі
итерациядан). Ішкі циклға
қатысты ешқандай нұсқаулар жоқ, сондықтан ол
әрбір жіппен тізбекті орындалатын болады.
Достарыңызбен бөлісу: