Дәріс конспектілері (тезистері) уе-10-20 фр 03



бет40/46
Дата14.01.2023
өлшемі2,05 Mb.
#61250
түріКонспект
1   ...   36   37   38   39   40   41   42   43   ...   46
Бақылау сұрақтары:

  1. Компилятордың бағдарламаны автоматты түрде параллельдеу процесі.

  2. Берілген архитектураның потенциалын толық пайдалану үшін, негізгі үш есепті шешу жолдары.

  3. Фрагменттің ақпараттық құрылымы, n = 10.

  4. Компиляторға жөн сілтеулердің әртүрлі формада өрнектелуі.

Пайдаланылған әдебиеттер
1. Воеводин Вл. Параллельные вычисления. Санкт-Петербург, 2012 г.
2. Грегори Р. Эндрюс. Основы многопоточного, параллельного и распределенного программирования. Пер. с. англ. –М.: Издательский дом «Вильямс», 2013 г.
3. Акжалова А.Ж. Параллельные вычисления (учебное пособие). – Алматы, 2014 г.
4. Дүйсембиев Е.Е. Параллель есептеулер. Оқулық – Алматы 2011 ж.


27-Дәріс
Тақырыбы: OpenMP бағдарламалау технологиясы.
Жоспар:

  1. ОреnМР технологиясының ерекшеліктері.

  2. «Процесс» және «жіп» түсініктері.

Бүгінгі күні ортақ жадылы компьютерлер үшін ең танымал бағдарламалау құралдарының бірі OpenMP (Open specifications for Multi-Processing) (www.openmp.org). Ол дәстүрлі бағдарламалау тілдеріне және арнайы комментарилерді пайдалануға негізделген. Оның бастауына тізбекті бағдарлама алынады, ал оның параллель нұсқасын құру үшін пайдаланушыға директивтер, функциялар және ортаның айнымалыларының жиыны ұсынылады. Сонымен қатар, құрылатын параллель бағдарлама OpenMP АРI-ді қолдайтын бөлінетін жадылы әртүрлі компьютерлер арасында тасымалданатын болады деп есептеледі.
OpenMP технологиясының өзіндік ерекшелігі, ол пайдаланушыға параллель және тізбекті де орындалу үшін бағдарламаның бір нұсқасын ғана иеленуге мүмкіндік береді. Сонымен қоса мұнда тек параллель режимде дұрыс жұмыс істейтін немесе тізбекті режимде басқа нәтиже беретін бағдарламалар құрастыру мүмкіндігі де қарастырылған.
Стандартты құрастырумен коммерциялық емес ұйым OpenMP ARB (Architecture Review Board) айналысады, және оған SMP-архитектурасын және бағдарламалық қамтамалар құрастыратын ірі компаниялардың өкілдері кіреді (IBM, Intel, Sun, Hewlett – Packard және т.б.). OpenMP дәстүрлі бағдарламалау Fortran, Си/Cи++ тілдерімен жұмыс істей алады. OpenMP спецификациясының бірінші нұсқасы 1997 жылы қазан айында пайда болды, және ол Фортран бағдарламалау тіліне арналған болатын, ал Си/Cи++ тіліне арналған спецификациясы 1998 жылы қазан айында пайда болды. Қазіргі кездегі стандарттың ресми спецификациясы - OpenMP 3,0 (2008 жылы май айында қабылданды).
POSIX threads терминологиясына сәйкес, кезкелген UNIX-процесс адрестік кеңістіктері ортақ, бірақ командалар ағыны әртүрлі және бөлек стектері болатын бірнеше басқару жіптерінен тұрады. Жіптерді кейбір жағдайларда ағындар, жеңіл процестер, LWP (light-weight processes) деп те атайды.
OpenMP параллель есептеулерді көпағындылық UNIX көмегімен іске асырады, онда «басты» (master) ағын «бағыныңқы» (slave) ағындардың жиынын құрады және есеп солардың арасында таратылады. Ағындар бірнеше процессорлы машиналарда параллель орындалады деп болжанады және онда процессорлар саны ағындар санынан үлкен немесе тең болуы міндетті емес.
Енді ОреnМР ережелері шеңберінде, пайдаланушы өзінің параллель бағдарламасын қалай көрсету керек? Бағдарламаның бар тексті тізбекті және параллель облыстарға бөлінген (44 сурет).

