Берілген тарауда программалау құралдары қарастырылады, дербес жағдайда хабар беруді және процесстерді синхрондаудыұйымдастыру үшін кітапханалар дәлірек сипатталады: 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