- •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 функциялары
26 Сурет. Cray c90 компьютерінде векторлық операциялардың орындалуы
Бұл жерде де ілінісудің негізгі тағайындалуы тағы да деректерді өңдеудің жылдамдығын арттыру болып табылады. Мысалы, бізге әрбір кірістік векторы n элементтен тұратын Ai=Bi+Ci*d түріндегі операцияны орындау қажет делік және де біздің қол астымызда, сәйкесінше, l1 және l2 баспалдақтан тұратын қосу және көбейту функционалдық құрылғылары болсын. Егер берілген операцияны дәстүрлі әдіспен орындайтын болсақ, яғни бірінші көбейту векторлық операциясын, сонан кейін қосу операциясын, онда барлық операция l1 + l2 +2* n – 2 тактіде іске асатын болады. Егер де осы операция үшін ілінісу режимі пайдаланылатын болса, онда негізінен ұзындығы l1 + l2 болатын бір конвейер алынады, онда барлық операцияны орындау уақыты да l1 + l2 + n – 1 –ге дейін қысқарады. Берілген кірістік вектор саны n үлкен болған жағдайда, операцияның орындалу уақыты дәстүрлі әдіспен салыстырғанда екі есеге дейін азаяды. Бұл ситуация сызба түрінде 27 – ші суретте көрсетілген.
27 Сурет. Cray c90 компьютерінде векторлық операциялардың ілінісуі
Процессорды басқару секциясы
Жедел жадыдан командалар блогымен таңдалынып командалар буферлеріне енгізіледі, одан кейін олардан орындалу үшін таңдалып алынады. Егер ағымдағы буферде орындау үшін қажетті команда жоқ болса, онда ол басқа буферлерден ізделінеді. Егер талап етілген команда буферлерден табылмаса, онда келесі блокты таңдау жүргізіледі.
Cray C90 компьютері архитектурасының негізі осындай. Көріп отырғанымыздай, параллель өңдеу идеяларының компьютер архитектурасының барлық құрамдас бөліктеріне әсері бар.
Сонымен, бағдарламалардың орындалуына едәуір үдеу беретін архитектураның негізгі ерекшеліктерінің ішінен келесілерді атауға болады:
Командаларды орындауды конвейерлеу. Процессор орындайтын барлық негізгі операциялар, яғни жадыға қатынау, командаларды өңдеу және фнкционалдық құрылғылардың инструкцияларды орындауы конвейерлік болып табылады;
Функционалдық құрылғылардың тәуелсіздігі. Cray C90 компьютерінің функционалдық құрылғылары бір-біріне тәуелсіз, сондықтан онда бірнеше операция бір мезгілде орындала алады;
Векторлық өңдеу. Тұтас деректер жиынын (векторды) өңдеу бір команда арқылы орындалатын болғандықтан, векторлық өңдеу, өңдеудің жылдамдығын және өңдеу тиімділігін арттырады. Векторлық режимде операцияны орындау жылдамдығы скалярлық өңдеу жылдамдығынан 10-15 есе жоғары болуы мүмкін;
Функционалдық құрылғылардың ілінісуі. «Макроконвейер» режимінде бірнеше векторлық операцияларды орындай алу мүмкіндігі, оларды өңдеу жылдамдығын арттыруда қосымша ұтыс береді.
Көппроцессорлық өңдеу. Максималды конфигурацияда компьютер құрамында тәуелсіз 16 процессорға дейін болуы және олар әртүрлі пайдаланылуы мүмкін. Дербес жағдайда олар бір-біріне тәуелсіз бірнеше бағдарламаларды орындай алуы немесе барлығы бір бағдарламаны орындауға бағытталуы мүмкін.
Cray C90 компьютерінің шектік өнімділігі
Компьютер архитектурасын біле отырып, оның шектік өнімділігін жеңіл есептеуге болады. Алдымен бізді, нақты сандар мен операциялар орындаудың жылдамдығы қызықтыратын болғандықтан, нақты арифметикаға арналған функционалдық құрылғыларды максималды жүктеу қажет. Кері шаманы табу операциясы сирек қолданылады, ал бөлу операциясын орындауда оған қосымша көбейту операциясы талап етіледі. Сондықтан компьютердің шектік өнімділігін анықтау үшін тек қана қосу және көбейту құрылғыларын іске араластырамыз. Максимал өнімділік алу үшін бұл құрылғыларды ілінісу режимінде пайдалану қажет. Алдыңғы параграфта, Ai=Bi+Ci*d операциясын іске асыру барысында, біз, дәл осылай жасаған болатынбыз. Егер әрбір осындай құрылғы, векторлық операцияны орындау үшін екі ішкі конвейерлерді пайдаланатынын қосымша ескеретін болсақ, онда екі құрылғыдан тұратын жүйе бір тактіде төрт операцияның нәтижесін беретін болады. Компьютердің такті уақыты 4,1 нс тең, сондықтан Cray C90 компьютерінің бір процессорының шектік өнімділігі шамамен 1 Гфлопс немесе секундына 109 операцияны құрайды. Егер бір мезгілде барлық 16 процессор жұмыс істеп тұр деп есептесек, онда шектік өнімділік 16 гфлопс-қа дейін артады.
Сонымен біз қарастырылып жатқан компьютердің негізгі ерекшеліктерін талдап, одан не себепті оның соншалықты тез есептейтінін түсіндік. Бірақ ол үшін қалай тиімді бағдарламаларды жазу керек екендігін түсіну үшін оның басқа жағын да оқып үйрену керек. Нақты бағдарламаларда оның өнімділігін азайтатын факторларды бөліп қарастыру керек. Бізге бұл қадамды жасамасақ, өнімділікті арттыру үшін бағдарламада нені өзгерту керек екенін түсіну қиын болады. Бұдан ары, бағдарламаның орындалу тиімділігін талдауға көңіл бөлейік [9].
Бірінші бізге терминологияны анықтап алу керек. Компьютердің архитектурасы векторлы-конвейерлі. Өңдеудің векторлық режимін пайдалану есебінен уақыттан ұтуға қол жеткізіледі. Бағдарламаның жекелеген фрагменті векторлық режимде өңделуі мүмкін, егер оның орындалуы үшін компьютердің командалар жүйесінің векторлық командаларын пайдалану мүмкін болса. Егер бағдарламаның барлық фрагменттерін векторлық командалармен ауыстыру мүмкіндігі туса, онда оның толық векторлануы туралы айтуға болады. Кері жағдайда біз бөлшекті векторлану немесе фрагментті векторлау мүмкін еместігіне келеміз.
Бағдарламадағы векторлануы мүмкін фрагменттерді іздеу және оларды векторлық командалармен ауыстыру процесі бағдарламаның векторлануы деп аталады.
Векторланған фрагментке мысал:
DO i=1, n
C(i) = A(i) + B(i)
END DO
Бұл фрагмент үшін компилятор векторлық командалар тізбегін генерациялайды: жадыдағы А және В векторларын векторлық регистрлерге жүктеу, векторлық қосу операциясы, векторлық регистр мазмұнын жадыға жазу.
Жоғарыда біз бағдарламадағы кезкелген фрагментті векторлау мүмкін бола бермейтінін айтқан болатынбыз. Векторлау үшін екі шарттың орындалуы қажет. Бірінші шарт вектор-аргументтердің бар болуы. Екінші шарт біраз күрделірек, вектордың барлық элементтеріне бірдей, тәуелсіз операциялар орындалуы керек және олар үшін компьютердің командалар жүйесінде осы сияқты векторлық командалар бар болуы қажет. Енгізілген түсініктерді тереңірек қарап көрелік.
Вектор деп барлық элементтері компьютер жадысына бір-біріне қарағанда бірдей ығыса орналастырылған біртекті (біртипті) деректердің реттелген жиынын айтамыз. Бағдарламалардағы векторлардың қарапайым мысалы ретінде бірөлшемді массивтерді алуға болады. Келесі мысал матрицаның жолдары мен бағандары. Fortran бағдарламалау тілі үшін матрицаның бір бағанының көрші элементтерінің арасындағы арақашықтық бірге тең, ал бір жолдағы көрші элементтерінің арақашықтығы матрица өлшеміне тең. С тілі үшін жолдар мен бағандар орындарымен ауысады. Шаршы матрицаның диагоналы да вектордың мысалы бола алады, себебі оның элементтерінің арақашықтығы бірдей және матрица өлшеміне бірді қосқанға тең. Тұтастай көпөлшемді массивті де ұзындығы массивтің барлық өлшемдерінің көбейтіндісіне тең бір вектор деп санауға болады. Бұл тізімді ары қарай жалғастыра беруге болады, және деректердің регулярлық құрылымын пайдаланатын кезкелген бағдарламада векторлардың әртүрлі көптеген мысалдарын табуға болады.
Алайда, екіөлшемді матрицаның барлық диагональ асты бөлігі вектор бола алмайды. Себебі, бұл деректер жиыны элементтерінің ара-қашықтығы компьютер жадысында қандай да бір тұрақты сан түрінде берілмейді.
Векторланатын фрагментте вектордан басқа қарапайым айнымалылар да пайдаланылуы мүмкін. Мысал:
DO i=1, n
А(i) = В(i) + s
END DO
Фрагментті векторлау үшін негізгі кандидаттарына бағдарламаның барлық циклдік конструкциясының ең ішкі циклдары жатады. Олар дербес жағдайда векторлар болуы мүмкін деректердің «бірөлшемді» жиынын береді. Бірақ, векторлармен жұмыс істеу әлі де векторлаудың жеткілікті шарты бола алмайды. Келесі мысалды қарастыралық:
DO i=1, n
А(i) = A(i-1) + B(i)
END DO
Мұнда, алдыңғы i – 1-ші элемент есептелмейінше А массивінің i-ші элементін есептеу басталмайды. Бұл жағдайда конвейерлік өңдеуді пайдалану өз мағынасын жоғалтады. Қашан нәтиже құрылғыдан шықпайынша, біз деректерді конвейердің бірінші сатысына жүктей алмаймыз. Қарастырылған мысалда векторлауға кедергі жасайтын операциялар арасындағы тәуелділік бар. Сондықтан да біз тәуелсіз және бірдей операциялар бар болатын шарт орындалғанда ғана векторлау мүмкін екені туралы айтқан болатынбыз.