44 сурет. ОреnМР: бағдарламаның орындалу процесі
Бастапқы уақыт мезетінде жіп-мастер (нить-мастер) немесе "басты" жіп туындайды және ол бағдарламаның орындалуын стартты нүктеден бастайды. Сонымен қатар ол тек өзі ғана бағдарламаның барлық тізбекті облыстарын орындайды. Параллельділікті қолдау үшін мұнда FORK/JOIN схемасы пайдаланылады. Параллель облысқа енген кезде жіп-мастер қосымша жіптерді туындатады (FORK операциясы орындалады). Одан кейін әрбір қосымша жіп өзінің бірегей нөмірін алады, ал жіп-мастердің нөмірі әрқашан 0. Барлық қосымша туындаған жіптер пареллель облысқа сәйкес келетін бір кодты ғана орындайды.
Параллель облыстан шығар мезетте басты жіп қалған жіптердің аяқталуын күтеді және бағдарламаның ары қарай орындалуын өзі ғана жалғастырады (JOIN операциясы орындалады).
Параллель облыста бағдарламаның барлық айнымалылары екі класқа бөлінеді: жалпы (SHARED) және жергілікті (PRIVATE). Жалпы айнымалылар бағдарлама үшін әрқашанда бір экземплярда ғана болып, барлық жіптерге бір атпен ғана қолжетімді болады. Жергілікті айнымалыларды хабарлау әр жіп үшін әрбір айнымалының өз экземплярын туындатады. Жіптің өзінің жергілікті айнымалысының мәнін өзгертуі, басқа жіптердегі дәл осы жергілікті айнымалының мәнінің өзгеруіне ешқандай әсері жоқ. Негізінде, бағдарлама облыстарының соңғы қарастырылған түсініктері және айнымалылар кластары ОреnМР шеңберінде параллель бағдарламалар жазудың жалпы идеяларын анықтайды: бағдарлама текстінің кейбір фрагменттері параллель облыстар болып хабарланады; тек осы облыстар ғана жіптер жиынымен орындалады, ал олар жалпы айнымалылармен де жергілікті айнымалылармен де жұмыс істей алады.
ОреnМР негізгі конструкциясы мен базалық құрылымын қарастырайық [2]. Ондағы барлық директивалар комментарилерде орналасады және келесі комбинациялардың бірінен басталады: !$ОМР, С$ОМР немесе *$ОМР (еске сала кетсек '!', 'с' или '*' символдарының бірінен басталатын жол, Fortran тілінің ережелері бойынша комментарий болып есептеледі).
Бұдан әрі нақты директиваларды суреттеу кезінде жазуды қысқарту үшін, кейбір кездерде біз бұл префикстерді көрсетпейтін боламыз, әрине шын бағдарламаларда олар әрқашан қатысуы қажет.
Оре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(<шарт>)
Егер <шарт> орындалмаса, онда директива қосылмайды, бағдарламаны өңдеу бұрынғы режимде жалғасады.
Жоғарыда, туындаған жіптердің бәрі бір ғана кодты орындайды деп айтылған болатын. Енді олардың арасында жұмысты қалай тиімді түрде бөлуге болады деген сұрақты талқылау керек.
ОрепМР шеңберінде жұмысты бөліп беру үшін келесі төрт нұсқаны пайдалануға болады:

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

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

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

  • код участогын бір рет қана орындау үшін SINGLE директивасы.

Төменгі деңгейдегі бағдарламалау OMP_GET_THREAD_NUM және OMP_GET_NUM_THREADS функцияларының көмегімен жұмысты таратуды көздейді, олар сәйкесінше жіп нөмірін және туындаған жіптердің жалпы санын қайтарады.


Достарыңызбен бөлісу:
1   ...   36   37   38   39   40   41   42   43   ...   46




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

    Басты бет