CISC
Ця стаття є сирим перекладом з іншої мови. Можливо, вона створена за допомогою машинного перекладу або перекладачем, який недостатньо володіє обома мовами. (квітень 2020) |
CISC (англ. Complex Instruction Set Computer[1][2] — комп'ютер зі складним набором команд) — це архітектура системи команд, в якій більшість команд є комплексними, тобто реалізують певний набір простіших інструкцій процесора або шляхом зіставлення з кожною CISC-командою певної мікропрограми, або принаймні можуть бути зведені до набору таких простих інструкцій. Крім того, ознаками CISC-архітектури можна вважати також наявність великої кількості методів адресації пам'яті з можливістю безпосередньої роботи з операндами в основній пам'яті комп'ютера. Тобто, CISC-архітектури відносяться, як правило, до класу двоадресних.
Архітектури з комплексними наборами команд, розвиток яких припав на кінець 60-х — 70-ті роки пропонували програмісту досить різноманітний набір порівняно високорівневих інструкцій машинної мови, таких, наприклад, як «виклик підпрограми» або «відняти одиницю та перейти, якщо результат ненульовий», а також велику кількість способів звертання до операндів в пам'яті для полегшення роботи зі складними структурами даних. В ті часи, за відсутності повноцінних мов програмування високого рівня та відповідних компіляторів, така апаратна підтримка високорівневого інструментарію програмування могла підвищити продуктивність праці програміста. До того ж програма, складена з таких команд займала небагато в пам'яті комп'ютера.
Типовими прикладами CISC-архітектур були системи VAX, PDP-11, IBM System/360, сімейства мікропроцесорів Motorola 68000 та Intel x86.
Але з появою високорівневих мов та оптимізувальних компіляторів, розвитком електроніки, який спричинив здешевлення комп'ютерної пам'яті виявилось, що використання високорівневих машинних команд суттєво обмежує можливості до оптимізації програми, підвищення її швидкодії.
Зокрема, складні команди потребували багато часу на процедуру декодування, потребували багато апаратурних ресурсів для реалізації, що негативно відбилося на загальній швидкодії та складності системи. Далі, наявність спеціальних команд, таких як «виклик підпрограми» не завжди виправдовувала себе, в багатьох випадках доцільніше було б замість такої загальної команди використати набір елементарніших інструкцій, які в результаті спричиняли б виконання меншої кількості обчислень процесором. Це стосувалось і обчислювальних команд, які підтримували роботу з операндами в повільній пам'яті, що далеко не завжди давало оптимальний результат. Набагато ефективніше було б відокремити процедури роботи з пам'яттю (завантаження та збереження операндів) від проведення обчислень, що дало б можливість оптимізувати процедури звертання до запам'ятовувального пристрою. Зрозуміло, що ці оптимізації повинні були виконуватись вже компіляторами з мов високого рівня, які до того часу досягли досить високого рівня функціональності.
Ці та інші проблеми CISC-архітектур призвели до створення в 80-ті роки RISC-архітектур (від англ. Reduced Instruction Set Computer — комп'ютер зі скороченим набором команд), які вибудовують прямо протилежну модель системи команд з максимальним спрощенням семантики машинної команди, зведенням її до елементарної, мінімізацією методів адресації пам'яті тощо та принциповою орієнтацією на мови високого рівня й оптимізувальні компілятори з них, аніж на програмування безпосередньо в машинних мовах.
Сучасні CISC-архітектури, такі як останні втілення сімейства процесорів x86, хоч і відповідають CISC-концепції на рівні архітектури системи команд, але всередині процесора реалізують якраз пристосованішу до сьогоднішніх реалій RISC-модель, трансформуючи потік CISC-команд в процесі виконання в набори з простіших RISC-мікрооперацій, які й виконуються процесором.
До того, як філософія RISC стала помітною, багато комп'ютерних архітекторів намагалися подолати так званий семантичний розрив, тобто розробити набори інструкцій, які б безпосередньо підтримували конструкції мов програмування високого рівня, такі як виклики процедур, керування циклами, і складні режими адресації, що дозволило б об'єднати структури даних та доступ до масивів в єдині інструкції. Інструкції також зазвичай сильно кодуються для того, щоб додатково підвищити щільність коду. Компактність такої інструкції приводить до менших розмірів програм і меншого (повільнішого) основного доступу до пам'яті, який в ті часи (початок 1960-х років та наступні роки) привів до значної економії на вартості пам'яті комп'ютера і дискових носіїв, а також швидкого виконання. Це також означає, високу продуктивність програмування навіть як на асемблері, так і на мовах високого рівня, таких як Фортран або Алгол, які не завжди були доступні або доречні (мікропроцесори в цій категорії іноді запрограмуються мовою асемблера для певних типів критично важливих програм).
У 1970-х роках, аналіз мов високого рівня показав кілька складних реалізацій на машинній мові, і було встановлено, що нові інструкції можуть поліпшити продуктивність. Були додані деякі інструкції, які ніколи не були призначені для використання мовою асемблера, але добре узгоджувалися з компільованими мовами високого рівня. Компілятори були оновлені, щоб скористатися цими інструкціями. Переваги семантично багатих інструкцій з компактним кодуванням можна побачити в сучасних процесорах, а також, особливо, у високопродуктивному сегменті, де кеш — центральний компонент (на відміну від більшості вбудованих систем). Це відбувається тому, що ця швидка, але складна і дорога, пам'ять за своєю природою обмежені в розмірах, що робить компактний код вигідним. Звичайно, основна причина її необхідності в тому, що основна пам'ять (тобто динамічна оперативна пам'ять сьогодні) залишається повільною в порівнянні з високо продуктивним ядром процесора.
Хоча багато дизайнів досягли більш високої пропускної здатності при нижчій вартості, а також дозволили конструкціям високорівневих мов виражатися меншою кількістю інструкцій, було відзначено, що це не завжди так. Так, наприклад, молодші версії складних архітектур (тобто з меншим використанням апаратних засобів) можуть призвести до ситуації, коли можливо підвищити продуктивність, не використовуючи одну складну інструкцію (наприклад, виклик процедури або введення команди), а послідовність простих.
Однією з причин цього було те, що архітектори (програмісти мікрокоду) іноді створюють «більш продумані» інструкції мовою асемблера, тобто включають можливості, які не можливо ефективно реалізувати на базовому обладнанні. Це можуть, наприклад, бути «побічні ефекти», такі як встановлення регістра або місця знаходження пам'яті, яка, можливо, рідко використовувалась; якщо це було зроблено за допомогою звичайних (не дубльований) внутрішніх шин, або навіть зовнішньої шини, це буде вимагати додаткові цикли кожен раз, і, таким чином, дуже неефективно.
Навіть в збалансованих високопродуктивних рішеннях, сильно закодовані й (відносно) високо рівневі інструкції можуть бути складними для декодування і виконуватися ефективно в рамках обмеженої кількості транзистора. Тому такі архітектури потребують багато роботи з боку дизайнера процесора в тих випадках, коли простіше, але (як правило) повільніше, рішення, на основі декодування таблиць і / або послідовності мікрокоду, не підходить. У той час, коли транзистори та інші компоненти були обмеженим ресурсом, залишилося менше компонентів та менше можливостей для інших видів оптимізації.
Схема, що виконує дії, визначені мікрокодом в багатьох (але не всіх) CISC процесорах, сама по собі — процесор, який багато в чому нагадує за структурою дуже ранні конструкції процесорів. На початку 1970-х років, це породило ідею повернутися до простішого дизайну процесорів для того, щоб впоратися без (великих і дорогих) таблиць-ROM і / або PLA-структур[en] для секвенування і / або декодування. Перший RISC-означений[ким?] процесор (IBM 801[en] — Науково-дослідний центр Watson[en] компанії IBM, в середині 1970-х років) був досить простою схемою, спочатку призначеною для використання в ролі внутрішнього ядра мікрокоду, або обчислювальної одиниці, у CISC рішеннях, та став процесором, який ввів поняття RISC в декілька[що?] більш широкі верстви населення. Простота і правильність також у видимому наборі команд могли б зробити простішим забезпечення конвеєра команд на рівні машинного коду (тобто рівень видимий компіляторами). Проте, конвеєр на цьому рівні вже використовується в деяких високопродуктивних CISC «суперкомп'ютерах» для того, щоб скоротити час циклу команд (незважаючи на ускладнення реалізації в рамках обмеженого числа компонентів). Виконання внутрішнього мікрокоду в CISC процесорах, з іншого боку, могло б бути більш-менш конвеєрним в залежності від конкретної конструкції, і, отже, більш-менш близьке до основної структури процесорів RISC.
У більш сучасному контексті, комплексне кодування змінної довжини, що використовується деякими з типових CISC архітектур робить його складним, але все ж підхожим, щоб побудувати суперскалярну реалізацію моделі програмування CISC безпосередньо; упорядкований суперскалярний оригінальний Pentium[en] і не упорядкований суперскалярний Cyrix 6x86[en] є добрими відомими прикладами цього. Частий доступ до пам'яті для операндів типової CISC машини може обмежити паралелізм на рівні інструкцій, які можуть бути вилучені з коду, хоча це сильно опосередковано швидкими структурами кешу, які використовуються в сучасних конструкціях, а також іншими заходами. Завдяки суттєво компактним та семантично багатим інструкціям, середня кількість роботи, виконана за одиницю машинного коду (тобто за байт або біт) вище, для CISC, ніж RISC-процесорів, які можуть дати значну перевагу в реалізації на основі сучасного кешу.
Транзистори для логіки, PLA, та мікрокоду більше не обмежені ресурси; тільки значний об'єм кеш-пам'яті високої швидкості обмежено максимальною кількістю транзисторів сьогодні. Незважаючи на комплексність, кількість транзисторів CISC декодерів не збільшується експоненціально, як загальне число транзисторів на процесорі (більшість зазвичай використовується для кеш-пам'яті). Разом з кращими інструментами та вдосконалені технологіями, це призвело до появи нових реалізацій високо закодованих та рішень змінної довжини без обмеження процесу зчитування-запису (тобто не-RISC). Це визначає повторні реалізації старих архітектур, таких як повсюдний x86 (див нижче), а також нові конструкції для мікроконтролерів для вбудованих систем та інших аналогічних цілей. Суперскалярна складність в разі сучасних x86 була вирішена шляхом перетворення інструкцій в одну або більше мікрооперацій та їх динамічного видавання, тобто непрямого та динамічного суперскалярного виконання; Pentium Pro та AMD K5 є ранніми прикладами цього. Це дозволяє досить простий суперскалярний дизайн розташувати після (досить складних) декодерів (і буферів), що дає, так би мовити, найкраще з обох світів у багатьох відношеннях.
Терміни CISC та RISC стали менш значущими при подальшій еволюції як CISC так і RISC-проектів і реалізацій. Перші високо (або сильно) конвеєрні реалізації x86 — Intel 486 від Intel, AMD, Cyrix та IBM, підтримували всі інструкції, які робили їх попередники, але досягли ��аксимальної ефективності тільки на досить просту підмножину x86, яка була лише трохи більше, ніж типовий набір команд RISC (тобто без типових обмежень процесу зчитування-запису RISC). Покоління Intel Pentium P5 було суперскалярною версією цих правил. Проте, сучасні процесори x86 (зазвичай) декодують та розділяють інструкції в динамічні послідовності внутрішньо буферизованих мікрооперацій, які не тільки допомагають виконати більшу підмножину команд в конвеєрному (перекриваючому) представленні, але і сприяють більш поглибленому вилученню паралелізму з кодового потоку, для ще більш високої продуктивності.
Всупереч поширеним спрощенням, не всі CISC-процесори складаються з мікрокоду або мають «складні» інструкції. CISC став всеохопним терміном, який означає те, що не підходить під принцип зчитування-запису (RISC), це не кількість команд, та не складність реалізації або самих інструкцій, які визначають CISC, та фактом є те, що арифметичні інструкції також виконують доступ до пам'яті. В порівнянні з невеликим 8-бітовим процесором CISC, інструкція з рухомою комою RISC є складною. CISC навіть не потрібно мати складні режими адресації; 32 або 64-розрядні процесори RISC також можуть мати більш складні режими адресації, ніж дрібні 8-бітні CISC процесори.
PDP-10, PDP-8, Intel 386, Intel 4004, Motorola 68000, мейнфрейм System z, Burroughs B5000, VAX, Zilog Z80000 та MOS Technology 6502 — усі досить сильно розрізняються за кількістю, розмірами та форматами команд, кількістю, типами та розмірами регістрів, а також доступними типами даних. Деякі з них мають апаратну підтримку для операцій, таких як сканування підрядка, арифметика довільної точності BCD, або трансцендентні функції, в той час, як інші мають тільки 8-бітне додавання та віднімання. Але всі вони в категорії CISC, тому що у них є інструкції зчитування-оперування, які зчитують і/або зберігають зміст пам'яті в межах одних і тих же інструкцій, які виконують фактичні розрахунки. Так, наприклад, PDP-8, який має тільки 8 інструкцій фіксованої довжини та не має мікрокод взагалі, є CISC через принцип роботи інструкції, PowerPC, який має понад 230 команд (більше, ніж деякі процесори VAX) і складні внутрішні, такі як перейменування регістрів і буфер переупорядковування є RISC, в той час, як Minimal CISC має 8 інструкції, але явно CISC, оскільки він поєднує в собі доступ до пам'яті й обчислення в тій же інструкції.
Деякі з проблем і розбіжностей в цій термінології, можливо, зникнуть, як більш систематичні терміни, такі як (не) зчитування/запис, стають все більш популярним і в кінцевому підсумку замінюють неточні та трохи нелогічні RISC/CISC терміни.
- ↑ Patterson, D. A.; Ditzel, D. R. (October 1980). The case for the reduced instruction set computer. SIGARCH Computer Architecture News. ACM. 8 (6): 25—33. doi:10.1145/641914.641917.
- ↑ Lakhe, Pravin R. (June 2013). A Technology in Most Recent Processor is Complex Reduced Instruction Set Computers (CRISC): A Survey (PDF). International Journal of Innovation Research and Studies. Т. 2, № 6. с. 711—715. Архів оригіналу (PDF) за 14 липень 2015. Процитовано 6 травень 2017.