Чому ми не маємо більше регістрів у мікропроцесорах?


18

Реєстри теоретично не потрібні; всі мікропроцесори все ще працюватимуть без регістрів. Але це, здавалося б, тривіальне доповнення допомогло зробити мікропроцесори більш ефективними.

Чому ми не можемо мати більше реєстрів для подальшого отримання користі від них? Вони просто пам'ять на мікросхемі, і можна собі уявити не дуже складно додати? Який чинник вплинув на кількість реєстрів, щоб вони були такими, якими вони є зараз, а не, скажімо, у 10 разів більше?


8
@ Alper91 Багато архітектурних, гіпотетичних та реальних архівів не мають регістрів, і це зовсім не потрібно. Це просто корисна оптимізація.
труба

4
Хм. Ніхто не згадав про Спарка. Найбільша реалізація могла б мати у ній 520 регістрів (32 вікна раз 16 регістрів, + 8 глобальних.) Я їх точно пам’ятаю.
джонк

13
Я думаю, що кількість бітів в інструкції, яку вам потрібно вказати в регістрі, є великою проблемою. Якщо у вас є 1024 регістрами, то вам потрібно принаймні 30 біт для кожної арифметичної команди - якщо не додати інші обмеження , як «все 3 регістри повинні бути з однієї і тієї ж групи 32 (в цьому випадку вам потрібно 20 біт).
user253751

8
@pipe - насправді практично будь-який практичний дизайн вимагає "реєстрів" в схематичному сенсі, так як навіть якщо ви будуєте машину стека чи щось подібне, вам потрібно мати місце для аргументів до ALU, а то і інших результатів. - у більшості пам'яті немає трьох портів доступу. І машині стека потрібен покажчик стека, який є ... реєстром! І не будемо згадувати трубопровідні регістри. Ви можете приховати використання таких "регістрів" від програміста, але вам все одно потрібні деякі, і, ймовірно, майже стільки, скільки має примітивна машина реєстру.
Кріс Страттон

4
@ChrisStratton Звичайно, але поки вони не піддаються впливу ISA, це просто деталізація щодо впровадження. Хоча дещо безглуздий аргумент, оскільки ми не знаємо, що означає ОП під реєстрацією .
труба

Відповіді:


33

Є кілька факторів:

  • високоефективні мікро-архітектури використовують перейменування реєстру. Тобто кількість фізичних регістрів перевищує кількість архітектурно видимих ​​регістрів, і вони здатні відстежувати незалежне їх використання.

  • подвоєння кількості реєстрів не подвоює ефективність. ISTR (від комп’ютерної архітектури, кількісний підхід ), що перехід від 16 до 32 реєстрів приносить щось на зразок 10% покращення, припускаючи, що збільшення не має негативного ефекту (що є дуже оптимістичним припущенням).

  • архітектурно видимі регістри мають витрати. Наприклад:

    • Збільшення їх кількості збільшує кількість бітів, взятих у форматі інструкцій, щоб вказати, на який регістр діє діяти (подвоєння кількості реєстру означає мати ще один біт на регістр у форматі, тим самим запобігаючи використанню цих бітів для інших звичаїв або форсування більший розмір інструкції).
    • Збільшення кількості архітектурних регістрів збільшує вартість перемикання контексту (оскільки вони повинні бути збережені та відновлені на контекстному перемиканні).

1
Я б загрожував, що поліпшення продуктивності від 16 до 32 регістрів повністю залежить від потенціалу оптимізації відповідного компілятора. У ассемблері доступ до подвоєної кількості реєстрів (в архітектурі x64) може значно покращити продуктивність - але лише для нішевих ролей, і лише за умови, що вони фактично використовуються.
rdtsc

6
@rdtsc: перехід від 8 до 16 архітектурних реєстрів значно покращує кількість розсипань / перезавантажень для типового коду, згідно з даними симуляцій у роботі, пов'язаному з цією відповіддю . Це впливає на розмір коду, кількість інструкцій та наскільки важливим є переадресація магазину з низькою затримкою. 16-> 32 набагато менший ефект. AFAICT, 16 архітектурних регістрів - хороший вибір обладнання для перейменування реєстру для усунення небезпек для WAR та WAW.
Пітер Кордес

2
Однак, AVX512 від Intel додає ще 16 векторних регістрів, загалом 32. (а також подвоєння їх ширини до 64 байт, повна лінія кешу). Приховування затримки від високої пропускної здатності FP-операцій може зайняти багато регістрів. наприклад, Intel Haswell має 5c lat, один на 0,5c пропускної здатності FMA, тому вам потрібно 10 векторних акумуляторів для насичення одиниць виконання FMA для зменшення (наприклад, крапкового продукту або підсумовування масиву, де FMA є частиною залежності, що переноситься циклом ). x86-64 має лише 16 векторних регістрів. Але пам’ятайте, integer ops, esp. на GP-регістрах рідко мають більше 1с затримки.
Пітер Кордес

