
- •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 функциялары
§1.2.2 Компьютерді басқарудың интеллектуалдығын жоғарылату
Сонымен, алдыңғы параграфтан шығатын қорытынды - «компьютер архитектурасындағы параллельділік – бұл уақытша емес, ол мәңгі – бақилық» десе болады. Қазіргі жаңа технологиялар мыңдаған процессорларды бір ғана есептеу жүйесіне жеңіл түрде біріктіруге мүмкіндік береді. Алайда, паралель компьютерлерді қолданудың осы уақытқа дейінгі тәжірибесі оларды толық игерудің идеал жағдайлардан қашық екендігін көрсетеді.
Іс жүзінде барлық дерлік жағдайда келесі тұжырым орынды: «компьютердің архитектурасындағы параллельділік дәрежесін көтеру оның шектік өнімділігінің жоғарылауына алып келуімен қатар, бір мезгілде шектік өнімділігі мен нақты өнімділігі арасындағы айырмашылықтың да артуына әкеледі». Бұл түсінікті де, мысалға, барлық бағдарламалар ILLIAC IV компьютерінің барлық 64 процессорлық элементін бірдей тиімді қолдана алмайтыны анық.
Егер бағдарлама векторлық түрге келмесе, онда ол Gray сияқты векторлы-конвейерліқ машиналарының архитектурасындағы артықшылықтарын толық қанды пайдалана алмайды.
Кейде алгоритм структурасы оны тиімді іске асыруға мүмкіндік бермейді, бірақ мұндай жағдайлар жиі кездесе бермейді. Көп жағдайда бағдарламаның нақты өнімділігін жоғарылатуға болады, бірақ бұл процестің қиыншылығы есептеуіш жүйенің аппараттық-бағдарламалық ортасының параллельділікті қаншалықты қолдай алатынына тікелей байланысты. Бұл жерде барлығы маңызды: операциялық жүйелер және компиляторлар, параллель бағдарламалау технологиясы және бағдарламаның орындалу уақыты жүйелері, процессордың параллелизмді қаншалықты қолдауы және жадымен жұмыс істеу ерекшеліктері. Егер бір нәрселер ескерілмеген, қарастырылмаған жағдай бола қалса, онда тиімді бағдарламаны алу үшін қолданушының өзі қамдану керек: егер компилятор нашар болса, онда ассемблер тілінде жазу керек, егер аппараттық деңгейде әртүрлі процессорлардағы кэш жадыларда сақталған мазмұндарда келіспеушілік болса, онда кэш жадыны босататын арнайы функциялар тұрақты түрде кодқа қойылады және т.б.
Қазіргі таңда, компьютердің бағдарламалық – аппараттық ортасындағы паралельділікті қолдауда айрықша мәнді тәжірибе жинақталды десе болады. Осы ортаның «параллель» бөліктерімен танысумен қатар, сұрақтың кері жағының да маңыздылығы кем емес. Егер бағдарламаның тиімділігі төмен болса, онда оның себебі барлық жерде жасырынып тұруы мүмкін. Бұл үшін бір дегеннен пайдалынылған алгоритмге немесе өзіміздің бағдарлама құру қабілетімізге ренжіп қажеті жоқ.
Бұған себепші нашар компилятор немесе оны дұрыс пайдаланбау, аппаратура деңгейінде жадыға қатынастың бұғатталуы, нашар іске асырылған параллельді енгізу/шығару, коммуникациялық ортадан пакеттердің өтуі кезіндегі қақтығыстар – компьютердің бағдарламалық-аппараттық ортасының әрбір құраушысы бағдарлама жұмысына өз үлесін қосады, ал ол жақсы ма әлде жаман ба, ол басқа сұрақ.
Сонымен, бағдарлама жұмысының тиімділігін көтеру туралы айтатын болсақ, бірінші - арнайыпроцессорларды құрастыру жайында айтылу керек.
Компьютер архитектурасын құрастырушылардың алдында әрдайым дилемма қойылады: қандай да бір операцияны аппаратура деңгейінде ұйымдастыру керек пе, әлде бұл функцияны бағдарламалық жабдыққа жүктеу қажет пе.
Аппаратура жағынан демеу (процессордың арнайы командалар жүйесі, жадтың ерекше құрылымы, разрядтылық, деректерді беру (көрсету) тәсілдері, ішкі процессорлық коммуникацияның топологиясы және т.б.) анықталған операциялар жинағын орындау жылдамдығын арттыруда көп ұтымды болады Алайда, егер процессор байттық бүтін сандарды өте тиімді өңдей алатын болса, онда ол бір разрядты деректердің үлкен массивтерімен, я болмаса жылжымалы нүктелі нақты сандармен де соншалықты тиімді жұмыс істей алады деп анық айта алмаймыз. Алгоритмдер әртүрлі, ал архитектурада бәрін алдын–ала ескеру (көрсету) мүмкін емес, сондықтан да құрастырушыларға әмбебаптық және мамандандырылу арасында компромисс іздеуге тура келеді. Осы жайында есептеуіш құрылғылардың өлшемдері мен олардың бағалары да ойлануға мәжбүр етеді.
Арнайы процессорлардың жоғары мамандандырылуын ескерсек, олардың өнімділік көрсеткішін бағалау аса үлкен ұқыптылықты қажет ететіні айқын.
Арнайы процессорлардың қолданылу бағыттары кең - сигналдарды өңдеу, сөзді тану, бейнені және сейсмологиялық деректерді талдау, графикалық үдеткіштер және т.б. Нақты алгоритмдердің ерекшеліктерін тиімді пайдалана отырып, арнайы процессорлар көптеген (жүздеген, мыңдаған, он мыңдаған, жүз мыңдаған) параллель жұмыс істейтін элементар функциональді құрылғыларды біріктіреді. Мұнда үлкен иілгіштік жоқ, оның орнына үлкен жылдамдықпен жұмыс істеу мүмкіндігі бар.
Алғашқылардың бірі және осы уақытқа дейін кең қолданыста жүрген арнайы процессорлардың қатарына, Фурье түрлендіруін тез іске асыруға аппараттық қолдау негізінде құрылған процессорларды жатқызуға болады. Пайдаланушыдан жасырын параллельділік - машиналық команда деңгейіндегі параллельділікті (Instruction–Level Parallelism) пайдалану идеясы параллельділіктің даму бағытына қызықты серпін берді. Пайда өте көп, олардың ішіндегі ең бастыларының қатарына пайдаланушыға арнайы параллель бағдарлама жасау қажеттілігінің жоқтығын айтуға болады. Сонымен қатар, мұнда тасымалдау мәселесі тізбекті машиналар класындағы бағдарламаны тасымалдаудың жалпы мәселелерінің деңгейінде қалады.
Машиналық команда деңгейінде параллельділкті пайдаланатын процессорлар архитектурасын құрудың негізгі екі жолы бар. Екі жағдайда да процессор бір-біріне тәуелсіз жұмыс жасай алатын бірнеше функционалдық құрылғыдан тұрады деп есептеледі және бұл құрылғылардың бірдей немесе әртүрлі екені маңызды емес.
Суперскалярлық процессорлар машиналық команда терминіндегі программа құрамында параллельділік туралы қандай да ақпараттың болуын қажет етпейді. Мұнда, машиналық кодтағы параллельділікті байқау, анықтау есебі аппаратқа жүктеледі және ол, сәйкесінше, командалардың орындалу тізбегін тұрғызады.
Тәжірибе жүзінде VLIW–процессорлары (Very Large Instruction Word) негізінен фон-неймандық компьютері ережесімен жұмыс істейді. Айырмашылығы: процессорге әр цикл сайын берілетін команда, бір ғана операцияны емес, бірден бірнешеуін анықтайды.
VLIW-процесорының командасы өрістер жиынтығынан тұрады, олардың әрқайсысы өзінің операциясына жауап береді, мысалы, функционалды құрылғыларды активтеу, жадпен жұмыс істеу, регистрлермен операция және т.б. Егер процессордың қандай да бір бөлігі, бағдарламаның орындалуы барысының ағымды этапында қажет етілмесе, онда команданың оған сәйкес өрісі әрекет етпейді.
Осыған ұқсас архитектуралы компьютерлер қатарына Floating Point Systems фирмасының АР–120В компьютерін мысалға келтіруге болады. Оны алғаш пайдалану 1976 жылы басталып, 1980 жылы дүние жүзі бойынша 1600 –ден аса данасы орнатылды. АР–120В компьютерінің командасы 64 разрядтан тұрады және ол машинаның барлық құрылғыларының жұмысын басқарады. Әрбір тактіде (167 нс) бір команда беріледі, бұл бір секунд ішінде 6 миллион команданың орындалуына эквивалентті. Әрбір команда бір уақытта бірнеше операцияларды басқара алатындықтан, нақты өнімділік жоғары болуы мүмкін. АР–120 В командасының барлық 64 разряды, әрбірі өз операциялар жиынына жауап беретін алты топқа бөлінеді: 16-разрядты бүтін санды берілгендер және регистрлермен операциялар, нақты сандарды қосу, енгізу/шығаруды басқару, өту командалары, нақты сандарды көбейту және басты жадтағы жұмыс командалары.
VLIW-процессоры үшін бағдарлама әрқашанда параллельділік туралы нақты, дәл ақпаратты қамтиды. Мұнда, компилятор, әрдайым бағдарламадағы параллельділікті өзі анықтап, қандай операциялар бір-біріне тәуелсіз екені туралы ақпаратты аппаратураға айқын түрде хабарлайды.
VLIW-процессорына арналған кодта процессордың бағдарламаны қалай орындайтыны туралы нақты жоспары енгізілген: әр операция қай кезде орындалады, қандай функционалды құрылғылар жұмыс істейді, қандай регистрлерге қандай операндтар кіреді және т.б.
Екі бағыттың да өз артықшылықтары мен кемшіліктері бар және де VLIW архитектурасының шектелген мүмкіндіктері мен қарапайымдылығына суперскаляр жүйелердің күрделілігі мен динамикалық мүмкіндіктерін қарсы қоюдың қажеті жоқ. Әрине, компиляция кезінде операцияның орындалу жоспарын құру, суперскалярлық жүйелер үшін де жоғары дәрежедегі параллелділікті қамтамасыз ету үшін маңызды екені айқын. Сонымен бірге, компиляция кезінде бірмәнді еместік туындайды, оны суперскалярлы архитектураға тиісті динамикалық механизмдер көмегімен тек қана бағдарламаның орындалуы кезінде ғана шешуге болады.
50–ші жылдардың соңында суперскалярлық өңдеу идеясының дамуына IBM фирмасының STRECH жобасы үлкен ықпал етті, қазіргі таңда көптеген микропроцессорлардың архитектурасы осы қағидаға сүйеніп құрылған. VLIW-компьютерінің айқын өкілдері: Multiflow және Cydra компьютерлері ұрпағы.
Жоғарыда келтірілген екі қағида да жеке процессорлардың өнімділігін арттыруға қатысты, олардың негізінде өз кезегінде көппроцесссорлы конфигурациялар құруға болады. Параллель компьютерлердің архитектурасы компьютерлік индустрияның пайда болуынан бастап, адам нанғысыз темппен және әртүрлі бағыттарда дамуда [24].
Дегенмен, егер детальдарын ескермей, ал кейінгі басым көпшілік параллель есептеу жүйелерінің жалпы құрылу идеясын бөліп қарастыратын болсақ, онда тек екі класс қана қалатынын көреміз.
Бірінші класс – бұл ортақ (жалпы) жадылы компьютерлер. Осы принциппен құрылған жүйелерді әдетте мультипроцессорлық жүйелер немесе жай мультипроцессорлар деп те атайды. Жүйеге, ортақ жадыға қатынауға тең құқылы бірнеше процессорлар кіреді (12 сурет).