Що е то HPC?
Що е то HPC и има ли то почва у нас? Кои са тези особености на хардуера и софтуера, които правят HPC уникална по рода си област на компютърното познание?
HPC или High Performance Computing е технически термин, с който се обозначава специфичен клас от хардуерни и софтуерни технологии, както и спецификата на тяхното програмиране и използване. Обикновено към класа на HPC отнасят научните и инженерни задачи, изискващи извършването на огромна по обем обработка на данни и използващи за целта мощни (супер-)компютри, които далеч надхвърлят по производителност средностатистическия домашен или бизнес компютър. Към HPC често (и неправилно) причисляват и т.нар. High Throughput Computing (или HTC). Въпреки, че целта и при HPC, и при HTC е да се обработи възможно най-много информация за единица време, при HTC информацията обикновено постъпва под формата на множество работни единици – заявки или транзакции. Типичен пример за HPC е детайлното моделиране на климатичната обстановка с цел добиване на по-точна прогноза за времето, а за HTC – обработването на милиони заявки за търсене в огромна база данни (напр. Google). Тъй като повечето HPC задачи обработват информация под формата на масиви от числа с плаваща запетая, проиводителността при тях обикновено се измерва в милиарди операции с плаваща запетая за секунда, Gflop/s (гигафлопи за секунда или просто гигафлопси), където flop е съкратено от floating-point operation. С развитието на суперкомпютърната техника префиксът на мярката постепенно се измества от гига- към тера-, като най-бързият суперкомпютър в света, Roadrunner на лабораторията в Лос Аламос, има производителност от над 1 Pflop/s (петафлопи за секунда). При HTC производителността обикновено се измерва в транзакции за секунда, tps, със съответните степенни префикси от системата SI.
HPC се различава от обикновената изчислителна техника, както в хардуерен, така и в софтуерен аспект. Суперкомпютрите са бързи. При това, те не са просто бързи, а БЪРЗИ, като бързодействието често пъти се постига с нетрадиционни за масовата техника похвати. Като пример мога да посоча факта, че докато масата персонални компютри в България през 80-те години на миналия век са 8-битови скаларни CISC архитектури, работещи на честоти 1—4 MHz и извършващи едва десетина Kflop/s без допълнителни математически копроцесори (или транспютри), типичният представител на суперкомпютрите от него време Cray-1 е 64-битова векторна RISC архитектура с тактова честота 80 MHz и пикова производителност от 250 Mflop/s. Въпреки, че последната изглежда смешно на фона на съвременната микропроцесорна техника, за реализиране на подобно устройство през тях години е било необходимо да се използва екзотичната емитерно свързана логика (ECL), осигуряваща висока скорост на превключване за сметка на много ниска степен на интеграция и ОГРОМНА консумирана мощност, изискваща иновативни и скъпи охлаждащи системи. Друг подход за увеличаване на изчислителната мощност, доминиращ HPC пазара и в наши дни, е едновременното използване на множество (до стотици хиляди) процесорни елементи – т. нар. масивно-паралелни архитектури. При това инженерната сложност се пренася от построяването на свръхбърз микропроцесор към измислянето на начин за ефикасно свързване на процесорните елементи. За целта обикновено се използват специализирани превключващи елементи (напр. SeaStar 2 в XT3/XT4 на Cray), осигуряващи предаването на информацията по сложна система от връзки. В зависимост от броя на свързаните процесори, свързващата подсистема може или да бъде от тип “телефонна централа” (crossbar), която осигурява директна комутируема свързаност от тип всеки с всеки (напр. при IBM SP2), или информацията да се маршрутизира върху дву-, три- или повече измерна мрежа от изчислителни възли, подобно на силно структурирано и опростено подобие на Интернет. Кросбар мрежите осигуряват огромна пропускателна способност (измервана в GiB/s) по множество от независими канали и ниска латентност (времето между стартиране на операция по пренасяне на информация и нейното физическо завършване), но сложността им нараства експоненциално с броя на свързаните процесори, а разширяването им за включване на допълнителни процесори е практически невъзможно, поради което те почти не намират приложение в съвременната HPC техника. Далеч по разпространени са мрежите с маршрутизиране на трафика. Освен специализираните комуникационни контролери, широко приложение намират и мрежовите преносни среди с общо предназначение InfiniBand и Ethernet, последната главно в съвременната инкарнация с пропускателна способност от 10 Gbps.
Особеният хардуер изисква и особено програмиране.
Отличителна черта на HPC софтуера е, че логиката в него е сведена до минимум, а данните са структурирани по възможно най-прост начин, позволяващ тяхната паралелна и/или векторна обработка.
Корените на голяма част от програмните кодове датират от времена, когато доминиращ програмен език е бил FORTRAN 77, понятието “структуриран тип данни” е било приемано с недоумение, а на оператора GOTO
не се е гледало с отвращение.
По традиция известна част от HPC приложенията продължават да се пишат на FORTRAN, понятието “структуриран тип данни” продължава да буди недоумение сред определени кръгове, а операторът GOTO
продължава да живее щастливо сред милионите редове програмен код.
Смело може да се твърди, че кодът на един съвременен браузър е многократно по-сложен и от най-сложната програма за симулации в областта на твърдотелната физика.
И въпреки това, писането на качествен и бърз HPC код е нетривиална инженерна задача и изисква много задълбочено познаване на основите на микропроцесорната и мрежова технология, лежаща в основата на съвременните компютърните архитектури.
Елементарна задчка за размисъл: защо следният код
int bigarray[DIM1][DIM2], i, j;
for (i = 0; i < DIM1; i++)
for (j = 0; j < DIM2; j++)
bigarray[i][j] *= 2;
се изпълнява шест пъти по-бързо (при DIM1 = DIM2 = 10000
) от напълно аналогичния
int bigarray[DIM1][DIM2], i, j;
for (j = 0; j < DIM2; j++)
for (i = 0; i < DIM1; i++)
bigarray[i][j] *= 2;
(жокер: причините са повече от една)
Програмирането на (масивно-)паралелни машини поставя допълнителни предизвикателства.
За целта са развити няколко програмни техники и парадигми, които предлагат различно съотношение между леснотата на тяхното използване и мащабируемостта на резултатните изпълними кодове.
В най-простия случай се разчита на компилатора да открие и по възможност паралелизира части от програмния код (т. нар. автоматична паралелизация), с която задача различните компилатори се справят с променлив успех.
В най-сложния случай цялата грижа за комуникацията и синхронизацията между отделните изчислителни елементи е оставена на програмиста, като на последния се осигурява само стандартен набор от комуникационни примитиви (MPI, PVM и др.).
Обикновено това е методът, използван в най-производителните и мащабируеми кодове.
По средата на спектъра са т. нар. “data parallel” парадигми, при които се използват или специални диалекти на известни програми езици, разширени с допълнителни паралелни конструкции, напр. High Performance Fortran (HPF) или Unified Parallel C (UPC), или стандартните диалекти се разширяват с позволените в тях механизми, напр. OpenMP (реализиран като набор от #pragma
директиви в C и като специално форматирани коментари във Fortran).
За MPI и OpenMP ще стане дума по-нататък в следващите писания по въпроса.
Има ли HPC почва у нас? Учудващо за мнозина, но отговорът е утвърдителен. Компютрите се използват за решаване на инженерни и научни задачи в България още от времената на машините от Единната Система и СМ, “аналози” на популярни за времето си мейнфрейм машини на IBM и миникомпютри на DEC. През 90-те години на миналия век, когато връх на персоналните компютри в родината бяха грешащият при деление Pentium (а само по експота и панаири може да се види мускулестият му братовчед Pentium Pro), в различни изчислителни центрове в страната “мелят” 64-битови RISC машини (една от които кротко залежава като музеен експонат под бюрото ми във ФзФ). А откак преди година България се сдоби и с 8192-ядрен Blue Gene/P, то не остана и капка съмнение, че у нас HPC има почва. Доколко стабилна е тя, бъдещето ще покаже.