Процесор с множество функционални устройства- Част 1

- Секция Компютри

1.Въведение

Висока скорост на изчисление може да се получи и по начин различен от аритметичния конвейер, а именно чрез множество функционални устройства (ФУ) вътре в единичния процесор. В този случай всяко ФУ се активира чрез отделна команда. ФУ могат да бъдат еднотипни по структура, т.е. универсални по функциониране или разнотипни по структура т.е. специализирани по функциониране. Някои от ФУ могат да се повтарят.


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

Разбира се, множеството от ФУ има за решаване твърде важен проблем, известен като синхронизация между устройствата. Синхронизацията в конвейера се постига чрез самата структура на данните в операндите. При процесор с няколко ФУ проблемът е малко по-сложен. От една страна, различните команди могат да заемат различно време за изпълнение. От друга страна, времето за изпълнение на една команда се влияе от местоположението на операндите й, а също така и от това къде се записва резултата. И на края, някои от входните операнди на дадена команда могат да бъдат резултат от друга команда, изпълнявана по същото време, т.е. съществува зависимост по данни. И така, проблемът за синхронизацията е комплексен и неговото решение се търси по два начина: чрез апаратни средства и чрез програмни средства.
 
2. Синхронизация на апаратно ниво
 
Синхронизацията се реализира по време на изпълнение на програмата. Този подход исторически първи се е появил в компютъра CDC 6600 през 1964. Обобщената структурна схема на процесорът е дадена на фиг.6-1. От нея става ясно, че по същество това е конвейер за команди, в който с цел намаляване на времето за изпълнение на командите, изпълнителното устройство е съставено от няколко паралелно работещи ФУ (операционни устройства).Така става възможно да се реализира функционален паралелизъм заложен в програмата. Като правило ФУ взаимодействат само с регистрите. Така сравнително лесно се решава един от проблемите със синхронизацията - зависимостта на времето за изпълнение на командата от местоположението на данните.


Фиг.6-1. Обобщена структура на процесор, реализиращ функционален паралелизъм
 
Всички съвременни процесори, реализиращи така наречената суперскаларна архитектура, като например P5,P6 на Intel, K5, K6 и K7 AMD, Alpha, PC601, PC602 на Motorola и други, експлоатират тази идея. Разбира се ФУ в тези случаи представляват сами по себе си конвейери. Синхронизацията на паралелно работещите конвейери се осъществява чрез логика, която е значително по сложна в сравнение с тази за управление на единичния конвейер.
 
3. Синхронизация на програмно ниво
 
В този случай компилаторът е отговорен за насрочването на изпълнението на командите, т.е. за синхронизацията на множеството ФУ. Този подход води до архитектура известна под името процесор със свръхдълга команда - VLIW (Very Long Instruction Word). В известен смисъл VLIW е логическо разширение на RISC процесорите. При VLIW архитектурата, компилаторът пакетира няколко прости команди в една дълга дума на командите. Всяко поле от тази дълга дума управлява директно едно ФУ.
 
Процесорът с VLIW архитектура притежава следните характеристики:
 
- Единствен централен контролер издава във всеки такт една дълга команда, т.е. процесорът има един единствен програмен брояч и така се реализира обработка от тип SIMD.
- Всяка дълга команда инициира няколко елементарни и независими операции. Това става, като всяко поле директно управлява едно ФУ.

Въпросът за независимостта на операциите е достатъчно многообразен и сложен, но като пример може да се посочи следното: компилаторът може да постави R1+R2->R3 и R4+R5->R6 в една дълга дума, но не и да пакетира R1+R2->R3 и R3+R5->R6, защото втората операция трябва да изчака резултата от първата да бъде записан в R3.
- Всяка операция заема предварително известен брой цикли.
- Всяка операция може да бъде изпълнена чрез конвейер.
 
Компилаторът едновременно анализира един модул или подпрограма. След изпълнение на "класическите" процедури за оптимизация, компилаторът строи граф на изпълнимата програма на ниво отделни команди.
Използвайки евристични оценки за вероятността на преходите, компилаторът избира най-вероятния път за изпълнение на програмата. След това този път се предава на генератора на изпълнителните кодове, който го разглежда като път не съдържащ преходи. Генераторът на изпълнителните кодове опакова операциите в дълга дума, отчитайки такива фактори, като зависимост по данни, оптимално разпределение на ФУ, регистрите, системната шина, обръщенията към паметта и създава обектен код.

