Матрични процесори - Информатика, програмиране

6 процесора Matrix

Тръбопроводите и суперскаларната архитектура обикновено увеличават скоростта само с 5-10 пъти. За да увеличите производителността с 50, 100 или повече пъти, трябва да създадете компютри с множество процесори.

Във всяка паралелна компютърна система процесорите, изпълняващи различни части от една задача, трябва по някакъв начин да взаимодействат помежду си, за да обменят информация. Как точно трябва да стане размяната? За това са предложени и приложени две стратегии: мултипроцесори и мултикомпютри. Основната разлика между стратегиите е наличието или отсъствието на споделена памет. Тази разлика засяга както дизайна, дизайна и програмирането на такива системи, така и тяхната цена и размер.

6.1 Матрични процесори

Много проблеми във физическите и техническите науки включват използването на масиви или други подредени структури. Често едни и същи изчисления могат да се извършват върху различни набори от данни едновременно. Подредеността и структурата на програмите, предназначени за извършване на този вид изчисления, са много удобни от гледна точка на ускоряване на изчисленията поради паралелната обработка на командите.

Процесорът с масив се състои от голям брой подобни процесори, които изпълняват една и съща последователност от инструкции за различни набори от данни. Първият в света такъв процесор е ILLIAC IV (Университет на Илинойс). Тя е показана схематично на фигура 6.1. Първоначалната идея беше да се конструира машина, състояща се от четири квадранта, всеки от които съдържаше матрица 8 x 8 от блокове процесор/памет. Имаше един контролен блок за всеки квадрант. Той изпрати заповеди, които бяха изпълнени от всичкипроцесори едновременно, докато всеки процесор използва свои собствени данни от собствената си памет (данните бяха заредени по време на инициализацията). Това решение, което се различава значително от стандартната машина на фон Нойман, понякога се нарича архитектура SIMD (единичен поток от инструкции и множество потоки от данни). Поради много високата цена беше построен само един такъв квадрант, но той можеше да изпълнява 50 милиона операции с плаваща запетая в секунда. Ако машината беше построена с помощта на четири квадранта, тя можеше да извършва 1 милиард операции с плаваща запетая в секунда, а изчислителната мощност на такава машина би била два пъти по-голяма от тази на компютрите в целия свят.

6.2 Векторен процесор

От гледна точка на програмиста, векторният процесор е много подобен на матричния процесор. Подобно на матрицата, той е изключително ефективен при извършване на последователност от операции върху двойки елементи от данни. Въпреки това, за разлика от матричния процесор, всички операции по добавяне се извършват в един блок за сумиране, който има конвейерна структура. Cray Research, основана от Seymour Cray, пусна много модели векторни процесори, като се започне с Cray-1 A974.

И двата вида процесори работят с масиви от данни. И двете изпълняват едни и същи инструкции, които например добавят по двойки елементите на два вектора. Въпреки това, ако матричният процесор има толкова суматори, колкото има елементи в масива, векторният процесор съдържа векторен регистър, състоящ се от набор от условни регистри. Тези регистри се зареждат от паметта с една инструкция, която всъщност го прави последователно. Командата за добавяне добавя елементите на два такива вектора по двойки, като ги зареждаот два векторни регистъра в суматор с конвейерна структура. В резултат на това от суматора излиза друг вектор, който или се поставя във векторния регистър, или веднага се използва като операнд при извършване на друга операция с вектори.

Матричните процесори в момента не се произвеждат, но принципът, на който са базирани, все още е актуален. Подобна идея се използва в наборите от инструкции MMX и SSE на процесорите Pentium 4 и успешно решава проблема с ускореното изпълнение на мултимедийни програми. В тази връзка компютърът ILLIAC IV може да се счита за един от прародителите на процесора

6.3 Вътрешнопроцесорна многопоточност

Всички съвременни конвейерни процесори имат един и същ проблем - ако дадена дума не бъде намерена в кешовете на първо и второ ниво при заявка на памет, отнема много време, за да се зареди тази дума в кеша, през което конвейерът е неактивен. Една техника за решаване на този проблем се нарича многопоточност на чип. Той позволява на процесора едновременно да управлява множество програмни нишки и по този начин да маскира времето на престой. Накратко, принципът може да бъде формулиран по следния начин: ако програмна нишка 1 е блокирана, процесорът може да гарантира, че хардуерът е напълно зареден чрез стартиране на програмна нишка 2.

Основната идея е проста, реализира се по много начини. Първият от тях, наречен фино-зърнеста многонишковост, когато се прилага към процесор, способен да извиква една инструкция за тактов цикъл, е илюстриран на Фигура 6.2. Фигура 6.2 a-c показва три програмни потока (A, B, C), съответстващи на 12 машинни цикъла. По време на първия цикъл нишката A изпълнява команда A1. Тъй като тази команда завършва в един цикъл,когато настъпи вторият цикъл, се стартира команда A2. Неговият достъп до кеша от първо ниво е неуспешен, така че минават два цикъла, преди желаната дума да бъде извлечена от кеша от второ ниво. Изпълнението на нишката продължава в цикъл 5. Както е показано на фигурата, нишките B и C също са редовно неактивни. Като част от това решение, следващата команда не се извиква, докато предишната не бъде завършена. По-точно, при наличието на сложен брояч на хитове, в някои случаи това е допустимо, но за простота изключваме такава възможност.

