
- •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 функциялары
35 Сурет. Сандық эксперименттің этаптары
§ 2.1.2 Алгоритм графы және параллель есептеулер
«Қарапайым» компьютерге арналған кезкелген бағдарлама алгоритмдердің қандай да бір жиынтығын сипаттайды. Орындалу барысында қандай да бір алгоритмді таңдау, шартты операторлардың қалай іске қосылуымен анықталады. Өзге операторлардың құрамы мен орындалу реті қатаң түрде бағдарламаның өзі арқылы беріледі. Егер бағдарламада шартты операторлар болмаса, онда бағдарлама басынан-ақ тек бір ғана алгоритмді суреттейді. Өз кезегінде, шартты операторлардың іске қосылуы тек кіріс мәліметтеріне ғана тәуелді. Сондықтан «қарапайым» компьютер, әрқашан бағдарлама мен кіріс мәліметтері арқылы біркелкі анықталып қойған қандай да бір реттелген іс-әрекеттерді орындайды. Оның үстіне, «қарапайым» компьютердің кез-келген өзге модельдерінде де берілген бағдарламаға бұл реттілік біреу ғана, бірдей болады. Осылайша алдын ала нәтижесі де айқындалады. Қорыта келгенде, кез-келген «қарапайым» компьютерде кезкелген бір уақыт мезетінде тек бір ғана операция іске асырылады. Ал қалған кезкелген басқа операция бұл уақытта тек орындалуға дайындық кезеңінен ғана өтіп жатады.
Параллель архитектуралы есептеу жүйелеріндегі үрдіс мүлдем басқаша. Мұнда әрбір уақыт мезетінде бір-біріне тәуелсіз бірнеше операциялар жиынтығы орындалуы мүмкін. Кезкелген параллель жүйеде бағдарлама және кіріс деректері сол жиынтықтардың құрамымен қатар, олардың ретін де бірмәнді анықтайды. Алайда, әртүрлі жүйелерде жиынтықтар мен олардың реттіліктері әртүрлі болуы мүмкін. Дегенмен бірмәнді нәтиже алуды кепілдендіру үшін барлық операциялар жиынының орындалу реті қандай да бір шартқа бағынуы тиіс.
«Қарапайым» компьютердегі сияқты, параллель компьютерде де есептің шешімі көптеген жай операциялардың орындалуы нәтижесінде табылады. Барлық операциялардың санаулы аргументтері болады. Әдетте олардың саны екеуден аспайды. Операция аргументтерінің нақты мәндері ретінде не кіріс мәліметтері, не болмаса өзге орындалған операциялардың нәтижелері алынады. Қай нәтижелер қандай аргументтер болатындығы жөніндегі сәйкестік, бағдарламаны әзірлеуші арқылы белгіленеді. Осыдан түсінетініміз: кезкелген операция – аргументтер тұтынушысы өзіне сол аргументтерді жіберуші – бүкіл операциялар орындалмайынша іске қосыла алмайды. Осылайша, көптеген операциялар үшін бағдарламаны әзірлеуші жартылай реттілікті нақты немесе нақты емес түрде белгілейді. Кезкелген екі операция үшін де реттілік мына мүмкіндіктердің біреуін білдіреді: не операциялардың қайсысы бірінші орындалуға тиіс екендігін көрсетеді; не екі операция да бір-біріне тәуелсіз түрде орындала беретінін білдіреді. Белгілі бір жартылай реттілікте барлық операциялар жиынтығының жалпы мерзімдік реті әртүрлі болуы мүмкін. Сәл кейінірек біз осы реттіліктердің қайсысы болса да бір ғана нәтиже беретіндігін көрсетеміз. Сондықтан, бағдарламада берілген жартылай реттілікті сақтау – нәтиженің бірмәнділігін кепілдендіретін шарттың орындалуы болып табылады. Бір ғана жартылай реттілік көлемінде кезкелген орындалуды таңдауға мүмкіндік бар.
Осы айтылғандарды түсіндіре кетейік. Нақтыланған кіріс мәліметтерінде бағдарлама қандай да бір алгоритмді сипаттайды делік. Бағытталған граф тұрғызайық. Шыңы (төбесі) ретінде кезкелген жиынды алайық, мысалы, алгоритмнің барлық операциялар жиыны өзара-біркелкі бейнеленетін арифметикалық кеңістіктің нүктелер жиынын алайық. Кезкелген екі шыңды алайық: u, v. Жоғарыда сипатталған жартылай реттілікке сай u шыңына сәйкес операция v шыңына сәйкес операцияға аргумент жіберуі тиіс делік. Онда u шыңынан v шыңына доға жүргіземіз. Егер сәйкес операциялар бір-бірінен тәуелсіз орындала алса, доға жүргізілмейді. Операция аргументі бастапқы мәлімет болса немесе операция нәтижесі ешжерде қолданылмаған жағдайда түрлі келісімділік туындауы мүмкін. Мысалы, сәйкес доғалар жоқ деп санауға болады. Немесе бүкіл кіріс мәліметтері мен нәтижелері арнайы енгізу/шығару құрылғылары арқылы енгізіліп – шығарылады деп пайымдауға болады. Бұл жағдайда мұндай операцияларға жауап беретін граф шыңдарында ғана, сәйкесінше, кіретін және шығатын доғалар болмайды. Біз жағдайға байланысты әрекет жасаймыз. Осы тәсілмен құрастырылған графты - нақтыланған кіріс мәліметтері кезіндегі алгоритм орындалуының ақпараттық тәуелділік графы деп атауға да болар еді. Алайда бұл қиындау және күрделі атау. Сондықтан оны бұдан былай жай ғана - алгоритм графы деп атаймыз. Бағытталған графтың тұрғызылу тәсіліне қарамастан, оның бірде-бір кіру немесе шығу доғалары жоқ шыңдарын, сәйкесінше, графтың кіру немесе шығу шыңдары деп атайтын боламыз.
Бұл ұғым біраз түсініктемені қажет етеді. Алгоритм графы үнемі дерлік кіріс мәліметтеріне тәуелді. Бағдарламада шартты операторлар болмаған жағдайдың өзінде ол массивтердің өлшемдеріне тәуелді болады, себебі олар орындалып жатқан операциялардың жалпы санын, яғни граф шыңдарының жалпы санын анықтайды. Сол себептен, негізінде алгоритм графы әрқашан дерлік параметрленген граф болып табылады. Әрине, параметрлердің мәндерінен тек шыңдардың саны ғана емес, доғалардың бүкіл жиынтығы да тәуелді. Егер бағдарламада шартты операторлар болмаса, онда оның өзін де, сол арқылы сипатталған алгоритмді де детерминделген (бөлінген) деп атаймыз. Ал кері жағдайда оларды детерминделмеген (бөлінбеген) дейміз. Детерминделген алгоритм графынің детерминделмеген алгоритм графынан бір маңызды айырмашылығы бар. Детерминделген алгоритм үшін әрқашанда оның бағдарламасын сипаттайтын барлық операциялар және алгоритм графының барлық шыңдары арасында өзара-бірмәндес сәйкестік болады. Ал детерминделмеген алгоритм үшін параметрлердің барлық мәнінде, басқаша айтқанда кіріс мәліметтерінде өзара бірмәндес сәйкестік болмайды. Бұл жағдайда параметрлер мәндерінің әр тобында бағдарламаның барлық операцияларының белгілі бір жиынтықшасы және граф шыңдарының арасында өзара бірмәндес сәйкестік бар деп тұжырымдауға ғана болады. Параметрлердің түрлі мәндеріне түрлі жиынтықшалар сәйкес келе алады.
Ары қарай, егер қосымша толықтырулар болмаса, детерминделген алгоритмдер мен бағдарламаларды қарастырамыз. Бұл шектеуді енгізудің себептері айтарлықтай көп. Біріншіден, олардың құрылысы қарапайымдау және зерттеуді алдымен осылардан бастаған жөн. Екіншіден, детерминделген алгоритмдер мен бағдарламалардың тобы айтарлықтай кең. Кейін көптеген қағаз жүзіндегі детерминделмеген алгоритмдер, негізінен детерминделген дерлік болып келеді. Мысал ретінде, тармақтар кіріс мәліметтерінің мәндеріне тәуелді емес операциялар санын қамтығандағы жағдайды айтуға болады. Мұндай тармақтарды аргументтерінің саны шектеулі үлкенірек операцияларға енгізуге болады. Қорыта келгенде, егер тармақтар үлкен детерминделген фрагменттерді қамтитын болса, онда бәрібір алгоритм графының зерттелуі осы фрагменттерді зерттеуге ұласады.
Қарастырылып отырған алгоритм графы - бағытталған циклсіз мультиграф болып табылады. Оның циклсіздігінің себебі мынада: кезкелген бағдарламада тек нақты есептеулер жүзеге асырылады және ешқандай шама өзі арқылы анықтала алмайды. Егер бағдарламада рекурсивті өрнектер болса да, бұл тек біртипті есептеулерді сипаттаудың қолайлы түрі ғана. Рекурсияға әрбір қатынас жасау кезінде, негізінде әртүрлі операциялар жүзеге асырылады. Жалпы алғанда алгоритм графы - бұл мультиграф, басқаша айтқанда, екі шың бірнеше доғалар арқылы байланыстырылуы мүмкін. Бұл бір ғана операцияның түрлі аргументтері ретінде бір ғана шама қолданылған жағдайда ғана болады. Графты белгілеу үшін стандартты белгіні қолданамыз: G= (V, E), мұндағы V - шыңдар жиыны, E - G графының доғаларының жиыны.
Сонымен, алгоритмнің әрбір мазмұнын (сипаттамасын) бағытталған циклсіз мультиграф тудырады. Керісінше де дұрыс. Егер бағытталған циклсіз мультиграф берілсе, онда оны әркез белгілі бір алгоритмнің графы ретінде қарастыруға болады. Ол үшін әрбір шыңға, сәйкесінше, қанша доға кірсе сонша аргументі бар кезкелген бірмәнді операцияны қою керек. Сол себепті алгоритмдер және қарастырылып жатқан графтардың арасында белгілі бір өзара сәйкестік бар.
Бекітілім 1.2.1
n шыңы бар бағытталған циклсіз граф берілді делік. Графтың барлық шыңдарын 1,2,...., s сияқты индекстердің бірімен белгілеуге болатын s < n саны бар болады, егер доға i индексі бар шыңнан шығып j индексі бар шыңға келсе, онда i < j
Графтан өзіне дейін болмаған кезкелген шыңдар санын алайық та, оларды 1 индексімен белгілейік. Одан белгіленген шыңдар мен оған қатыстырылған иіндерді өшіреміз. Қалған граф та циклсіз болады. Ондағы өзіне дейін болмаған шыңдар санын алып, оларды 2 индексімен белгілейміз. Осы үрдісті жалғастыра отырып, ең соңында бүкіл графты қамтимыз. Әрбір қадам сайын біреуден кем емес шың белгіленіп отырғандықтан, түрлі индекстер саны граф шыңдарының санынан аспайды.
Осыдан шығатын қорытынды, бір индекспен белгіленген ешқандай екі шың доғамен байланыспаған. Графтың барлық шыңдарын белгілеуге болатын индекстердің ең кіші саны оның критикалық жолының ұзындығынан 1-ге үлкенірек болады. Сонымен, шыңдардың жалпы санынан аспайтын, бірақ критикалық жол ұзындығынан үлкен болып келетін кезкелген бүтін s саны үшін, осындай барлық s индекстері пайдаланылатын граф шыңдарының осындай белгілеуі болады.
1.2.1 бекітіліміне сай белгіленген граф – графтың қатаң параллельді түрі деп аталады. Егер параллельді түрде қандай да бір шың к индексімен белгіленген болса, онда бұл осы шыңда аяқталатын барлық жолдардың ұзындығы к-дан кіші дегенді білдіреді. Индексі к болатын шыңда аяқталатын жолдардың ұзындықтарының максималды мәні к-1 тең, қатаң параллельді түрі де бар. Бұл берілген параллель түр үшін қолданыстағы индекстер саны графтың критикалық жолының ұзындығынан 1-ге үлкен. Осыған ұқсас параллельді түрлердің ішінде барлық кіру шыңдары мәні 1-ге тең бір индексті топта орналасқаны да болады. Бұл қатаң параллельді түр – канондық деп аталады. Берілген граф үшін оның канондық параллельді түрі жалқы (единственна), яғни біреу ғана болып табылады. Бірдей индекстері бар шыңдар тобы – параллельді түрдің ярусы деп, ал топтағы шыңдар саны – ярустың ені деп аталады. Параллельді түрдегі ярустар саны – оның биіктігі деп, ал ярустардың максималды ені – оның ені деп аталады. Минималды биіктіктің параллельді түрі – максималды деп аталады. Мұнда максималды сөзі – осы параллельді түрде ярустарда белгілі бір мағынада шыңдардың максималды саны бар дегенді білдіреді. Барлық канондық параллельді түрлер максималды болып табылады.
Егер i < j теңсіздігін i ≤ j теңсіздігіне ауыстыратын болсақ, 4.1 бекітілімінің мазмұны өз күшінде қалатынын байқаймыз. Бірақ салдарлардың ешқайсысы да орындалмайтын болады. Осы тәсілмен белгіленген граф-жалпыланған параллельді түр деп аталады. Осыған сәйкес жалпыланған ярус, жалпыланған ярустың ені және т.б. ұғымдар енгізіледі. Параллельді түрлермен байланысты зерттеулерде жалпыланған параллельді түрлер қатаң параллельді түрлер жиынын тұйықтаушы рөлін атқарады.
Енді алгоритм «кәдімгі» немесе параллельді, синхронды компьютерде жүзеге асырылуда делік. Оңай болу үшін барлық операциялар 1-ге тең бір ғана уақыт мезетінде орындалсын. Барлық өзге уақыт ысыраптарын есепке алмай-ақ, қалай аргументтері дайын болған кезден бастап, еш тоқтаусыз операциялар бірден орындала бастайды деп есептейік. Алгоритм уақыттың нөлдік кезеңінде жүзеге аса бастайды деп пайымдаймыз. Сонда әр операцияға өзінің орындалып біткен кезеңіне тең индекс беруге болады. Егер осы индекстерді сәйкес алгоритм графының шыңдарына ауыстырсақ, онда оның қатаң параллельді түрін алатынымыз белгілі. Мұндағы ярус нөмірі өзіне сәйкес операциялардың орындалып бітіп жатқан уақыт кезеңін білдіреді. Бір ярустың барлық операциялары бір-біріне тәуелсіз орындалып жатады, ал бұл операциялар саны ярустың еніне сәйкес келеді. Параллель түрдің биіктігі - алгоритм орындалуының ұзақтығы және т.б. болып табылады. Алгоритмнің түрлі синхронды орындалуы және оның графының түрлі қатаң параллельді түрлерінің арасындағы байланыс өте анық көрінеді. Дербес жағдайда, егер алгоритм «кәдімгі» компьютерде орындалып жатса, онда бұған барлық ярустарының ені 1-ге тең болатын параллельді түр сәйкес келеді. Бұл жағдайда параллельді түр сызықтық деп аталып, граф сызықты реттелген делінеді.
Егер абсцисса өсін уақыт өсі деп есептеп, ал шыңдарын операциялардың орындалып біткен уақытына сәйкес ордината өсіне қойып отырсақ, алгоритм графының параллельді түрлерін қағазға түсіру өте ыңғайлы. Егер синхронды немесе асинхронды кез келген нақты немесе гиротетикалық компьютерге арналған тура осы сияқты сызба жүргізілсе, онда осы айтылған пайымдауларда көп нәрсе өзгерусіз қалатыны анық. Тек параллельді түрдің ярустары ғана мезгіл бойынша өзгеріске ұшырайды. Алайда олар қаншалықты өзгергенімен, шыңдары мен шыңдарға сәйкес доғаларды абсцисса өсіне параллель жылжыту арқылы оларды қашан да операцияларды орындаудың бірлік уақытымен синхронды түріне айналдыруға болады. Бұл үшін операциялар орындалуының тек аяқталған кезеңін ғана емес, сонымен қатар басталған кезеңін де белгілейміз. Параллельді түрдің ярустарын келесі тәсілмен тұрғызамыз.
Кіру доғалары жоқ және орындалуының мезгілдік интервалының бос емес қиылысуы бар операцияларына сәйкес келетін шыңдардың максималды санын бірінші ярусқа біріктіреміз. Бұл шыңдар алдын ала бір-бірімен ешқандай доғалармен байланыспаған. Алгоритм графынан бірінші ярус шыңдары мен оларға қатысты доғаларды алып тастаймыз. Графтың қалған бөлігіне ұқсас келетін шыңдар тобын бөлеміз де, оны параллель түрдің екінші ярусы деп санайтын боламыз және т.б.
Сонымен, әртүрлі компьютерлерде бір ғана алгоритмнің түрлі жолмен орындалуы және алгоритм графының әртүрлі параллельді түрлерінің арасында белгілі бір өзара сәйкестік бар екені көрінеді. Алгоритм графы және оның параллельді түрлерін біле отырып, алгоритмдегі параллельділік қорының қаншалықты екенін және оны параллельді архитектуралы нақты бір компьютерде қалай жақсы іске асыруға болатынын түсінуге болады. Міне, сол себепті де біз алгоритм графының тұрғызылуына және оның параллельді түрлерін табуға көп көңіл бөлудеміз.
Әрі қарай, алгоритмнің параллельді формасы, алгоритм ярустары, алгоритмнің параллельді түрінің биіктігі туралы айта отырып, алгоритм графының параллельді түрлеріне қатысты терминологияны алгоритмнің өзіне де жиі қолданып отыратын боламыз. Алгоритмнің параллельді түрлерінің минималды биіктігін - алгоритм биіктігі деп атайтын боламыз және т.б. Басқаша айтқанда, бірден алгоритмнің операцияларын-граф шыңдары деп, ал операциялар арасындағы жартылай реттілік қатынастарын – иіндер (доғалар) деп санайтын боламыз. Бұл негізінен ешқандай жаңа білім бермейді, дегенмен «алгоритм графының шыңдарының мынадай жиынтығына сәйкес келетін операциялар жиынтығы» деген сияқты көп құрамды ұзақ сөздер тізбегін алып тастау арқылы шытырман фразалардан құтылуға мүмкіндік береді. Алгоритм графының қарапайым түрін түрлі-түсті суреттер мен сызбаларда қолданған әлдеқайда ыңғайлы.
Ал енді, компьютерде алгоритмнің қай параллельді түрі орындалып жатқанына қарамастан, орындалу нәтижесі бәрібір бірдей болатынын көрсетейік.
Бекітілім 1.2.2
Операцияның орындалуы кезіндегі дөңгелектеу қателігі, тек аргументтердің мәндерімен анықталатын болсын делік. Сонда бір ғана кіріс мәліметтері кезінде операцияларда бір ғана жартылай реттілікке сәйкес келетін алгоритмнің барлық іске асулары, дөңгелектеу қателіктерінің бүкіл жиынтығын қоса есептегенде бір ғана нәтиже береді.
Алгоритмнің канондық параллельді түрін қарастырайық. Кезкелген ярустың операциялары бір-біріне тәуелді емес. 1-ші ярустың операциялар аргументтері болып тек кіріс мәліметтері ғана табылады. Олар операцияның орындалу уақытына тәуелді емес. Сондықтан 1-ші ярустың барлық операциялары өздерінің нақты орындалу уақытына тәуелсіз түрде нәтиже береді. 2-ші ярустың операциялар аргументтері болып не кіріс мәліметтері, не 1-ші ярус операцияларының орындалу нәтижелері табылады. Осы айтылғанға сәйкес, бұлардың бәрі операциялардың орындалу уақытына тәуелді болмайды. Сондықтан 2-ші ярустың операциялары да осы операциялардың нақты орындалған уақытына тәуелсіз түрдегі нәтижелер береді. Ярустарды бойлай осы дәлелдемені жалғастыра отырып, бекітілімнің дұрыстығына көз жеткіземіз.
Тізбекті тілде жазылған бағдарламалар арқылы беріліп отырған операциялар орындалуының тізбегі операциялар жиынтығында сызықтық реттілікті анықтайды. Әрине, ол жоғарыда айтылған жартылай реттілікті де сақтайды. Бірақ жалпы алғанда, операциялар жиынтығында тура сол жартылай реттілікті сақтайтын басқа да сызықтық реттіліктер болады. 1.2.2 бекітіліміне сәйкес, олардың барлығы да бірдей нәтиже береді. Бұдан шығатын қорытынды, алгоритмді беру кезінде операциялардың орындалуының тізбекті ретін бекіту жалпы айтқанда, артық әрекет болып табылады. Алгоритм графын немесе оның қандай да бір қатаң параллельдік түрін, ең жақсысы канондық түрін беріп отыру әлдеқайда «үнемдірек». Оның үстіне, параллельді есептеу жүйелерінде алгоритмдерді орындау үшін дәл осындай ақпарат керек. Алайда, кәдімгі қарапайым компьютерлердің қолданыста болып жүрген ұзақ жылдарының ішінде тізбекті тілдерде дайындалған қолданбалы бағдарламалық қамтаманың сан түрі жинақталып қалғаны соншалық, оны қолдан көшіріп отыру туралы айтудың өзі қажеті жоқ. Сондықтан да алгоритдер жазбасын тізбекті «артықшылықтардан» тазартуға көмектесетін құрал-саймандар жүйесін құрып, дамыту қажет, ал бұл сайып келгенде, алгоритм графын құруға және оның параллельді түрлерін табуға ұласады. Бұдан әрі қарай көретініміздей, бұл оңай жұмыс емес.
Біздің ойымызша, алгоритм графы - сол алгоритм жазбаларындағы құрастырушы идеясының ең негізгі ядросын бейнелейді. Алгоритм құрастырушы сол ядроны білуі мүмкін. Алгоритмді сипаттау тілі берілген ядроны сапалы бейнелеуге мүмкіндік бермегендіктен, ол оны түрлендіріп жіберуге мәжбүр болуы да әбден мүмкін. Бірақ, тәжірибе көрсетіп отырғандай, басым көп жағдайларда алгоритмнің бұл ядросы құрастырушыға белгісіз. Оның үстіне, әдетте, ол оның бар екендігі туралы ойламайды да. Егер алгоритм графын, алгоритмнің жай ядросы ғана емес, сондай-ақ оның ақпараттық ядросы екендігін назарға алар болсақ, барлығы түсінікті болады. Бұдан біраз уақыт бұрын ғана алгоритмдердің жүзеге асуында ақпарат қалай таратылатыны туралы білім тәжірибелік құндылыққа ие емес еді. Осы себепті де оны алуға деген айтарлықтай ұмтылыстың болмағаны таң қалдырмайды. Параллельді есептеу жүйелерінің пайда болуы осы білімдерді аса үлкен қажеттілікке айналдырды. Міне, сол үшін де олар дами бастады.
Сұрақтар мен тапсырмалар
Граф және параметрленген граф туралы не айтасыз?
Қандай тәсілмен белгіленген граф - жалпыланған параллельді түр деп аталады?
Параллельді түрдің ярустары қалай тұрғызылады?
Жалпыланған параллель форманың ярустар санының минималды мәні алгоритм құрылымын сипаттай алады ма?
Қай кезде параллельді түр сызықтық деп аталып, граф сызықты реттелген делінеді?
Алгоритм биіктігі деп нені айтады?
Қандай да бір есеп үшін, алгоритмдер өз шешімдерін әртүрлі дөңгелектеу қателіктерімен берсін. Мұндай алгоритмдер бірдей параллель формаларға ие бола алады ма?
Әртүрлі есептерді шешуге арналған, бірақ графтары бірдей болатын әртүрлі алгоритмдерге мысалдар келтіріңіздер.
Қандай да бір есеп үшін, алгоритмдер, өз шешімдерін барлық кіріс деректерінде бірдей дөңгелектеу қателіктерімен берсін. Мұндай алгоритмдер әртүрлі графтарға ие бола алады ма?
Бинарлық және унарлық операцияларды пайдалана отырып, келесі алгоритмдердің графтарын тұрғызыңыздар:
Кері қою әдісі көмегімен үшбұрышты матрицалы сызықты алгебралық теңдеулер жүйесін шешу.
Гаусс әдісі көмегімен шаршы матрицалы сызықты алгебралық теңдеулер жүйесін шешу.