Багатошинна структура процесора
Наведена на рис. 4.1 одношинна структура процесора є достатньо простою. Тому вона широко використовується при побудові процесорів реальних комп’ютерів. Зокрема, за такою схемою побудовано більшість мікроконтролерів, від яких не вимагається висока швидкодія. Якщо ж така вимога існує, то застосовується багатошинна організація процесора, в якій завдяки наявності багатьох шин забезпечується можливість паралельного обміну інформації між функціональними вузлами процесора і, тим самим, суттєво підвищується швидкість опрацювання інформації. Як приклад на рис. 4.3 показано можливий варіант двошинної структури процесора.
Розглянемо виконання на цій структурі процесора операції РгЗ : = РгО + Ргі:
1. Pr0out, Prlout, Add, PrZin (подання на шину А числа з регістра Рг1 та на шину В числа з регістра Рг0, виконання в АЛП операції додавання та запис результату до регістра PrZ).
2. PrZout, Рг3іп (запис числа з регістра PrZ до регістра РгЗ через міст М зв’язку хміж шинами).
Як видно, для виконання операції додавання тут потрібно лише два такти, тоді як в одношинній структурі процесора було потрібно три такти.
Зрозуміло, що із збільшенням кількості шин швидкість обміну зростає. Так, в тришин- ній структурі процесора операція додавання двох чисел буде виконана за один такт.
Збільшення кількості шин ускладнює структуру процесора та збільшує кількість необхідного обладнання на його побудову. Адже кожна додаткова шина - це велика кількість додаткових провідників, які займають багато місця на кристалі. Однак потреба підвищення продуктивності змушує розробників застосовувати саме багатошинну структуру процесора. Більшість процесорів сучасних високопродуктивних комп’ютерів є багатошинними.
4.1.4. Приклади виконання операцій в процесорі
4.1.4.1. Виконання операції додавання двох чисел
Об’єднаємо послідовність елементарних операцій, необхідних для виконання однієї команди. Розглянемо команду “Додати вміст деякої комірки основної пам’яті до вмісту регістра Рг1 із записом результату до цього ж регістра, причому адреса комірки основної пам’яті задана в адресному полі команди”.
Виконання цієї команди вимагає наступних дій:
1. Вибірки команди з основної пам’яті та її запис до регістра команди РгК.
2. Вибірки першого операнда з основної пам’яті та його запис до одного з регістрів надоперативної пам’яті процесора.
3. Виконання додавання.
4. Засилання результату в регістр Рг1.
Програма виконання цих дій на одношинній структурі процесора (рис. 4.1) буде мати наступний вигляд:
Фаза вибірки:
1. ПЛout, РгАіn, зчитування, очищення регістра PrY, включення переносу та операції додавання в АЛП, PrZin (адреса команди з програмного лічильника ПЛ подана на шину та записалась до регістра адреси РгА, на вхід керування режимом роботи основної пам’яті подано сигнал Read, на вхід скиду регістра PrY подано сигнал Reset, в АЛП виконалась операція додавання 1 до вмісту програмного лічильника ПЛ та її результат записався в регістр PrZ).
2. PrZout, ПЛіn, чекання підтвердження сигналу зчитування (результат додавання з регістра PrZ записався в програмний лічильник ПЛ, команда з основної пам’яті записалась в регістр РгД).
3. PrДout, РгКіп (команда з регістра даних РгД записалась до регістра команди РгК).
Фаза виконання:
4. (Поле адреси PrK)out, PrAin, зчитування (адреса з поля адреси регістра команди РгК переписується до регістра адреси РгА, на вхід керування режимом роботи основної пам’яті подано сигнал Read).
5. Prlout, РгУіn, чекання підтвердження сигналу зчитування (число з регістра Рг1 записалось до регістра PrY, а число з основної пам’яті записалось до регістра РгД).
6. Prflout, Add, PrZin (число з регістра РгД поступило на шину та додалося в АЛП до числа з регістра PrY, а результат записався в регістр PrZ).
7. PrZout, Prlin, End (число з регістра PrZ переписалось в регістр Ргі, кінець виконання операції).
Тут Add - код операції додавання, який поступає на вхід АЛП та вказує йому тип виконуваної операції.
4.1.4.2. Виконання операції переходу
Адреса переходу зазвичай одержується шляхом додавання значення X, яке знаходиться в адресному полі команди, до біжучого значення ПЛ.
Програма має наступний вигляд при виконанні безумовного переходу:
1. ПЛоut, РгАіn, зчитування, очищення регістра У, включення переносу та операції додавання в АЛП, PrZin (адреса команди з програмного лічильника ПЛ подана на шину та записалась до регістра адреси РгА, на вхід керування режимом роботи основної пам’яті подано сигнал Read, на вхід скиду регістра PrY подано сигнал Reset, в АЛП виконалась операція додавання 1 до вмісту програмного лічильника ПЛ та її результат записався в регістр PrZ).
2. PrZout, ПЛіn, чекання підтвердження сигналу зчитування (результат додавання з регістра PrZ записався в програмний лічильник ПЛ).
3. РгДоut, РгКіn (команда з регістра даних РгД записалась до регістра команди РгК).
4. ПЛоиІ, РгУіп (число з програмного лічильника ПЛ записалось до регістра PrY).
5. (Поле адреси PrK)out, ADD, PrZin (число з поля адреси регістра команди РгК поступило на шину та додалося в АЛП до числа з регістра PrY, а результат записався в регістр PrZ).
6. PrZout, ПЛіп, End (число з регістра PrZ переписалось в програмний лічильник ПЛ, кінець виконання операції).
При виконанні умовного переходу по значенню ПЛ = 0 крок 4 заміниться на наступний:
7. roiout, РгУіп, if ПЛ=0 then End (запис вмісту програмного лічильника до регістра PrY і його аналіз на рівність 0. Якщо це так - кінець виконання операції).
4.1.5. Особливості побудови процесора комп’ютера із складною системою команд
Вище розглядалася структура та організація роботи процесора комп’ютера, який із середини вісімдесятих років минулого століття був віднесений до комп’ютерів з складною системою команд КССК (CISC). Аналізуючи його роботу і розглянуті в розділі 2 формат команди та склад системи команд названого комп’ютера, можна прийти до висновку, що для процесора комп’ютера із складною системою команд характерні наступні особливості:
1. виконання команди за багато тактів, оскільки для цього потрібно здійснити багаторазові операції звернення до основної пам’яті та до програмно-доступних регістрів процесора;
2. орієнтація АЛЛ на виконання великої кількості операцій, що пов’язано з розширеним складом системи команд;
3. складна система розпізнавання команди, що пов’язано з великою кількістю методів адресації та великою кількістю форматів команд різної розрядності;
4. програмне дешифрування команд з метою зменшення затрат обладнання;
5. складна організація конвеєризації виконання команд, що пов’язано, в першу чергу, з різнотипністю їх виконання;
6. орієнтація структури на виконання команд типу регістр-пам’ять та пам’ять-пам’ять.
Вказані особливості стримують побудову високопродуктивних комп’ютерів на основі процесора розглянутого типу. Вони були враховані при створенні процесорів комп’ютерів із простою системою команд.
Процесор комп'ютера з простою системою команд
4.1.2. Вимоги до процесора комп’ютера з простою системою команд
При розгляді системи команд комп’ютера ми ознайомилися з архітектурою комп’ютерів із простою системою команд КПСК (RISС). Виходячи з основних принципів реалізації цих комп’ютерів, можна виділити наступні вимоги, яких необхідно притримуватися при побудові їх процесора:
1. Довільна комп’ютерна команда, незалежно від її типу, має виконуватися за один такт (чи однотактовий цикл).
2. Пристрій керування та арифметико-логічний пристрій процесора мають орієнтуватися на виконання мінімальної кількості спрощених команд, що статистично переважають у програмах, причому в системі команд відносно небагато операцій та режимів адресації операндів (способів адресації).
3. Команди обробки даних мають реалізуватися лише у формі “регістр-регістр”. Обміни з основною пам’яттю виконуються лише за допомогою команд завантаження/запису (архітектура load/store).
4. Дешифрування команд із спрощеними форматами має виконуватися лише апаратно, аби збільшити швидкодію.
5. Необхідно забезпечити високий рівень конвеєризації виконання команд.
6. Регістрова пам’ять має включати велику кількість програмно-доступних регістрів.
При цьому необхідно проводити оптимізацію структури процесора, що проектується, з метою забезпечення найшвидшого виконання обраних команд та передбачити можливість додавання до отриманого списку інших команд, якщо вони не ускладнюють процесора.
4.1.3. Базові принципи побудови процесора комп’ютера з простою системою команд
Для ілюстрації базових принципів побудови процесора комп’ютера з простою системою команд ми використаємо архітектуру комп’ютера, яка була запропонована для навчальних цілей Джоном Хеннессі та Дейвідом Паттерсоном і отримала назву DLХ. Ця архітектура узагальнює особливості архітектур наступних сучасних комп’ютерів: AMD 29000, DEC3100, НР850, ІВМ801, Inteli860, MIPS М/120А, MIPS M/1000, M88000, RISC1, SGI 4D/60, SPARCstation-1, SUN-4/110, SUN-4/260.
Регістровий файл процесора комп’ютера DLX вміщує 32 регістри загального призначення (R0...R31) для зберігання цілих чисел, 32 регістри (F0...31) для зберігання даних з рухомою комою. Набір команд цього комп’ютера включає типові арифметичні й логічні операції, операції з фіксованою та рухомою комою, операції пересилання даних, операції керування потоком команд і системні операції. У арифметичних командах використовується триадресний формат, типовий для комп’ютерів з архітектурою КПСК, а для звернення до пам’яті використовуються операції завантаження і запису вмісту регістрів у пам’ять.
Основою проектування структури процесора комп’ютера з простою системою команд є часова діаграма виконання команд з найбільшою складністю, до числа яких належить, зокрема, команда завантаження слова. Розглянемо цикл виконання команди вибірки з основної пам’яті (завантаження) слова LW R5, 16(R26). В комп’ютері DLX командний цикл поділений на п’ять фаз. Тому для виконання вказаної команди потрібно виконати наступні фази:
1. вибрати зазначену команду з основної пам’яті (перша фаза виконання команди із назвою IF (Instruction Fetch);
2. декодувати команду та вибрати операнди (друга фаза виконання команди із назвою ID (Instruction Detecting));
3. виконати команду, тобто обрахувати виконавчу адресу операнда 16 + [R26] (третя фаза виконання команди із назвою EX (Execution);
4. вибрати операнд із основної пам’яті (четверта фаза виконання команди із назвою МЕМ (Memory);
5. переслати вибраний з основної пам’яті операнд до регістра R5 регістрового файла (п’ята фаза виконання команди із назвою WB (Write Back).
Використані назви фаз дещо узагальнюють притаманну лише команді LW семантику кожної окремої фази. Це коректно, бо нашою метою є наближення до такої послідовності фаз, яка задовольняє вимогам будь-якої команди із заданої до реалізації множини з метою досягнення найбільшої швидкодії. Інші команди не завжди вимагають реалізації усього переліченого набору фаз, тому що мають меншу часову складність.
На рис. 4.4 наведена часова діаграма виконання п’ятифазової команди завантаження LW. Залежно від структури процесора ця команда може бути виконаною за різний час, який буде складатися з суми проміжків часу, необхідних для виконання кожної фази. Розглянемо підхід до побудови процесора з тим, щоб задовольнити вимогу, згідно з якою довільна комп’ютерна команда, незалежно від її типу, має виконуватися за один такт (чи однотактовий цикл), яка ставиться до процесорів комп’ютера з простою системою команд.
Рис. 4.4. Часова діаграма виконання п’ятифазової команди завантаження LW
Представимо алгоритм виконання команди у вигляді потокового графа, кожна з вершин якого позначає оператор відповідної фази виконання команди (рис. 4.5а).
Рис. 4.5 а - отоковий граф виконання команди; б- структура процесора, орієнтованого на його реалізацію
Для того, щоб команда виконувалася за один такт, потрібно апаратно відобразити алгоритм її виконання, тобто поставити у відповідність кожному оператору алгоритму функціональні вузли процесора, які їх виконують, та з’єднати їх між собою згідно із зв’язками вершин потокового графа алгоритму. Тоді структура процесора комп’ютера з простою системою команд, який виконує названі фази, може бути подана наступним рисунком (рис. 4.5б). Як бачимо, процесор містить п’ять послідовно з’єднаних блоків: вибірки команди з основної пам’яті, декодування операндів та вибірки команди з регістрової пам’яті, операційний, вибірки та запису даних до основної пам’яті, запису даних до регістрової пам’яті. Кожен з цих блоків виконує відповідну фазу командного циклу та передає результати до наступного блоку. Результатом послідовної роботи цих блоків є виконання команди
Деталізована структура процесора комп’ютера DLХ, яка побудована на основі описаного вище підходу, представлена на рис. 4.6.
Рис. 4.6. Структура процесора комп’ютера з npocmoю системою команд
На цій схемі лініями відділені блоки процесора, показані на рис. 4.5б, які виконують відповідну фазу командного циклу потокового графа алгоритму виконання команди. Перший оператор IF виконується на наступних елементах: програмному лічильнику PC (Program Counter), суматорі Adder та двох регістрах NPC і IR. Вміст програмного лічильника PC визначає адресу команди в основній пам’яті. Комбінаційний суматор Adder обраховує адресу наступної за чергою виконання команди. При цьому враховано, що впорядкована послідовність команд (програма) складається з чотирибайтових команд (усі команди мають формати довжиною 32 біти), які розміщено в основній пам’яті за послідовними адресами 0,4, 8, С і т. д. Через це константа зсуву адреси (пересування покажчика на наступну за чергою команду) дорівнює +4. Визначене за допомогою суматора значення адреси вибирання наступної команди зберігається у регістрі NPC (next PC). Зчитаний з основної пам’яті код поточної команди записується до регістра команди IR.
Поля щойно вибраної команди містять адреси програмно-доступних регістрів регістрової файла процесора. Вміст зазначених полів формату команди в рамках оператора ID надсилається на адресні входи регістрової пам’яті Regs, а відповідні надісланим адресам коди операндів завантажуються до внутрішніх, програмно-недосяжних, тобто службових, регістрів А і В.
Існує ще один тип операнда з назвою “безпосередній” (Imm). Його задають прямо у форматі команди. Як правило, довжина безпосереднього операнда не перевищує половини довжини формату команди. В комп’ютері DLX безпосередній операнд має довжину 32/2 = 16 бітів. У той самий час бажано зафіксувати довжину формату даних такою, що дорівнює довжині формату команди, адже різноманіть довжин форматів суттєво пригальмовує комп’ютер. Якщо усі формати даних, як і формати команд, матимуть довжину 32 біти, тоді безпосередньому операнду не вистачатиме ще 16 бітів, аби бути стандартним за довжиною. Тому тут використаний комбінаційний вузол Sign Extend, який виконує знакове розширення 16-бітового безпосереднього операнда до 32-х бітів. Результат знакового розширення тимчасово зберігають у службовому регістрі Imm.
В цілому можна нарахувати чотири можливі операнди на вході арифметико логічного пристрою ALU процесора: з регістрів А, В, Imm та вміст регістра адреси наступної для виконання команди NPC, над якими виконується функціональний оператор ЕХ. Наперед зазначимо, що операнд-адреса NPC опрацьовується в ALU при виконанні команд умовного переходу, коли на додаток до наступної потрібна ще одна адреса, що утворена додаванням до вмісту NPC деякої константи переходу. Вибирання двох операндів на вхід ALU із чотирьох можливих виконується за допомогою мультиплексорів операндів mux, розташованих на його входах.
Результат операції з ALU тимчасово запам’ятовується у проміжному службовому регістрі ALUout. Якщо результатом операції є число, тоді воно заноситься до комірки регістрового файла. Якщо результатом операції є адреса, тоді ця адреса надсилається до (верхнього на рисунку) мультиплексора вибору адреси mux. За допомогою зазначеного мультиплексора вибирають адресу переходу (чергова чи перехід), яка і надсилається до програмного лічильника PC, аби коректно продовжити виконання програми.
Керування мультиплексором вибору адреси наступної команди покладено на вузол Zero?, де вміст службового регістра А порівнюється із нулем (дорівнює нулю, більше нуля, менше нуля і т. д., залежно від виду виконуваної у поточний час операції умовного переходу). Результат порівняння є бінарним логічним значенням (так або ні). Саме цей бінарний результат керує роботою мультиплексора вибирання адреси наступної команди.
При виконанні фази МЕМ результат-адреса з виходу ALU надсилається до основної пам’яті як отримана адреса комірки цієї пам’яті (для команд збереження/завантаження)
Результатом на виході правого на рисунку мультиплексора може бути або вміст основної пам’яті (при виконанні команди завантаження LW слова з основної пам’яті до регістра регістрового файла), або результат виконання арифметичної, зсувної, логічної чи іншої операції в ALU (наприклад, при виконанні команд ADD, SUB і т. д.). Такий результат в рамках виконання фази WB засобами мікропрограмування зберігають в регістрі регістрового файла. Отже, зазначений мультиплексор, керований регістром поточної команди, комутує на вхід регістрового файла потрібну інформацію
Таким чином, апаратно відобразивши потоковий граф алгоритму виконання команди, вдалося забезпечити вимогу, щоб вона виконувалася за один такт. Як видно з вище приведеного опису роботи процесора, для спрощення пояснення тут були використані проміжні регістри для запису операндів, які можуть бути видалені. Порівняно з процесором комп’ютера із складною системою команд виконання команди в приведеній структурі процесора суттєво спростилося. Далі розглянемо це детальніше, але спочатку проведемо аналіз взаємодії процесора з основною пам’яттю.
4.2.3. Взаємодія процесора з пам’яттю в комп’ютері з простою системою команд
Відомий так званий парадокс пам’яті - пам’ять може мати малий об’єм, проте бути швидкою і задовольняти вимоги процесора щодо швидкодії, або мати відносно великий об’єм і бути повільною. Немає пам’яті відносно великої і, водночас, швидкої. Ставити зараз питання про основну пам’ять, об’єм якої задовольняє системного програміста (системні програми) є, безперечно, нереальним завданням. Об’єму основної пам’яті завжди не вистачає і, можливо, не вистачатиме.
Аби подолати зазначену невідповідність, вибудовують багаторівневу ієрархічну систему пам’яті комп’ютера, де на верхньому рівні ієрархії знаходяться програмно-доступні регістри регістрового файла процесора, на другому - кеш, потім комірки основної пам’яті, потім система зовнішньої пам’яті (диск, магнітні стрічки, архівна пам’ять з лазерною технологією і т. д.). За рівнями ієрархії, згори донизу, об’єм пристроїв пам’яті зростає, а швидкодія зменшується. Керує інформаційними обмінами між рівнями операційна система. Коли багаторівневість та ієрархію пам’яті приховано від прикладного програміста, тоді кажуть про реалізацію віртуальної пам’яті, де, ніби, скасовано зазначений вище парадокс пам’яті. В цьому випадку прикладному програмісту здається, що він використовує єдину відносно велику і швидку пам’ять.
Важливим є той факт, що звернення процесора до пам’яті завжди локалізовано в невеликому діапазоні змін її адрес. Саме він і дозволяє застосовувати ієрархічну систему пам’яті, аби розв’язати невідповідність швидкодій процесора і системи пам’яті з одним рівнем ієрархії. Між процесором і основною пам’яттю розташована кеш пам’ять (рис. 4.7) - це швидка буферна пам’ять невеликого об’єму. Кеш пам’ять працює на близькій тактовій частоті до процесора і не пригальмовує його роботу Кеш (cache у перекладі з англійської - тайник) лишається прозорою для програміста, тому що система команд процесора, як правило, не містить команд роботи з кеш пам’яттю.
Рис. 4.7. Кеш пам’ять у складі ядра комп’ютера
При поясненні роботи кеш пам’яті можна допустити, що процесор також не «бачить» кеш і генерує адреси пам’яті так, ніби кеш пам’яті не має. Проте кеш пам’ять, як правило, існує, і на апаратному рівні перехоплює сигнали процесора читання/запису, а коли треба, то надає процесору швидкі копії інформаційних кодів, які тимчасово зберігає у власній робочій пам’яті. Якщо кеш пам’ять спроможна підмінити собою основну пам’ять (у понад 96-98 відсотків випадків), тоді вона за рахунок власних ресурсів задовольняє запит процесора. Процесор не пригальмовується і продовжує працювати на повній швидкості. Коли «підміна» основної пам’яті неможлива (менше від двох-чотирьох відсотків випадків), тоді кеш пам’ять залучає до роботи основну пам’ять, обмін з якою суттєво пригальмовує процесор.
Усі завдання, пов’язані із перехопленням запитів від процесора до основної пам’яті, вирішує контролер кеш пам’яті, який є її складовою частиною. Другою частиною кеш пам’яті є невелика робоча пам’ять, де зберігають вміст копій комірок основної пам’яті, що брали участь в обслуговуванні останніх, тобто найбільш «свіжих» запитів процесора. Важливо, що вміст комірок основної пам’яті копіюється до кеш пам’яті разом із своїми адресами. Саме ці копійовані адреси і дозволяють контролеру кеш пам’яті приймати рішення про спроможність задовольнити конкретний процесорний запит без залучення до обміну повільної основної пам’яті.
Спрощений варіант структури комп’ютера, в якому використовується кеш пам’ять, подано на рис. 4.8. Пристрій керування надсилає керуючі сигнали до процесора та основної пам’яті. З процесора сигнали станів, якими можуть бути біти регістра команди і інше, надходять до пристрою керування, аби реалізувати розгалуження мікропрограми.
Для зберігання даних і команд використано розділені кеш пам’яті даних і команд Гарвардської архітектури. В свою чергу, кеш пам’яті зв’язані з єдиною пам’яттю Принстонської архітектури. Ясно, що обмін в підсистемі “основна пам’ять - кеш пам’ять даних» є двостороннім, а в підсистемі «основна пам’ять - кеш пам’ять команд” - одностороннім.
Рис. 4.8. Спрощена структура комп’ютера DLХ
Можна побачити, що наведена структура ефективно поєднала риси Принстонської та Гарвардської архітектур.
Надалі при розгляді принципів виконання команд в процесорі будемо розглядати і його взаємодію з основною пам’яттю через кеш пам’ять команд та даних.
4.2.4. Виконання команд в процесорі комп’ютера з простою системою команд