Кіріспе
Деректер ағынын параллель өңдеуге арналған бағдарламалау парадигмасы
Компьютерлік ғылымда, ағынды өңдеу (оқиғалар ағынын өңдеу, деректер ағынын өңдеу немесе үлестірілген ағынды өңдеу деп те аталады) – ағындарды, яғни уақыт бойынша оқиғалардың тізбегін, есептеудің негізгі кіріс және шығыс объектілері ретінде қарастыратын бағдарламалау парадигмасы. Ағынды өңдеуге деректер ағынын бағдарламалау, реактивті бағдарламалау және үлестірілген деректерді өңдеу кіреді. Ағынды өңдеу жүйелері деректер ағындарын параллель өңдеуді іске асыруға және тиімді жүзеге асыру үшін ағынды алгоритмдерге сүйенуге бағытталған. Бұл жүйелерге арналған бағдарламалық қамтамасыз ету жиынтығына есептеулерді бейнелеу үшін бағдарламалау үлгілері мен сұраныс тілдері, тарату және жоспарлау үшін ағынды басқару жүйелері, сондай-ақ жылдамдату үшін аппараттық компоненттер, оның ішінде қозғалатын нүктелік операцияларды орындайтын құрылғылар, графикалық процессорлар және далалық бағдарламаланатын қақпалар массиві кіреді. Ағынды өңдеу парадигмасы, параллель есептеулерді шектеу арқылы параллель бағдарламалық қамтамасыз ету мен аппараттық құралдарды жеңілдетеді. Деректер тізбегі (ағын) берілгенде, ағындағы әрбір элементке операциялар тізбегі (ядролық функциялар) қолданылады. Ядролық функциялар әдетте конвейерленеді және сыртқы жадпен өзара әрекеттесуге байланысты өткізу қабілетінің жоғалуын азайту үшін чиптегі жадты тиімді пайдалануға тырысады. Бірыңғай ағын, онда бір ядролық функция ағындағы барлық элементтерге қолданылады, кең таралған. Ядро мен ағын абстракциялары деректердің тәуелділігін көрсететіндіктен, компилятор құралдары чиптегі басқару міндеттерін толық автоматтандыруға және оңтайландыруға мүмкіндік береді. Ағынды өңдеу аппараттық құралдары, мысалы, тәуелділіктер белгілі болғанда тікелей жадқа кіруді (DMA) бастау үшін есептік кестелерді пайдалана алады. Қолмен DMA басқаруын жою бағдарламалық қамтамасыз етудің күрделілігін азайтады, ал аппараттық кэштелген I/O үшін байланысты жою, арифметикалық-логикалық құрылғылар сияқты мамандандырылған есептеу бірліктерімен қызмет көрсетуді қажет ететін деректер аймағының көлемін азайтады. 1980 жылдары ағынды өңдеу деректер ағынын бағдарламалау аясында зерттелді. Мысалы, SISAL (Streams and Iteration in a Single Assignment Language) тілін келтіруге болады.
In computer science, stream processing (also known as event stream processing, data stream processing, or distributed stream processing) is a programming paradigm which views streams, or sequences of events in time, as the central input and output objects of computation. Stream processing encompasses dataflow programming, reactive programming, and distributed data processing. Stream processing systems aim to expose parallel processing for data streams and rely on streaming algorithms for efficient implementation. The software stack for these systems includes components such as programming models and query languages, for expressing computation; stream management systems, for distribution and scheduling; and hardware components for acceleration including floating point units, graphics processing units, and field programmable gate arrays. The stream processing paradigm simplifies parallel software and hardware by restricting the parallel computation that can be performed. Given a sequence of data (a stream), a series of operations (kernel functions) is applied to each element in the stream. Kernel functions are usually pipelined, and optimal local on chip memory reuse is attempted, in order to minimize the loss in bandwidth, associated with external memory interaction. Uniform streaming, where one kernel function is applied to all elements in the stream, is typical. Since the kernel and stream abstractions expose data dependencies, compiler tools can fully automate and optimize on chip management tasks. Stream processing hardware can use scoreboarding, for example, to initiate a direct memory access (DMA) when dependencies become known. The elimination of manual DMA management reduces software complexity, and an associated elimination for hardware cached I/O, reduces the data area expanse that has to be involved with service by specialized computational units such as arithmetic logic units. During the 1980s stream processing was explored within dataflow programming. An example is the language SISAL (Streams and Iteration in a Single Assignment Language).
Бұрынғы параллель парадигмалармен салыстыру
Негізгі компьютерлер тізбектеп орындалатын парадигмадан бастау алды. Дәстүрлі процессорлар SISD негізінде жұмыс істейді, яғни олар тұжырымдама бойынша бір уақытта тек бір операцияны ғана орындайды. Әлемдегі есептеу қажеттіліктері дамыған сайын басқарылатын деректердің көлемі өте жылдам өсті. Тізбектеп бағдарламалау моделінің өңдеу қуатының артуына жауап бере алмайтыны анық болды. Үлкен көлемдегі есептеулерді орындаудың балама жолдарын табуға көп күш жұмсалды, бірақ жалғыз шешім – параллель орындаудың белгілі бір деңгейін пайдалану болды. Осы күш-жігердің нәтижесінде SIMD пайда болды, ол бір команданы деректердің бірнеше мысалына (әр түрлі) қолдануға мүмкіндік беретін бағдарламалау парадигмасы. SIMD көбінесе SWAR ортасында қолданылды. Күрделірек құрылымдарды пайдалану арқылы MIMD параллелизмін де қолдануға болады. Бұл екі парадигма тиімді болғанымен, нақты іске асырулар жадты туралау мәселелерінен бастап синхронизация мәселелеріне және шектеулі параллелизмге дейін түрлі шектеулермен күресті. SIMD процессорларының тек азы ғана дербес компоненттер ретінде сақталды, ал көпшілігі стандартты процессорларға енгізілді. Мысалы, 100 компоненттік векторларды (яғни барлығы 400 санды) қамтитын екі массивті қосу бағдарламасын қарастырайық.
Зерттеу
Стэнфорд университетінің ағынды өңдеу жобаларына 1999 жылы басталған Стэнфордтың нақты уақытты бағдарламаланатын көлеңкелеу жобасы кірді. 2002 жылы Imagine деп аталған прототип әзірленді. Merrimac деп аталған жоба шамамен 2004 жылға дейін жүргізілді. AT&T компаниясы да графикалық процессорлар жылдамдық және мүмкіндік жағынан қарқынды дамыған кезде ағынды күшейтілген процессорларды зерттеді. Осы алғашқы жылдардан бері ондаған ағынды өңдеу тілдері мен арнайы аппараттық құралдар жасалды.
Ағынды өңдеу үшін есептеу модельдері
Ағызатын бағдарламаларды жоғары деңгейдегі тілдерде сипаттаудан өзге, есептеу модельдері (ЕМ) дерек ағыны модельдері және процеске негізделген модельдер ретінде де кеңінен қолданылып келеді.
Жалпы процессор архитектурасы
Тарихи тұрғыдан алғанда, процессорлар жадқа қол жеткізудің әртүрлі деңгейлерін оңтайландыруды іске қоса бастады, себебі сыртқы жадтың өткізу қабілеті салыстырмалы түрде баяу өскенмен, өнімділік үздіріліссіз артып келеді. Бұл айырмашылық кеңейген сайын, жадтың кешігу уақытын жасыру үшін үлкен чиптік аумақ бөлінді. Ақпаратты және операциялық кодтарды осы аз ғана АЖБ-ға (арифметикалық-логикалық құрылғыларға) жеткізудің құны жоғары болғандықтан, математикалық операцияларды орындауға арналған чиптік аумақ өте шектеулі болды (шамамен 10% кем деп есептесек). Ағынды процессорларда да ұқсас архитектура бар, бірақ жаңа бағдарламалау үлгісінің арқасында басқаруға кеткен транзисторлардың саны өте аз. Жүйе тұрғысынан қарағанда, ағынды процессорлар әдетте бақыланатын ортада жұмыс істейді. Графикалық процессорлар (GPU) қосымша картада орналасады (бұл Imagine-ге де қатысты сияқты). Орталық процессорлар (CPU) жүйелік ресурстарды басқару, қосымшаларды іске қосу және басқа да жұмыстарды жалғастырады. Ағынды процессор әдетте жылдам, тиімді және эксклюзивті жад шинасымен жабдықталған (қазіргі уақытта қиылысқан коммутаторлар жиі қолданылады, ал бұрын бірнеше шина қолданылған). Жад жолақтарының нақты саны нарықтық сегментке байланысты. Қазіргі уақытта, кіріс деңгейіндегі құрылғыларда әлі де 64 биттік байланыс қолданылады. Орта деңгейдегі модельдердің көпшілігі жылдам 128 биттік қиылысқан коммутаторлық матрицаны (4 немесе 2 сегментпен) пайдаланады, ал жоғары деңгейдегі модельдер үлкен жад көлемін (көбінесе 512 МБ-қа дейін) 256 биттік, сәл баяу қиылысқан коммутатормен қолданады. Ал Intel Pentium-нан кейбір Athlon 64 процессорларына дейінгі стандартты процессорларда тек 64 биттік деректер шинасы бар. Жадқа қол жеткізу үлгілері әлдеқайда болжамды. Массивтер болғанымен, олардың өлшемдері ядро шақырылғанда белгілі бір мәнге орнатылады. Көптік сілтемелік жанамалыққа ең жақын нәрсе – жанамалық тізбегі, бірақ ол әрқашан белгілі бір жад аймағынан (ағын ішінде) оқуға немесе жазуға кепілдік береді. Ағынды процессордың орындаушы бірліктерінің (АЖБ кластерлері) SIMD табиғатының арқасында, оқу/жазу операциялары көбінесе бірнеше мәліметке қатысты болады, сондықтан жадтар төмен кешігу уақыты емес, жоғары өткізу қабілеті үшін оңтайландырылған (мысалы, Rambus және DDR SDRAM-нан өзгеше). Бұл жад шинасын тиімді келісуге де мүмкіндік береді. Ағынды процессордың жұмысының көп бөлігі (90%) чипте орындалады, тек жаһандық деректердің 1% жадта сақталады. Міне, ядроның уақытша және тәуелділіктерін білудің маңызы осында. Ішкі процессорда ақылға қонымды байланыс және басқару схемалары бар, бірақ ең қызықтысы – Stream Register File (SRF). Бұл концептуалды түрде үлкен кэш, онда ағын деректері сыртқы жадқа бірнеше бөлікпен жіберіледі. SRF, әртүрлі АЖБ-ға арналған бағдарламалық басқару құрылымы ретінде, барлық АЖБ кластерлері арасында ортақ пайдаланылады. Стенфордтың Imagine чипімен жасалған негізгі идея және инновация – компилятордың жадты автоматты түрде және оңтайлы бөлуге қабілеттілігі, бұл бағдарламалаушы үшін толыққанды ашық. Ядро функциялары мен деректер арасындағы тәуелділіктер бағдарламалау үлгісі арқылы белгілі, бұл компиляторға ағынды талдауды орындауға және SRF-ті оңтайлы жинауға мүмкіндік береді. Көп жағдайда, мұндай кэш және DMA басқару жобаның кестесінің көп бөлігін алады, бірақ ағынды процессор (немесе кем дегенде Imagine) мұны толығымен автоматтандырады. Стенфордта жүргізілген сынақтар компилятордың жадты жоспарлауда қолмен баптаудан кем емес немесе одан да жақсы жұмыс істейтінін көрсетті. Бұл дәлелденген: кластерлер арасындағы байланыс сирек болғандықтан, кластерлердің саны көп болуы мүмкін. Алайда, кластер ішіндегі байланыс жиі болғандықтан, әр кластер АЖБ-ның аз мөлшерін тиімді пайдалана алады, сондықтан оның өте тиімді болуы керек. Осы АЖБ-ны деректермен қамтамасыз ету үшін әр АЖБ жергілікті регистрлік файлдармен (LRF) жабдықталған, олар негізінен оның қолданылатын регистрлері болып табылады. Бұл үш деңгейлі деректерге қол жеткізу үлгісі уақытша деректерді баяу жадтан алыс ұстауды жеңілдетеді, осылайша кремнийдік іске асыру өте тиімді және энергияны үнемдейді.
Жабдықтар тізбегі мәселесі
Дегенмен, бір ретке үлкен жылдамдыққа қол жеткізуге болады (тіпті, ағымдық есептеу кезінде негізгі GPU-лардан да), барлық қолданбалар осыдан пайда таппайды. Ең үлкен мәселе – байланыс кешігуі. PCI Express толық дуплекс байланысы арқылы оны жақсартса да, GPU-ны (немесе жалпы ағынды процессорды) жұмыс істеуге келтіру көп уақытты алуы мүмкін. Бұл оларды кішкентай деректер жиынтығымен пайдаланудың тиімсіз екенін білдіреді. Ядроны өзгерту өте қымбат операция болғандықтан, ағын архитектурасы кішкентай ағындар үшін де қосымша шығындарға түсіреді, бұл құбылыс "қысқа ағын эффектісі" деп аталады. Ағынды процессорларда құбырлар кеңінен таралған және жиі қолданылатын практика, ал GPU-лардағы құбырлар 200 сатыдан асып түседі. Параметрлерді ауыстыру құны өзгертілген параметрге байланысты, бірақ қазір ол әрқашан қымбат деп есептеледі. Осы мәселелерді құбырдың әртүрлі деңгейлерінде болдырмау үшін "über shaders" және "текстуралық атлас" сияқты көптеген техникалар қолданылды. Бұл техникалар GPU-ның ерекшеліктеріне байланысты ойындарға бағытталған, бірақ олардың принциптері жалпы ағынды өңдеу үшін де қызығушылық тудырады.