1
Компроміс відрізняється для цілих, FP та векторних регістрів. Наприклад, ліниве збереження / відновлення цілочисельних регістрів не має сенсу, робити це для векторного набагато краще. І векторні ISA часто мають більше регістрів, ніж ціле число (AltiVec має принаймні до 128, ISTR прочитав про 256 для Sparc, але зараз не може знайти посилання).
AProgrammer

1
en.wikipedia.org/wiki/AltiVec має тридцять два 128b векторні регістри. Мені було цікаво про SPARC і роздивився, як працюють його вікна реєстру для контекстних комутаторів. Він має 32 регістри, які можна побачити одразу, але використовує розсувне вікно на більший файл реєстру. Це звучить з цієї спрощеної версії, як ОС повинна знати розмір усього файлу реєстру розсувних вікон, щоб зберегти / відновити його, оскільки, хоча інструкції про слайд вікон надають пам'ять для збереження / відновлення регістрів, якщо це потрібно, це робиться шляхом відключення в ОС.
Пітер Кордес

16

Незважаючи на те, що регістри та оперативна пам’ять є обома пам'яттю, вони доступні різними способами, щоб відобразити вартість (в області мікросхем або прихованих тактових циклів) доступу до них.

Реєстри тісно пов'язані з АЛУ і можуть виконувати багато ролей джерел даних, раковин, модифікаторів тощо. Тому вони потребують безлічі широких мультиплексованих з'єднань. У деяких архітектурах ми можемо записати R1 <= R2 + R3, і саме це відбувається за один тактовий цикл. Кожен реєстр безпосередньо адресований у коді op, ця адресація є дуже обмеженим ресурсом.

Оскільки реєстри є дорогими для впровадження, кількість в більшості архітектур зазвичай обмежується порядком 10/20.

Оперативна пам’ять слабко пов'язана з процесором, зазвичай каналізується через єдине спільне з'єднання. Це робить набагато дешевшим реалізацію великої кількості оперативної пам’яті. Адреси оперативної пам’яті, як правило, походять із збереженої в регістрі адреси, тому не споживайте значної ширини інструкцій.

SPARC - цікава архітектура, що містить 72 - 640 64-бітових регістрів, з 32-регістровим контекстом, який можна зміщувати за допомогою перекриттів для швидких викликів підпрограми з проходженням параметра. Ви, як правило, не знаходите їх на ПК та серверах, де важлива вартість, як, наприклад, у 99,999% додатків.


4
Ще один аспект - вам потрібно зберегти / відновити регістри під час переключення контексту. Більше реєстрів, більше часу.
Мішель Білло

Зазначу, що старий TMS9900 зберігав усі свої робочі регістри у зовнішній пам'яті en.wikipedia.org/wiki/Texas_Instruments_TMS9900
Пітер Сміт

1
Я кваліфікувався «незмінно» (за винятком декількох твік), але вийняв це для спрощення. Можливо, я просто зміню його на «загалом». В основному, якщо ви можете знайти та зрозуміти винятки, мені не потрібно, щоб я їх вказував. Якщо ти достатньо ніав, щоб його ввести в оману, то це не має значення, тому що це не призведе до неприємностей. TMS9900, це було дурно, я мав 99/4 за свої гріхи в попередньому житті, дивний звір!
Neil_UK

Itanium також має вікна реєстрації.
Саймон Ріхтер

1
@ChrisStratton: Хоча існує певний прецедент, що "ви не можете використовувати регістри X і Y", які вважаються частиною "ABI" (наприклад, регістри k0 і k1 на милях), це незвичне використання. Зрозуміло, є небажані / небезпечні приховані канали обміну повідомленнями між процесами, якщо збереження / відновлення цих "заборонених ABI регістрів" не виконується при контекстному перемиканні. Тобто, процеси, які не мають можливості спілкуватися, можуть це зробити, зберігаючи інформацію в заборонених регістрах і чекаючи переключення контексту.
R ..

12

Регістри повинні звертатися в межах інструкції. Якщо регістрів багато, інструкція довша. Збереження та відновлення вмісту реєстру для послуги переривання потребує більше часу, якщо регістрів багато.


5

Як більшість речей, кількість реєстрів - це компроміс між вартістю, складністю та корисністю.

Реєстри реалізовані як багатопортові статичні оперативні пам’яті, що робить їх більш дорогими (область чіпа), ніж інші варіанти зберігання.

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

