Тема 3

Процесори - вътрешна структура и конвейери. SIMD и MIMD процесори.


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


Структура на процесора

В класическата, фон Нойманова архитектура, АЛУ е "сърцето" на процесора. То:

АЛУ-то работи на принципа на потенциалната логика - 32 входни потенциала (носещи логически единици или нули, в зависимост от стойностите си) се подават на двата му входа. Един работен такт изглежда така:
При пик (фронт, повишаване) на синхро-сигнала се отварят вратите на АЛУ-то за прочитане. Операндите се четат по време на платото на сигнала. След усвояване на сигналите, при пада (понижаването) на тактовия сигнал АЛУ затваря вратите и изпълнява исканата операция върху операндите. Получавайки резултата от операцията, АЛУ го изпраща на изхода си, където той трябва да бъде готов, със стабилни потенциали, до края на падината на тактовия сигнал. Наблягаме върху това, че една операция се изпълнява за един такт, и резултатът от нея трябва да бъде готов до края на такта.
Напомняме също така, че една машинна инструкция съдържа един или повече кодове на операции, нула или повече сведения за местоположение на операндите, и понякога - други неща. Накратко:

  • 1 операция - 1 такт;
  • 1 инструкция - 1 или повече такта (най-често между 3 и 30).

Структура на процесор с една обща вътрешна шина

one_bus_processor.PNG
При това изпълнение една шина(с 32 линии за данни) обхожда двата входа и изхода на АЛУ-то. Обслужването на АЛУ с една шина става по следния начин:
  1. Първи такт: управляващото шината устройство предава единия операнд по шината, като той се запазва във временен регистър на вход А на АЛУ).
  2. Втори такт: подава се втори операнд, отново се отваря временен регистър - този път на вход B, и операндът се запазва в него.
  3. Трети такт: двата регистъра си затварят входовете и си отварят изходите (тоест изпращат на АЛУ-то записаната в тях инфомрация); АЛУ извършва операцията над операндите.
  4. Четвърти такт: подава се резултатът по шината, достигайки управляващото устройство.

Структура на процесор с две вътрешни шини

two_bus_processor.PNG
Този път имаме две шини и един регистър. Шината е свързана с входовете на АЛУ.
  1. Първи такт - постъпва първи операнд и се записва в регистъра (accumulator) на вход A.
  2. Втори такт - постъпва втори операнд директно на вход B на АЛУ.
  3. Трети такт - в началото на трети такт АЛУ връща резултат

Структура на процесор с три шини

Имаме три шини - по една за всеки вход/изход на АЛУ.
three_bus_processor.PNG

  • Първи такт - в началото подаваме операдните по съответните шини, до края на първи такт имаме резултат от АЛУ.

Видно е: повече шини - по-бързо действие.

Блокове регистри

В процесора има поне един блок регистри, който съдържа поне 16 регистъра (може да са над 100, но са най-малко 16 - не правят вече процесори с по-малко). Тези регистри са за съхраняване на междинни резултати от АЛУ-то и операнди.
При структура с три процесорни шини възниква проблем: какво става, ако за един и същ такт се наложи да се пише в място, откъдето се чете?
Пример: x86-команда за събиране:

ADD AX, DX

Случва се следното: На вход А се подава съдържанието на регистъра AX. На вход B - съдържанието на DX. Резултатът се записва в AX. Обаче всичко - включително четене и писане от и в AX - става за един такт.
За да не се наложи да се изпълняват подобни команди на два такта, се въвеждат двустъпални регистри. При тях новото съдържание влиза в първо стъпало, а старото се чете от второ. На следващия такт съдържанието на първо стъпало преминава във второ и и цикълът може при нужда да се повтори. Неудобното е, че за всеки регистър се появява нужда от две шини - четене и писане - което усложнява блока регистри. В наше време това може би не е голям проблем.
Процесорите се градират в зависимост от : регистрите, шините и входовете на АЛУ (размера на входна дума). Обикновено при умножение и делене процесорите автоматично работят с двойки регистри, затова тези операции се извършват на повече тактове (времето за
изпълнение се увеличава поне двукратно).

Забързване на ЦП

За да се управлява преносът на данни - кога и как се използва шината, кога са отворени и затворени входовете и изходите - се грижат управляващото устройство (блок за управление) и блок за управление на шината. За връзката с паметта има два варианта: или БУШ да се обръща към контролера на паметта, от който да получава данните и да ги препраща по шината, или контролерът на паметта да ползва собствена (четвърта) шина за достъп до АЛУ.
В стремежа за бързодействие на ЦП се раждат различни идеи. Една от тях (която разгледахме) е за добавяне на допълнителни шини.

Други идеи внасят промени в начина на работа на АЛУ. Класически, по фон Нойман, всички инструкции минават през 5 етапа:

  • Извличане (изпълнява се от блока за управление на шината)
  • Дешифриране (управляващо устройство)
  • Адресиране (устройство за адресиране на операндите)
  • Изпълнение (АЛУ)
  • Записване (БУШ)