В системата команди на процесорът с VLIW архитектура има команди за сравнение с установяване на флаг в едноразряден
регистров файл на прехода и команда за преход по флаг. Това позволява на компилаторът да постави команди за сравнение там където е удобно, в момент не свързан с физическото изпълнение на прехода. Преходът се изпълнява, ако указания регистър за преход съдържа единица. Тази процедура е сходна с процедурата на отложеното разклонение, използвана в RISC процесорите .
Изпълнението на условни преходи в процесор с VLIW архитектура поражда не тривиални проблеми. В типична програма един условен преход се явява на 5-8 команди. Ако повече от 5 команди се обединяват в една дълга команда, е необходимо да се предвиди някакъв механизъм, допускащ наличие в една дълга команда на няколко прехода. В компютрите TRACE [7] е въведена схема на приоритетите. Да предположим, че два прехода следващи един след друг в изходната програма, се пакетират в една свръхдълга команда. Тогава е необходимо да се установи между тях приоритет, който определя адреса за предаване в случай, когато са изпълнени и двата прехода. Очевидно, последователността на командите в изходния текст на програмата ще определи и приоритета.

Всяка операция явно е определена на нивото на системата команди, така че компилаторът може оптимално да планира тяхното изпълнение. Конвейеризацията осигурява възможност за стартиране във всеки цикъл на нова команда във всяко ФУ. Този явен паралелизъм позволява максимално да се използува производителността на оборудването, защото функционалните устройства не се изчакват едно друго. Конвейеризацията допълнително дава възможност за повишаване на тактовата честота.
Отсъствието на взаимни блокировки в работата на ФУ позволява да се опрости управляващата логика и да се повиши бързодействието. Съществуват оценки, съгласно които взаимното блокиране на конвейера в процесора със стандартна архитектура отнема до 15% от такта.
 
Всеки VLIW процесор съдържа голям брой пътища за данните между ФУ, управлението на които се планира във фаза компилация. Така стават излишни такива "стандартни" средства за синхронизация като арбитър на шината, опашки и др.
Разликата в бързодействието между процесорът и паметта винаги се е явявал проблем на проектантите. Известни са два подхода за решаване на този проблем - използване на кеш-памет и разпределяне на адресите в различни банки памет. Архитектурата на компютър със свръхдълги команди изисква висока скорост на обслужване на заявките, което се удовлетворява чрез използването на разслоена памет.
 
Пример. Даден е следният програмен фрагмент записан на езика С, който трябва да се преобразува в свръхдълги команди за изпълнение.
int i,j;
real a,b,c,q;
{
c=2*i*(2*a+3*b);
q=(а+в+c)-4*(i+j);
}
 
Най-напред компилаторът преобразува изчислението на двата израза в последователност от "стандартни" асемблерни команди. По-долу е даден един примерен вариант, записан на псевдо асемблер (за по-голяма яснота са въведени помощните променливи t1.....t8 и се използва нотация характерна за езиците от високо ниво).
Load a
Load b
t1=2*a
t2=3*b
t3=t1+t2
Load i
Load j
t4=2*i
c=t3*t4
Store c
t5=i+j
t6=4*t5
t7=a+b
t8=c+t7
q=t8-t6
Store q
 
За да се съставят свръхдългите команди трябва да е ясна структурата на процесора. Ще предполагаме, че той се състои от две устройства за целочислена аритметика (INT1, INT2), две устройства за реална аритметика (FP1, FP2) и две устройства за трансфер на данните между паметта и регистрите (LS1, LS2).Тогава компилаторът може да опакова командите, например по следния начин:
И така, изпълнимата програма за хипотетичния VLIW процесор съдържа 7 свръхдълги команди (думи). Прави впечатление, че не всички ФУ се използуват заедно, което говори за по-ниска ефективност. Действително, ако се предположи, че времената за изпълнение на една асемблерна команда и една дълга команда са равни (с първо приближение това е вярно), то лесно може да се определи коефициентът на бързодействие по формула 3.1:
 
S=T1/Tp=16/7=2.29,
 
а от тук и ефективността:
 
E=S/P=2.29/6=0.38.
 

Този подход се реализира в различни компютри, напр. FPS 120B(L), FPS 164 [1], ИЗОТ 2001С, в компютрите от фамилията TRACE на фирмата Multiflow Computer Inc. [7], ELI 512 разработка на Йелския университет (512 битова дума), QA 1 и QA 2 [2] разработка на университета в Киото (1024 битова дума) и др. От началото на 1998г. Intel и Hewlett-Packard разработват архитектура на такъв процесор (IA-64), който трябва да поддържа съвместно командите за х86s на Intel и за Precise Architecture на Hewlett Packard [3,4]. И на края трябва да се посочи новопоявилият се процесор Crusoe на Transmeta, ориентиран за използване в преносими компютри [5].

Съдържание:

Процесор с множество функционални устройства- Част 1

Процесор с множество функционални устройства- Част 2

 






Коментирай свободно: