Параллель программалау. Программалау тілдері

Берілген тарауда программалау құралдары қарастырылады, дербес жағдайда хабар беруді және процесстерді синхрондаудыұйымдастыру үшін кітапханалар дәлірек сипатталады: PVM, MPI,BSP,OpenMP. сондай-ақ параллель программалау тілдері:Occam, HPF

PVM-Параллель виртуальды машина

Автопараллельдеуциклдың өзімен, циклды қайта реттеу мүмкіндігімен жиі шектеледі, әсіресе көмекші программаларды сұрыптауларға тәуелді программалартууы мүмкін.

Параллель программалауда түсініктемелертүрінде өрнектелгенплатформа аралықжылжуды, тізбектіархитектураны қосакомпилятордирективаларынжиі қолданады.Сондай-ақ PVM, MPI кітапханаларынқажетететінтізбектітілдердіңкеңейтулерінқолданады.

Хабарберумоделінекіретін PVM параллельмоделінқарастырайық.

Параллель виртуальдымашинаныжалпыесептеунәтижесіналуғақатысатынкөптегенесептердіорындауғаарналғаннақтыесептеукомплексінің құралының(процессор,жады,сыртқықұрылғыларжәне т.б.)бірбөлігідепанықтауғаболады.жалпыжағдайдаесептер саны PVM-ге (http:/www.netlib.org/pvm3/pvm3.4.beta4.Win32.zip қара)кіретінпроцессорларасыпкетуімүмкін. параллель виртуальдымашинасыретіндежекеалынғандербескомпьютер, сондай-ақ параллельархитектурасыбарсуперкомпьютерібаржергілікті желі, универсал ЭЕМ, графикалық жұмысстанцияларыжәнедербескомпьютерлерболаалады.Осыпрограммалықжасаунегізіндеқолданушыкөптегенесептерпараллельорындалумүмкіндегібарбірғанаесептеумашинасыменсұхбаттасадыдепесептеугеболады.

PVM-нің жұмысістеуіондаорындалатынесептерарасындағы хабар алмасумүмкіндігінесүйенеді.мұндайжағдайдаPVM-дівиртуальдымашинағабірнешепроцессоржәнежалпынемесежеке ЖСҚ-жеделсақтауқұрылғысын-ОЗУ (шартқабайланысты) бөліпкөппроцессорлыесептеу комплексіндежасағаныңғайлы.бұлжағдайда,PVM-дегіесептерарасындағыжылдамақпараталмасумәселелеріжеңілдейді, сондай-ақәртүрліпроцессорларорындайтынесептерарасындағыдеректердіөрнектеуформаттарынмақұлдаумәселелеріжеңілдейді.

PVM-діқолданудыңбастымақсаты- есептеулержылдамдығынолардыпараллельорындауарасындаарттыру.Тиімділіктіңжоғарғышекарасықарапайымбағаланады- егересептеуүшінбірпроцессорорнынаN біртиптіпроцессорлардықолдансаесептеууақыты N реткемиді. Нақтыұтысесептіңерекшелігінежәнеесептеупрограммасындаесептіңерекшелігіжәне PVM-ніңаппараттықжәнепрограммалықсипаттамасықаншалықтыескерілгенінебайланысты.

PVM менқатар берілгенмоделідіңграфикалықинтерфейсі- XPVM.XPVM процестердіңжүктеууақытын,күтууақытын, хабаржіберууақыттарынкөругемүмкіндікбереді.

PVM-3 жүйесіндегібелгілібірпроцессорданжіберілген әрбіресепбүтінсанменанықталады, оныесепидентификаторыдепатайды.Жәнемағынасыжағынан Linux операциялықжүйесіндегіпроцессидентификаторынаұқсас. Мұнда, PVM-нің NпроцессіндепараллельжіберілгенбірорындауфайлыныңкөшірмесіәртүрліTID бар N есепқұрады.

PVM-дегіесептердіңөзараәрекеттесуіндегіберілгенмодельдебір PVM-дегікез келгенесепкез келгенбасқаесепкехабарбереалады,жәнеосындайхабарөлшеміменсанышектелмеген.Буферлікқұрылғыларыныңтолыпкетуінжәнемассивтердібақылаутек жекеоперациялықжүйелердіенгізугекеліптіреледі.