При прецизната многопоточност времето на празен ход се маскира чрез изпълнение на нишки "в кръг", т.е. различни нишки се стартират в съседни цикли (Фигура 6.2 d). Докато пристигне цикъл 4, достъпът до паметта, иницииран от инструкция A1, е завършен, така че дори ако инструкция A2 се нуждае от резултата от инструкция A1, тя започва. В този случай максималната продължителност на неактивност е два цикъла, което означава, че ако има три програмни нишки, операцията на неактивност все още завършва навреме. При време на празен ход от 4 цикъла ще са необходими 4 програмни нишки за непрекъсната работа и т.н.

Тъй като различните програмни нишки не са свързани помежду си по никакъв начин, всяка от тях се нуждае от собствен набор от регистри. Трябва да се посочи за всяка извикана инструкция и тогава хардуерът ще знае до кой набор от регистри да има достъп, когато е необходимо. Следователно максималният брой едновременно изпълняващи се програмни нишки се определя по време на разработката на чипа.

Причините за престой не се ограничават до достъп до паметта. Понякога изпълнението на следващата инструкция изисква резултат от предишната инструкция, която все още не е оценена. В други случаи командата не може да бъде извикана, защото следва условно разклонение, посокатакоето все още е неизвестно. Общото правило е формулирано по следния начин: ако има k стъпки в конвейера, но поне k програмни нишки могат да бъдат стартирани в кръг, тогава повече от една команда не може да бъде изпълнена в една нишка във всеки даден момент, така че конфликтите между тях са изключени. В такава ситуация процесорът може да работи на пълна скорост без празен ход.

Естествено, броят на наличните нишки не винаги е равен на броя на етапите на тръбопровода, така че някои разработчици предпочитат техника, наречена грубо зърнеста многонишковост, която е илюстрирана на Фигура 6.2, д. В този случай програмната нишка A продължава да се изпълнява последователно, до време на престой. В този случай се губи един цикъл. След това има превключване към първата команда от програмния поток B (B1). Тъй като тази команда незабавно преминава в състояние на неактивност, в цикъл 6 командата C1 вече е изпълнена. Тъй като един цикъл се губи всеки път, когато дадена инструкция е неактивна, грубата многонишковост изглежда е по-ниска от финозърнестата многонишковост по отношение на ефективността, но има едно съществено предимство - поради по-малкия брой програмни нишки, консумацията на процесорни ресурси е значително намалена. При недостатъчен брой активни нишки тази техника е оптимална.

Въз основа на нашето описание грубата многопоточност просто превключва между нишки, но това не е единственият курс на действие, предвиден от тази техника. Възможно е незабавно да превключвате от команди, които имат потенциал да причинят престой (като зареждане, запазване и преходи), без да се налага да установявате дали престоят действително е планиран. Тази стратегия ви позволява да превключвате по-рано от обикновено (веднага след декодирането на командата) и елиминира безкрайнитецикли. С други думи, изпълнението продължава, докато се открие възможност за проблем, след което следва превключването. Такова често превключване прави грубо-зърнестата многонишковост свързана с фино-зърнестата многонишковост.

Независимо от използваната опция за многопоточност, е необходимо по някакъв начин да се проследи принадлежността на всяка операция към определена програмна нишка. В рамките на фината многопоточност на всяка операция се присвоява идентификатор на нишка, така че когато се движите по конвейера, нейната принадлежност не е под съмнение. Грубата многонишковост предоставя възможност за почистване на тръбопровода преди стартиране на всяка следваща нишка. В този случай идентичността на текущо изпълняваната нишка е ясно дефинирана. Естествено, тази техника е ефективна само ако паузите между превключването са много по-дълги от времето, необходимо за изчистване на тръбопровода.

Всичко по-горе се отнася за процесори, които могат да извикват не повече от една инструкция на тактов цикъл. Знаем обаче, че това ограничение не е от значение за съвременните процесори. Във връзка с изображението на Фигура 6.3 приемаме, че процесорът може да извика 2 инструкции на цикъл, но твърдението за невъзможността да се стартират следващи инструкции, ако предишната е неактивна, остава в сила. Фигура 6.3a илюстрира фина многопоточност в двоен суперскаларен процесор. Както можете да видите, нишка A изпълнява първите две команди по време на първия цикъл, но нишка B изпълнява само една команда във втория цикъл.

В суперскаларните процесори има друг начин за организиране на многопоточност - така наречената синхронна многопоточност (едновременна многопоточност), която е илюстрирана на фигура 6.3, c. Тази техникае усъвършенствана версия на грубата многопоточност, при която всяка програмна нишка може да изпълнява две инструкции на такт, но в случай на неактивност се стартират инструкциите на следващата нишка, за да се осигури пълно използване на процесора. При синхронна многопоточност всички функционални блокове са напълно заредени. Ако командата не може да бъде стартирана, защото функционалният блок е зает, се избира командата от друга нишка. Фигурата предполага, че инструкция B8 е неактивна в цикъл 11, така че инструкция C7 се изпълнява в цикъл 12.