6.6. OpenMp
OpenMp – компилятор директиваларының және көмекші программалар жиынтығы. Жады бөлінетін параллельдікті өрнектеу үшін қолданайық. OpenMp үшін қолданбалы программалық интерфейстер (Apis) жоғары әрекеттесуші апараттық және программалық жасау шығарушылар тобымен құрылған Фортран интерфейсі 1997 жылдың соңында анықталған, С/С++ интерфейсі 1998 жылдың аяғында, бірақ екеуінің стандартталуы жалғасуда, Интерфейстер сол бір функцияны қамтамасыз етеді, бірақ Фортран, С және С++ лингвистикалық өзгешеліктеріне байланысты әр түрлі өрнектеледі.
OpenMp интерфейс негізінен компилятор дтрективасының жиынтығынан жасалған. Программис оны тізбекті программа компяторға программаның қай бөлігі паралель орындалуы керек және синхрандау нүктелерінің беру үшін қосады. Директиваларды біртіндеп қосуға болады, сондықтан OpenMp бар программалық жасауды паралельдеуді қамтамасыз етеді. MPI – көмекші программадан тұрады, олар тізбекті программадан шақырылады және олармен біріктіріледі де программистен процесс арасындағы жұмысты қолмен үлестіруді талап етеді.
Төмендегі Якоби әдісінің Фортан программасы үшін OpenMp-ні қолдану сипатталған.
OpenMp-де «тармақталу-тоғыстыру» моделі қолданылады. Алдымен бір орындалу ағыны болады. Parallel директивасының бірін кездестіргенде компилятор бір ағынды бірнеше ішкі ағындар бірігіп көптеген жұмыс ағындарын құрады. Нақты жұмысшы ағындар санын компилятор орнатады немесе қолданушы анықтайды немесе орта айналасы (environment) көмегімен статикалық түрде немесе OpenMp кітапханасынан көмекші программаны шақыру көмегімен динамикалық түрде анықталады.
OpenMp көмегімен программаны паралельдеу үшін программист алдымен паралель орындалатын программа бөліктерін анықтайды, мысалы, циклдар және оларда parallel және end parallel директиваларымен қоршайды. Әрбір жұмысшы ағын бұл кодты итерациялар кеңістігінде әртүрлі ішкі жиындарды өңдей отырып немесе әртүрлі көмекші программаларды шақыра отырып орындайды. Одан кейін программаға орындалу барысында ағындарды синхрондау үшін қосымша директивалар қосылады. Осылайша, компятор ағындарды бөлу және олардың арасындағы жұмысты үлестіруге жауап береді, ал программист жеткілікті синхрондауды қамтамасыз ету керек.
Нақты мысал ретінде келесі тізбекті кодты қарастырамыз, онда grid және new ішкі нүктелерінің алғашқы мәндері ноль:
Do j=2,n-1
Do i=2, n-1
Grid(I,j)=0.0
new(i,j)=0.0
End do
End do
Берілген кодты паралельдеу үшін оған OpenMp-ң үш директивасын қосамыз:
!$omp parallel do
!$omp&shared(n,grid,new), private(i,j)
do j=2,n-1
do j=2,n-1
grid(i,j)=0.0
new(i,j)=0.0
enddo
enddo
!$omp end parallel do
Компилятордың директивасы !$omp-дан басталады. Бірінші паралель do циклының басы. Екіншісі біріншісін толықтырады, !$omp-ге & символын қосып белгіленген. Екінші директивада барлық жұмысшы ағындарда n, grid және new бөлінетін айнымалылар, ал i және j жергілікті айнымалылар екендігін хабарлайды. Соңғы директива do паралель цикл соңын және соңын білдіреді және айқын емес тосқауылды синхрондау нүктесін анықтайды.
Берілген мысалда компилятор сыртқы do циклі интерациясын бөледі (j бойынша) және оларды жұмысшы процесстерге кейбір іске асыруға байланысты әдістерге тағайындайды. Тағайындауды басқару үшін программист Schedule сөйлемін қосу керек. OpenMp де тағайындаудың әр түрі бар, соның ішінде блок бойынша, жолақ бойынша (циклдық) және динамикалық (есептер портфелі). Әрбір жұмысшы ағын оған тағайындалған баған бойынша ішкі циклын орындайды.
С++ тілінде паралельдеу директивасы былай болады:
#pragram omp parallel {clause list}
Достарыңызбен бөлісу: |