Есепаралықақпараталмасудыңтиімділігінарттыру үшін бірнешеалгоритмдердіқолданукерек. Жеке жағдайдабуғатталған хабаржіберуалгоритмінқолдануғаболады, «хабарберу » функциясымәнінқайтарады (яғнижұмысаяқталады). Мұндайжеткізілгендігітуралыхабардыкүтетінхабар беруалгоритміұзынхабарбірнешебөліктергежіберілгенде, сондай-ақорындауретіуақытбойыншақатаңбекітілгенкомандаларалмасуыкезіндеқолданылғандұрыс.

Хабарберужәнеқабылдаудыңблоктыемесалгоритмінқолданғанда «әңгімелесушінің»жауабынкүтукезіндегі процессорлартоқтап қалуыназайтады. Әсіресебұл қабылдаушыжағындахабардыңкелууақытыбелгісізболғандааса тиімді. Қабылдаупроцессорыныңжұмысын, тек арасындақабылдаубуферінсұрайотырып, хабаркүтукезіндеағымдағыжұмыстыорындайтындайетіпұйымдастыруғаболады.

Берілгенмодельгетерогенді компьютержиынынбіржоғарытиімдіпараллельмашинаретіндежұмысістеугемүмкіндікбереді. Берілгенмодельдіқолданудадеректер форматындағыөзгешелікткрі мен тораптаржылдамдығындағыөзгешеліктердітүсінумаңызды.

Жіберуші және қабылдаушыжақтарындағы буферлік массивтер үшін жады динамикалық бөлінеді, яғни хабарлардың максимальдыкөлемі қатынау жадысыныңкөлемімен шектелген. егер PVM-дежіберілген бір есеп, басқаесептерменсұхбаттасу үшінқажеттіжадыны ала алмаса, онда олқолданушығасәйкесесептербұлоқиғатуралыхабарбереді, бірақбасқаесептербұлоқиғатуралыхабардарболмайдыжәнеоған хабаржіберудіжалғастыра береді.

 Тораптар, басқақолданушыларменбөлінуүшінқажет, сондықтанжоғарытиімдіжелі қажет болады.

PVM— функциональдысұраныстар.

Процесстіқұружәнехабарберуфункциясы C/C++/Fortran програмаларынаншақырылады. Негізгіфункцияларды қарастырамыз:

pvm spawn-процесс тудырады

pvm send- белгіленгенпроцесске асинхронды хабар береді.

pvmrecv-белгіленгенпроцесстен немесе басқа кез келген процесстенбұғатталған қабылдау

pvmnrecv-бұғатталмағанқабылдау

pvmmcast-белгіленгенпроцесстерге дерекжіберу.

Келесіфункцияларды қолданыпбуферге/буферденбуыптүйеді/шешеді:

pvmpkint- бүтінсандарды(бір немесе оданкөп) буыптүйеді

pvmupkint- бүтінсандарды(бір немее одан көп) шешеді

pvm spawn функциясынтолығыраққарастырайық:

pvm spawn (char*task, char**argv,

int flag, char*where,

int ntask,int*tids);

task- туындалатын есепатауы;

argv- соңынданольдіксимволыбаресептерпараметрі

flag- нұсқалар(0 есептердіқайжердетуындалатынын анықтау

PVM-ге беріледі )

where- есептіңқайдатуындалатынынанықтайды

 ntask-туындалатынесептердіңкөшірмесаны;

tids- туындалатынесептеридентификаторы, int туындалғанесептерсанынқайтарады.

буып-түюі/шешуіменқатархабардыжіберунемесеалуүшінбуфергекелесіфункциялардықолданыпорналастыру керек:

 pvm initsend, pvm mkbuf, pvm setsbuf

pvm initsend(int encoding)-хабарберуүшінкелісімбойыншаағымдағыбуфердіинициалдайды; әдеттекодтауүшін PvmdatdDefault-нықолданады.

pvm mkbuf(int encoding)- жіберу үшінжаңабуферқұрады жәнеидентификатордықайтарады;

pvm setsbuf(int bufіd)- буфергежіберіп/алу үшінағымдағыбуфердіbufіdатауыменорнатады;

pvm send (int tid, intmsgtag)

tid- хабаржіберушіидентификаторы;