Далі - скільки реєстрів вам справді потрібно? Існує межа їх корисності. Подумайте, що ви пишете алгоритм, який виконує якусь математичну операцію на 1024 байти, скажімо, помножимо на 5. Із поточним підрахунком реєстру ви отримуєте щось подібне:

load operand1=5
load address
loop: load operand2=byte1@address
multiply Register1 with Register2
store result
increment address
if address = end goto endLoop
jump loop
endLoop:

Тепер, якщо у вас буде 1024 регістри і всі збережені там дані, ваша програма виглядатиме так:

multiply Register1 with Register2
multiply Register1 with Register3
multiply Register1 with Register4
multiply Register1 with Register5
multiply Register1 with Register6
...

Оскільки кожен з них - це інша інструкція, кожен з них повинен бути виписаний. Отже, потрібна пам'ять програми вибухає. Усвідомивши це, ви, можливо, захочете ввести деякі інструкції, наприклад multiply register1 with register(2 to 256),. Але коли ви зупинитесь, надаєте інструкцію для всіх комбінацій?

Тож, можливо, цифри, які ми маємо в наявності, - це гарний компроміс між вартістю, складністю та корисністю.


1
Я думаю, що програма multiply Register1 with Register2 multiply Register1 with Register3дуже нереальна, оскільки дані повинні надходити прямо чи опосередковано за межами комп’ютера, тому регістри потрібно завантажувати, а результати потрібно використовувати десь, прямо чи опосередковано, тому регістри потрібно зберігати. Насправді пристойний оптимізуючий компілятор для мови високого рівня «розкрутить» цикл першої програми для створення чогось типу другої програми, оптимізуючи використання реєстру, затримку пам’яті, можливо, зайнятість кешу та швидкість виконання.
gbulmer

1
Немає необхідності в багатьох multiply register1 with register(2 to 256)інструкціях спеціального призначення . Трубопровід значно покращує пропускну здатність процесора, особливо для більш простого декодування та виконання інструкцій. Таким чином, ефекту від складних, масивних інструкцій щодо різноманітності можна досягти, використовуючи кілька простіших інструкцій з більш високою швидкістю виконання. Наявність більшої кількості регістрів допомагає, дозволяючи компілятору генерувати безліч незалежних інструкцій (тих, які не поділяють регістр), які можна виконати самостійно, покращуючи пропускну здатність. Ваш приклад = більше реєстрів краще.
gbulmer

4

Реєстри дуже дорогі. Дуже дорого. Це не стільки самі регістри, це всі зв'язки від і до регістрів. Скажіть, у вас є інструкція reg1 = reg2 + reg3. Для цього швидко , вам потрібно прочитати дані з двох регістрів в одному циклі і записати в інший регістр у другому циклі. Тепер, якщо у вас є процесор, який може виконувати кілька інструкцій за цикл, скажімо, три інструкції, вам потрібно буде мати змогу читати дані з шести регістрів кожного циклу та записувати дані в 3 регістри. Це жахливо, дуже багато дуже швидких зв'язків.

Звичайно, ви можете просто використовувати більше транзисторів. Проблема полягає в тому, що швидкість знижується. Вам потрібно більше обладнання, щоб вибрати більше регістрів. Простір для файлу реєстру збільшується. Все це робить все повільніше. Так що з тією ж технологією, можливо, ви зможете мати 16 регістрів і працювати на 2600 МГц, або мати 32 регістри та працювати на 2400 МГц. Тепер додаткові регістри повинні компенсувати значне зниження тактової частоти.


2

Який чинник вплинув на кількість реєстрів

- Ієрархія пам'яті

Регістри, кеш-пам'ять, оперативна пам’ять реалізовані за допомогою різних технологій зберігання даних.

Різні технології відрізняються між собою

  1. Часи доступу
  2. Вартість
  3. Щільність

Приклад: Внутрішні регістри, знайдені в процесорі, - це статична пам'ять з випадковим доступом , а основна пам'ять комп'ютера - динамічна пам'ять випадкового доступу

Статична двійкова комірка ОЗП реалізована за допомогою 6-транзисторної ланцюга, тоді як двійкова комірка динамічної оперативної пам'яті реалізована за допомогою конденсатора та транзистора. Порівнюючи SRAM та DRAM

  • Пам'ять SRAM набагато швидша, ніж пам'ять DRAM [Трохи циклів доступу до SRAM порівняно з DRAM]
  • Схема SRAM споживає менше енергії, ніж DRAM
  • DRAM потребує періодичного оновлення кожного біта в пам'яті, на відміну від SRAM
  • SRAM коштує дорожче, ніж DRAM
  • SRAM має меншу щільність порівняно з DRAM

