
- •Isbn 978-601-217-247-8
- •Есептеу машиналары
- •§1.1.1 Параллель виртуалды машиналар
- •1 Сурет. Vm/sp, vм/ха, vn/еsа машиналары
- •2 Сурет. Виртуалды машина жүйесі
- •3 Сурет. VMware терезесі
- •4 Сурет. Бір компьютерде бірнеше операциялық жүйе
- •5 Сурет. Вм консолынің мысалы
- •6 Сурет. Виртуалды машиналар жүйесінің архитектурасы
- •§1.1.2 Виртуалды машиналардың түрлері
- •§1.1.3 Виртуаландыру - ақпараттық жүйелерді реттеудің басты жолы
- •§1.2.1 Компьютердің аппараттық құрылымын жетілдіру
- •7 Сурет. Бір операцияны бес тактіде орындайтын тізбекті құрылғының
- •8 Сурет. Бір операцияны әрбірі бес тактіде орындайтын екі бірдей тізбекті
- •10 Сурет. Конвейерлік құрылғы өнімділігінің кіріс деректер
- •11 Сурет. Illiac IV матрицалық жүйесінің жобасы
- •§1.2.2 Компьютерді басқарудың интеллектуалдығын жоғарылату
- •12 Сурет. Ортақ жадылы параллель компьютерлер
- •13 Сурет. Таратылған жадылы параллель компьютерлер
- •14 Сурет. Ортақ шиналы мультипроцессорлық жүйе.
- •15 Сурет. Матрицалық коммутаторлардағы
- •16 Сурет. Омега - желі мультипроцессорлық жүйесі.
- •17 Сурет. Мультикомпьютерлерлік жүйелер байланыс топологияларымен: а – сызықша; б – дөңгелек; в – жұлдызша
- •18 Сурет. Процессорлардың байланыс топологияларының нұсқалары
- •19 Сурет. Сm* есептеу жүйесінің сызбасы
- •20 Сурет. Bbn Butterfly есептеу жүйесінің сызбасы
- •§1.2.3 Функционалды құрылғылар жүйесі
- •§1.3.1 Параллель компьютерлер және жүйелер классификациясы
- •21 Сурет. М. Флин классификациясының sisd және simd кластары
- •22 Сурет. М. Флин классификациясының misd және mimd кластары
- •23 Сурет. Mimd класына р. Хокнидың қосымша
- •§1.3.2 Векторлы-конвейерлік компьютелер
- •24 Сурет. Cray c90 компьютерінің жалпы сүлбесі
- •25 Сурет. Cray c90 компьютері жадысының бөлінуі
- •26 Сурет. Cray c90 компьютерінде векторлық операциялардың орындалуы
- •27 Сурет. Cray c90 компьютерінде векторлық операциялардың ілінісуі
- •§1.3.3 Ортақ жадылы параллель компьютерлер
- •28 Сурет. Hewlett Packard Superdome компьютері
- •29 Сурет. Hewlett Packard Superdome компьютерінің
- •§1.3.4 Таратылған жадылы есептеу жүйелері
- •30 Сурет. Cray t3e компьютерінің коммуникациялық торы
- •31 Сурет. Cray т3d/t3e компьютерлеріндегі барьерлі синхрондау
- •32 Сурет. Есептеу кластерінің жалпы схемасы
- •33 Сурет. Мвс-1000м суперкомпьютерінің құрылымы
- •34 Сурет. Коммуникациялық ортаның латенттілігі және өткізу қабілеті
- •§1.3.5 Метакомпьютинг
- •§2.1.1 Үлкен есептер және үлкен компьютерлер
- •35 Сурет. Сандық эксперименттің этаптары
- •§ 2.1.2 Алгоритм графы және параллель есептеулер
- •§ 2.1.3 Шексіз параллелділік концепциясы
- •§ 2.1.4 Ішкі параллельділік
- •37 Сурет. Матрицаларды көбейту графы
- •38 Сурет. Үшбұрышты жүйелерге арналған графтар
- •39 Сурет. Блокты-екідиагоналды жүйеге арналған Макрограф
- •40 Сурет. Блокты-екідиагоналды жүйеге арналған граф
- •41 Сурет. Жалпыланған пралллель форманың ярустары
- •42 Сурет. Графтағы микро және макропараллельділік
- •§2.2.1 Дәстүрлі тізбекті тілдерді пайдалану.
- •§2.2.2 OpenMp бағдарламалау технологиясы
- •44 Сурет. ОреnМр: бағдарламаның орындалу процесі
- •§2.2.3 Хабарлама жіберу негізіндегі бағдарламалау жүйелері. Mpi бағдарламалау жүйесі
- •Int mpi_Comm_rank(mpi_Comm comm, int *rank)
- •Int mpi_Send(void *buf, int count, mpi_Datatype datatype, int dest, int msgtag, mpi_Comm comm)
- •Integer count, datatype, dest, msgtag, comm, request, ierr
- •Int mpi_Isend(void *buf, int count, mpi_Datatype datatype, int dest, int msgtag, mpi_Comm comm, mpi_Request *request)
- •Int mpi_Irecv(void *buf, int count, mpi_Datatype datatype, int source, int msgtag, mpi_Comm comm, mpi_Request *request)
- •Integer count, datatype, source, msgtag, comm, request, ierr
- •Int main(argc,argv)
- •Int argc;
- •Include 'mpif.H’
- •Integer ierr, rank, size, prev, next, reqs(4), buf(2)
- •Integer stats(mpi_status_size, 4)
- •Int mpi_Waitany( int count, mpi_Request *requests, int *index, mpi_Status *status)
- •Integer count, requests(*), index, status(mpi_status_size), ierr
- •Int mpi_Waitsome( int incount, mpi_Request *requests, int *outcount, int *indexes, mpi_Status *statuses)
- •Integer incount, requests(*), outcount, indexes(*), ierr,
- •Int mpi_Test(mpi_Request *request, int *flag, mpi_Status *status)
- •Integer request, ierr, status(mpi_status_size)
- •Int mpi_Testall( int count, mpi_Request *requests, int *flag, mpi_Status *statuses)
- •Integer count, requests(*), statuses(mpi_status_size,*), ierr
- •Int mpi_Testany(int count, mpi_Request *requests, int *index, int *flag, mpi_Status *status)
- •Integer count, requests(*), index, status(mpi_status_size), ierr
- •Int mpi_Testsome( int incount, mpi_Request *requests, int *outcount, int *indexes, mpi_Status *statuses)
- •Integer incount, requests(*), outcount, indexes(*), ierr,
- •Int mpi_Iprobe( int source, int msgtag, mpi_Comm comm, int *flag, mpi_Status *status)
- •Include 'mpif.H’
- •Integer ierr, rank, size, n, nl, I, j
- •Integer irr, status(mpi_status_size), req(maxproc*2)
- •If(ir .Ne. Rank)
- •Int mpi_Send_init( void *buf, int count, mpi_Datatype datatype, int dest, int msgtag, mpi_Comm comm, mpi_Request *request)
- •Integer count, datatype, dest, msgtag, comm, request, ierr
- •Int mpi_Recv_init( void *buf, int count, mpi_Datatype datatype, int source, int msgtag, mpi_Comm comm, mpi_Request *request)
- •Integer count, datatype, source, msgtag, comm, request, ierr
- •Integer сомм, ierr
- •Include 'mpif.H’
- •Integer ibuf(maxproc)
- •Integer req(2*maxproc), statuses(mpi_status_size, maxproc)
- •Integer count, datatype, root, comm, ierr
- •Integer scount, stype, rcount, rtype, root, comm, ierr
- •Integer scount, stype, rcounts(*), displs(*), rtype, root, comm, ierr
- •Integer scount, stype, rcount, rtype, root, comm, ierr
- •Int mpi_Bcast(void *buf, int count, mpi_Datatype datatype, int source, mpi_Comm comm)
- •Int mpi_Gather( void *sbuf, int scount, mpi_Datatype stype, void *rbuf, int rcount, mpi_Datatype rtype, int dest, mpi_Comm comm)
- •Int mpi_Scatter(void *sbuf, int scount, mpi_Datatype stype, void *rbuf, int rcount, mpi_Datatype rtype, int source, mpi_Comm comm)
- •Int main(argc,argv)
- •Int argc;
- •Int numtasks, rank, sendcount, recvcount, source;
- •Int mpi_Barrier (mpi_Comm comm)
- •§ 2.2.4 Бағдарламалаудың басқа тілдері және жүйелері.
- •Параллель есептеуде қолданылатын қысқаша қазақша-орысша терминологиялық сөздік
- •Параллель есептеуде қолданылатын қысқаша орысша-қазақша терминологиялық сөздік
- •Және орта айнымалылары
- •Mpi функциялары
42 Сурет. Графтағы микро және макропараллельділік
Қандай да бір тәсілдермен (2.13) алгоритміндегі баяу жадтың қолданылу тиімділігін арттыруға болады ма, егер болса қалай? Бұл сұрақтың жауабын алгоритм графын тереңірек зерттеу арқылы ала аламыз. Алгоритм графында 42, а горизонталь ярустарымен параллель формадан бөлек, көлбеу ярустарымен жалпыланған параллель формалар да бар. Мысалы жалпыланған параллель формаларды i + j = const және i - j = const түзулерінде ярустарға төбелерді жинақтау арқылы алуға болады. Осындай ярустардың кейбірі 42, б-суретте пунктирлі сызықтармен көрсетілген. Белгіленген ярустар графтың берілу облысын көпқырларға бөледі. Енді (2.13) алгоритмін алынған көпқырлар бойынша параллель іске асыруға болады. Сонымен қатар, бір көпқырға қатысты барлық операциялардың орындалуы барлық уақытта бір процессорға жүктеледі. Параллель орындалу кезінде ең алдымен 44, б-суретіндегі штрихталған төмендегі көпқырларға сәйкес операциялар орындалады. Одан кейін жанындағы көрші штрихталмаған көпқырларға сәйкес келетін операциялар параллель орындалады және т.с.с.
Жаңа процесте бір көпқырдың операциялары макрооперацияға айналады. Макрооперацияның орындалу уақыты көпқырдағы төбелердің санымен анықталады, ол шамамен көпқырдың ауданына пропорционал. Көпқырлар өзара ақпараттық байланысты шекара маңында жатқан төбелер арқылы жүзеге асырады. Яғни, макрооперацияның орындалуы үшін қажетті ақпаратты жадтан алу уақыты, көпқырдың шекарасының ұзындығымен анықталады. Көпқырлардың өлшемдерін еркін таңдауға болады. Олар тек жалпыланған параллель формалардың қандай ярустары олардың шекараларын құрайтынына байланысты болады.
Әрқашанда графтың берілу облысын бөлуді, ондағы көпқырлардың басым көпшілігінің шекара ұзындықтарының олардың аудандарына қатынастары өте аз болатындай етіп таңдауға болады. Бұндай макрооперациялардың орындалуы кезінде баяу жадқа қатынасу уақытының әсері өте қатты төмендейді.
Осы уақытқа дейін алгоритмдердің параллель формалары негізінен тәуелсіз операциялардың жиынын анықтау үшін қолданылып келді десе болады. Осы мысал көрсеткендей, олар баяу жадтың тиімді пайдаланылу мүмкіндіктерін зерттеу үшін де пайдасы болуы мүмкін екені анық. Айта кету керек, жоғарыда жасалған ой, пікірлер параллель компьютерлер және кәдімгі қарапайым компьютерлер үшін де бірдей орынды болады.
Жоғарыда қарастырылған мысалдар көрсеткендей, көптеген алгоритмдерде шынында да параллельділіктің үлкен қорлары бар. Параллельділікті анықтау үшін немесе оның жоқ екенін бекіту үшін алгоритмдердің графтарын және олардың параллель формаларын білу үлкен роль атқарады. Сонымен қатар, алгоритмдер графтарын және олардың параллель формаларын, компьютерлерде (параллель болуы міндетті емес) алгоримдерді іске асыруға қатысты көптеген басқа сұрақтарды шешу үшін де тиімді қолдануға болатыны белгілі.
Сұрақтар және тапсырмалар
Келесі алгоритмдерден ішкі параллельділікті зерттеңіздер:
Нүктедегі көпмүшеліктің мәнін есептеудің Горнер схемасы.
Нүктедегі көпмүшеліктің мәнін тез параллель есептеу.
Сызықты алгебралық теңдеулер жүйесін шешудің Крамер әдісі.
Сызықты алгебралық теңдеулер жүйесін шешудің Гаусс әдісі.
Сызықты алгебралық теңдеулер жүйесін шешудің Жордан әдісі.
Екі матрицаны көбейту.
(В + ВТ ) А - есептеу, мұндағы А, В - квадрат матрицалар.
АТ (В + ВТ ) А - есептеу, мұндағы А, В - квадрат матрицалар.
АТ (В + ВТ ) - есептеу, мұндағы А, В - квадрат матрицалар.
(А + АТ )ВТ - есептеу, мұндағы А, В - квадрат матрицалар.
2-ШІ ТАРАУ. ПАРАЛЛЕЛЬ ПРОГРАММАЛАУ ТЕХНОЛОГИЯСЫ
Сонымен, сіз параллель бағдарламаны құруды бастадыңыз делік. Есепті түсініп, шешу әдісін таңдап, қажетті компьютер анықталғаннан кейін, барлық ойды компьютерге түсінікті формада өрнектеу ғана қалады. Әрине, айта салғанға оңай. Егер өзіңіздің бұл саладағы тәжірибеңіз әзірше аздау, ал қол жетімді параллель бағдарламалау технологиялары туралы ақпарат айқын жеткіліксіз болса, нені басшылыққа аласыз? Бұл туралы бағыттаушы ой-пікірлер көп болуы мүмкін, бірақ нәтижесінде, сіз бағдарламаны құрастыру уақыты, оның тиімділігі және көшірілуі, бағдарламаның келесі жолы пайдалану интенсивтілігі, оны одан ары дамыту қажеттілігі арасында таңдау жасауыңызға тура келеді. Таңдаудың мәнін жете түсінуге тырыспай тұрып, алдымен келесі үш сипаттаманың сіз үшін қаншалықты маңызды екенін бағалап көріңіз.
Параллель компьютерлердің басты қызметі – ол есептерді жылдам шешу. Егер бағдарламалау технологиясы әртүрлі себептермен есептеу жүйесінің толық қуатын пайдалануға мүмкіндік бермесе, онда оны игеруге күш жұмсаудың қажеті бар ма? Қандай себептер екеніне қазір тоқталмаймыз. Әрине, тиімді бағдарламалар құру мүмкіндігі, бағдарламалау құралдарын таңдауда негізгі аргументтердің бірі екені анық.
Технология пайдаланушыға есептеу жүйесінің ресурстарын пайдалануға және бағдарламаның орындалу процесіне толық бақылау жасауға мүмкіндік бере алады. Ол үшін пайдаланушыға бірнеше жүздеген конструкциялар мен функциялардан тұратын жиынтық ұсынылады. Егер осы ұсынылған құралдарды дұрыс пайдалана алса, онда ол әрине тиімділігі жоғары болатын бағдарлама құрастыра алуы мүмкін. Бірақ, пайдаланушы оны істейді ме? Бұл жерде пайдаланушының өз пәндік аймағынан өзінің есебін шығару керек екенін және онда өздерінің де мәселелері жеткілікті екенін естен шығармауымыз керек. Ол, физик, химик, геолог немесе эколог бола тұрып параллель бағдарламалауға қатысты жаңа мамандықты игеруге үлкен құлшыныс танытады деп айта алмаймыз, оның ықтималдығы төмен. Параллель бағдарламаны тез құрастыру мүмкіндігі басқа факторлармен есепке қатар алынуы керек.
Есептеуіш техника өте тез өзгерістерге түсуде. Осыдан бірнеше жыл бұрын тиімді де тез параллель бағдарлама құрастыруға мүмкіндік беретін «керемет» технология табылды делік. Бүгінгі күні компьютерлердің жаңа буыны дүиеге келгенде не болуы мүмкін, не күтеміз? Мұнда мүмкін болатын екі нұсқаны айта кетелік. Бірінші нұсқа – бұрынғы құрастырылған бағдарламалар бүгінде ешкімді қызықтырмайды, яғни уақтысында пайдаланылды, ал қазір керек емес. Бұндай да болуы мүмкін. Алайда, параллель бағдарламалар құрастыруға өте көп уақыт, күш, қаражат және т.б. қосымшы шығындар жұмсалатындықтан, оларды осылайша жай ұмыта салып, басқа жаңаша құрастыруды бастау әрқашан тиімді ме? Әрине, кім де болса жиналған багажды жаңа компьютер платформасына толық көшіруді қалайды. Бұл ескі бағдарламалар жаңа компьютерде ерте ме кеш пе жұмыс істеп, дұрыс нәтижелер беруі де мүмкін. Бірақ, бір компьютерден екіншісіне көшірілгенде бұл таңдалған технология параллель бағдарламаның тиімділігіне дәл сондай кепілдік бере ала ма? Әрине, жоқ. Жаңа платформа үшін бағдарламаны қайта жаңарту, жетілдіру қажет. Өз кезегінде, жаңа платформаны құрастырушылар керемет тиімді параллель бағдарламаны құрастырудың кезекті жаңа технологиясын ұсынулары да мүмкін. Осылайша көптеген жылдар бойы бағдарламалар көшіріліп жазылуда және айналыста жүруде.
Параллель бағдарламалау технологиясын дұрыс таңдау – бұл шынында да күрделі сұрақ. Егер, параллель компьютерде есептерді шығаруға көмектесе алатын құралдарға үстіртін шолу жасап көретін болсақ, онда ол тізімге 100–ден аса аттарды енгізуге болады [10]: НОРМА, Т-система, ARCH, А++/Р++, ABCL, Adl, Ada, ATLAS, Aztec, BIP, BLACS, BSPlib, BlockSolve95, BERT 77, CVM, Counterpoint, CC++, Charm/Charm++, Cilk, CFX, Cray MPP Fortran, Concurrent Clean, Converse, CODE, DOUG, DEEP, DVM, Erlang, EDPEPPS, F1DAP, FFTW, FLUENT, FM, F—, Fortran 90/95, Fortran D95, Fortran M, Fx, FORGE, GA, GALOPPS, GAMESS, Guassian, GRADE, Haskell, HPVM, HPF, HPC, HPC++, HeNCE, 1CC, JIAJIA, JOSTLE, KELP, КАР, LAPACK, LPARX, Linda, Maisie, Mentat, mpC, MPC++, MP1, MPL, Modula-3, NAG, Nastran, NESL, NAMD, OOMP1, OpenMP, Occam, Orca, Opus, P4, Para++, ParJava, Parsec, Parallaxis, Phantom, Phosphorus, Pict, pC++, P-Sparslib, P1M, ParMETIS, PARPACK, PBLAS, PETSc, PGAPack, PLAPACK, PIPS, Pthreads, PVM, Quarks, Reactor, ShMem, SVMlib, Sisal, SR, sC++, ScaLAPACK, SPRNG, TOOPS, TreadMan, Treadmarks, TRAPPER, uC++, Vienna Fortran, VAST, ZPL.
Кейбір жағдайларда таңдау тез анықталады. Мысалы, қолжетімді компьютерде не орнатылса сіз соны ғана пайдалана алатын жағдайлар болуы мүмкін. Басқа аргумент келесі түрде айтылуы мүмкін: "... барлығы МРI пайдаланады, сондықтан мен де ...". Егер мүмкіндік болса және өзіңіз қаласаңыз, әрине оны орындауға болады. Бұл жерде мамандармен ақылдасқан артық болмайды. Проблемалар бәрібір туындайды, бірақ қашан, қандай көлемде. Егер таңдау дұрыс болса, туындайтын проблемалар да көп болмайтыны анық. Егер таңдауыңыз дұрыс болмаса, үміт үзбеңіз, басқа таңдау мүмкіндігін ойланыңыз. Осылайша бірнеше рет таңдау жасай отырып, сіз осы облыстың маманы болып кетуіңіз де ғажап емес және өзіңіздің жаңа технологияңызды ұсынуыңыз да мүмкін.
Әртүрлі параллель бағдарламалау жүйелерімен танысу барысында келесі мәселеге міндетті түрде көңіл бөлу керек. Егер сіз қарапайым немесе шағын көлемдегі оқу болмаса өндірістік есептерді шешетін болсаңыз, онда параллель есептеу техникасын тиімді пайдалану туралы ойлаудың да қажеті жоқ болуы мүмкін. Бұл жағдайда бағдарламалау жүйесін таңдаудың мағынасы да болмайды. Қалай үлкен есептерді шешу мәселесі басталса, солай тиімді пайдалану сұрағы да туындай бастайды.
Тағы да бір есте болатын нәрсе, кезкелген параллель бағдарламалау жүйесін пайдалануда есептеу жүйесінің өнімділігін арттыру тілегі (берілген есепте) өз кезегінде сізден есеп, бағдарлама немесе алгоритм туралы қандай да жаңа мәліметтерді көптеп талап ете бастайды. Ешқандай параллель бағдарламалау жүйесі, қосымша мәліметтерсіз, есептеу процесінің жоғары тиімділігіне кепілдік бере алмайды.