msgtag- осыхабартегі

pvmsendтоптықнұсқау tid пенидентификацияланғанбарлықесептергехабаржібереді.

PVM-ге даярлау

Pvmspawn()функциясыүшін орындалатын фуекциябелгілібіркаталогтаболады.Linux-теесеп$PVM ROOT/bin/$PVM ARCH/ және $HOME/PVM/bin/$PVM ARCHкаталогтарынан3зделед37

PVM ROOT/usr/local/pvm/currentжиынтығы.

Pvm-ді орындауүшінmaster және slave-тікомпиляциялапжәнебайланыстыруүшін aimk қолданукерек.

Pvm-діжіберуүшінpvmd.exe — даменін қолданукерек. Жаңакомпьютерлердіқосукерек: addhost<хостатауы>.Тапсырманы орындауүшінspawn-> <hostcode>, консольдықрежимдетеріпорындаукерек. PVM-дітоқтатуexitкомандасыменорындалады.

MPI – хабарберуинтерфейсі  

MPIпараллельпрограммалаудыңалғашқықұралдарыныңбірі. MPI кітапханасынқолданғандаторапүлестірілгенпрограммаларпроцессіС және Fortran сияқтытізбектіпрограммалартілдеріндежазылады.ПроцесстердіңөзараәрекетіжәнеолардысинхрондауMPIкітапханасынапроцедураларыншақырукөмегіменберіледі.

MPIқосымшаларынпрограммалауинтерфейсін90-жылдардыңортасындауниверситеттер,үкіметжәнеөндіріұйымдарыныңжобалаутоптары құрған.Мақсат- әртүрлікөппроцессорлымашиналардатиімдіжүзегеасыратынбірдейкітапханажасау.БүгінгікүніMPIстандартқаайналды.

MPIкітапханасынқолданушыпрограмманыңSPMDстиліболады.Олалдыңғытауарларасипатталған.Берілгенжағдайдаәрбірпроцессбірғанапрограмманыңкөшірмесінорындайды. ПрограмманыңәрбірэкземплярыMPIкітапханасыныңфункцияларыншақыруарқылыөзараәрекеттеседі, оларпроцесстер, топтаржәнеқоршағанортаныңөзараәрекеттерінқамтамасызетеді.

MPIфункционалдықсұраулардыңкейбіреулерінқарастырамыз.

MPIInit- MPIкітапханасынинициализациялайдыжәнепрограммағаберетінкомандалықжолдыңаргументерініңкөшірмесінқайтарады.Нәтижесіндежіберілгенпроцесстержиыныинициаланады.

MPI Comm size- жіберілетінпроцесстерсанынанықтайды.

MPI Send- процестіңпроцессрангін(идентификатор) анықтайды.0-ден1-гедейінгісандар болаалады.

MPI Recv- хабардыберудібұғаттау.Басқапроцесскехабарбереді.

MPI Finalize-MPIкітапханасын«алыптастайды»жәнепроцесстіаяқтайды.

MPI SendжәнеMPI Recvкітапханаларынтолығыраққарастырайық:

Int MPI Send(void*buf, intcount, MPI DatatypedataType, intdest, inttag, MPIComm comm)

Мұндағыbuf,-буферадресініңбасы, count-жіберілетінэлементтер саны;dataType-әрбірэлементтипі,мысалы: MPIInt, MPIDouble, MPIChar,жәнет.б.; dest-адресат рангісі; tag-хабартэгі; comm.-коммуникатор.

IntMPI Recv (void*buf, intcount,

MPI DatatypedataType,

intsource, inttag,

MPIComm comm,

MPIStatus*status)

Мұндағыstatus-қайтарукүнінқайтарады, source-беретінпроцессидентификаторынемесе«немқұрайлы»; tag- хабарбелгісі;қалғанаргументтер MPI Send процедурасында сипатталғансияқты.

MPIкітапханасыныңкөмегіменекіпроцессарасындағымәндердіалмастырупрограммасыныңбірінкелтіреміз.

#include<mpi.h>

 #include<stdio.h>

main(int argc, char*argv[])

Int myid,otherid,size;

Int length=1, tag=1;

Int myvalue, othervalue;

MPI Status status;

MPIInt

MPIComm

MPIComm