Таким чином, це не практична річ, щоб збільшити кількість швидкої, дорогої, менш щільної пам'яті. Насправді ми можемо використовувати декілька з них, і добре написана програма буде зберігати найчастіше використовувані дані всередині цих швидких регістрів, тоді як менш часто використовувані дані зберігаються у повільній пам'яті.

- довжина інструкції

Адреса регістрів включена в інструкцію, яка обмежує кількість доступних регістрів на основі чисел бітів, які можуть представляти адресу. Наприклад, в архітектурі MIPS 32-розрядна інструкція довжини містить лише 5 біт для представлення адреси доступних регістрів, що обмежує кількість регістрів до 2 5 = 32 регістру. Збільшення кількості регістрів потребує збільшення довжини інструкцій, щоб включити достатню кількість бітів, які могли б отримати доступ до всіх регістрів.


2

Якщо ви ознайомилися з набором інструкцій процесора, існує кілька способів їх групування. Наприклад, всі ADDінструкції можуть бути згруповані разом, і всі XORінструкції.

У межах кожної групи однієї інструкції можуть бути версії, які працюють на пам'яті або на регістрах. Саме ця підгрупа ефективно визначає кількість регістрів, які має процесор.

Як 8-розрядний гіпотетичний приклад, скажімо, що $Axінструкції можуть бути ADDінструкціями, а $Cxможуть бути XORінструкціями. У цій конструкції для визначення операндів залишилося лише чотири біти!

  • Один може мати лише чотири регістри загального призначення та використовувати два біти для визначення одного, а два біти - для визначення іншого.
  • Або можна використати перший біт для розрізнення "спеціальних" варіантів, а інші 3 біти, щоб визначити, який з восьми регістрів працювати з акумулятором ( $x0може бути самим акумулятором).
  • Або може бути більше, ніж ця кількість реєстрів - але тоді обмежте, які регістри доступні, якими вказівками.

Звичайно, ми минули 8-бітові набори інструкцій. Але все-таки ця логіка допомогла визначити набори реєстрів у минулому - вона буде продовжувати це робити і в майбутньому.

EDIT (за запитом)

Скажімо , у верхній чотири біта для команди: ADD, SUB, XOR, MOV, і CMPт.д. Є 16 можливостей тут. Тоді, для тих інструкцій, де зареєструватися має сенс (наприклад ADD Rx,Ry), потрібно вказати Rxі Ry. Скажіть, що наступні два біти призначені для x, а останні два - для y. Таким чином:

ADD R1, R2  =>  'ADD' + 'R1' + 'R2' => $A0 + $04 + $02

Маючи лише два біти для визначення такого регістра, у вас є лише місце для загальної кількості чотирьох регістрів!

У бік відзначимо, що деякі комбінації регістрів не мають сенсу. Наприклад, MOV Rx, Rx(нічого не робить) і SUB Rx, Rx(завжди виробляє 0). Вони можуть стати вказівками щодо особливих випадків:

  1. SUB Rx, Rxміг стати NOT Rx- однооперандна інструкція.
  2. MOV Rx, Rxможе стати MOVінструкцією, яка приймає другий байт як безпосереднє значення, інтерпретується як MOV Rx, #$yy.

Таким чином, ви можете "грати" з картою інструкцій, заповнюючи отвори для інакше непотрібних чи -нечутливих інструкцій, щоб забезпечити більший набір інструкцій для програміста. Але в кінцевому підсумку, набір інструкцій визначає набір регістрів.


Я все ще розгублений, чи можете ви пояснити, як лише операндам залишилось 4 біти?
Даршан Чадхарі

Перевірте мою оновлену відповідь
Джон Бергер

1
ІМХО ця відповідь була б значно покращена, перемістивши " гіпотетичний приклад припущеного 8-бітового набору інструкцій " до початку запитання. Я витратив час, намагаючись зрозуміти це, зробив висновок, що має сенс лише 8-бітова інструкція з фіксованою довжиною, а потім читаю далі, щоб виявити, що це так. ІМХО, такий набір інструкцій не має великого значення в контексті питання; весь його адресний простір міг би бути щільно з'єднаний статичною ОЗП. Я також вважаю, що частина, що починає " Деякі комбінації регістрів не мають сенсу ... " не стосується питання, і може бути видалена. Мої $ 0,02
габлмер

-2

Сьогодні Intel використовує тисячі реєстрів - сотні на одне ядро ​​процесора. Але найбільший обсяг даних, що зберігаються на процесорі, знаходиться в кеші, що опосередковано відповідає на питання. Кеш організований у шари, з невеликим швидким кешем L1 та повільнішими кешами L2 та L3 далі. Файл реєстру в певному сенсі L0, навіть швидший, ніж L1, але ще й менший. Отже, ви можете збільшити кількість регістрів, але це, ймовірно, уповільнить їх.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.