5_step_program.PNG
C1 до C5 могат да бъдат отделни физически блокове, или части от общо устройство.
Всеки етап е минимум по един такт. Изпълнява се наведнъж само един блок (операция) от тези пет, останалите чакат.
Съвсем естествено се появява идеята C1 до C5 да работят като конвейер: влиза инструкция в C1, след това, докато тя преминава към C2, следващата инструкция влиза в C1, и така нататък. Този начин на конвейерна обработка на данните не променя времето за изпълнение на една инструкция, но за повече на брой инструкции осигурява значително по-голямо бързодействие (до 5 пъти по-бързо, тъй като се изпълняват по 5 инструкции в цикъла C1 - C5).

Но се откроява недостатък: за най-голяма проиводителност на конвейера, инструкциите трябва да са строго линейни. Ако имаме инструкция за преход, това ще стане ясно чак на етап 4 (АЛУ), в който момент конвейерът ще трябва да се "разтовари", да се извърши преход, и отново да започне "товаренето". За да се избегне това неудобство, се използва предварителна дешифрация - допълнителен етап преди C1 определя дали инструкцията е за безусловен преход, и ако открие такава, изчислява адреса на прехода и го подава на C2, осигурявайки по този начин непрекъсната работа на конвейера.
Бележка: Компилаторите създават предимно линеен код и има стремеж от езиците за програмиране да бъде изхвърлено goto1. Условният преход обаче не се улавя от предварителна дешифрация.

По-нататъшно подобрение на бързодействието въвежда два конвейера (физически две еднакви последователности от устройства). Инструкциите, ако са последователни, минават паралелно, а ако не (ако изпълнението на втората зависи от резултата от първата), се изчакват и минават една след друга.
5_step_program_extended.PNG

При конвейера, скоростта се определя по най-бавното стъпало - стъпалато на изпълнението. Затова бива измислен суперскаларният конвейер. В него работят 2 АЛУ-та и допълнителни елементи за процеса на изпълнение - целта е да има повече работещи устройства (отделни физически устройства), който са специализирани и бързо изпълняват определените за тях операции. Управляващото устройство определя дали да пуска последователно или паралелно инструкциите на конвейрите.
Направата на по-бързи и естествени процесори запазва Ноймановата архитектура.

SIMD процесори

Single Instruction Multiple Datastream ("една инструкция, различни памети") процесорите включват масивни (array) и векторни процесори. SIMD е организация на работата, при която една програма се изпълнява върху много процесори, като една инструкция се смята на различни места (типично за масивните процесори).

Масивни(array) процесори

array_processor.PNG
Масивните процесори се състоят от много процесори, които изпълняват една и съща инструкция върху данни от паметта, като всички обработват различни парченца от тези данни едновременно. Всеки процесор си има собствена ОП и си работи с нея. Масивните процесори работят много добре при матрични изчисления върху матрици, по-малки от проектния размер (тоест, ако имаме 64x64 процесора, най-добре работим върху матрици, не по-големи от 64x64). При по-големи матрици, те се разделят на части, които се обработват поотделно. Матричните процесори са сравнително скъпи и тясно специализирани, поради което отмират постепенно.

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

vector_processor.PNG
При векторния процесор имаме един вектор с множество ЦП. Паметта е обща, но с едновременен магистрален достъп на всички ЦП до нея. Реално имаме същата работа като масивния процесор, но парчетата памети, с които работи, са вектори, а не матрици (матриците се обработват поредово или постълбово). Широко разпространени във видеообработващ хардуеър (видеокарти, игрови конзоли), както и в суперкомпютрите (например на Cray).

MIMD процесори

Друг подход към по-мощни процесори е Multiple instruction, Multiple Datastream ("различни инструкции, различни памети"). Това са няколко процесора(мултипроцесорна структура), свързани с магистрала към обща ОП, като процесорите не изпълняват една и съща, а отделни програми (съответно, могат да се пресекат в определени моменти по отношение на работата с ОП (операнди и записване на резултати)). Начинът на работа се нарича разпределена обработка между процесорите и се синхронизира трудно. Съществено се различава от концепцията на фон Нойман.

MIMD_processor.PNG
Може да се интегрират 2 процесора (изчислителни ядра) в общо устройство - получава се двуядрен процесор. Многоядрените процесори получават все по-широко разпространение в персоналните компютри. Най-често отделните ядра имат отделни блокове регистри. Чрез специализирани програми за изпълнение двуядрените процесори могат да повишат общата производителност на системата. Като пример, едното ядро може да се използва за системата, а другото - за приложния софтуеър, за разлика от едноядрен процесор, който би работил в режим на времеделение.dual_core_processor.PNG
Съществуват още екзотични мултипроцесорни архитектури. Една от тях е всеки процесор да има собствена ОП, но да има и една обща памет за всички процесори. Тези машини са сложни до такава степен, че за ефективната им работа са разработени специални програмни езици.
MIMD_multyOP_processor.PNG
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License