CISC (Complex Instruction Set Computing)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 17:29, 11 мая 2016.

CISC (англ. Complex Instruction Set Computing - компьютер с полным набором команд) это архитектура процессера где одиночные команды могут выполнять несколько операций низкого уровня (например, загрузка из памяти, арифметические операции, хранилище памяти) или способны на многоступенчатые операции или режимы адресации в пределах одной инструкции. Этот термин был введён задним числом (в отличие от Сокращенный Набор Команд Компьютера (RISC), и поэтому стал обобщающим термином для всего, что не является RISC, т.е. всё, начиная от больших и сложных мейнфреймов и заканчивая упрощенными микроконтроллерами, где нагрузка на память и хранить операции не отделены от арифметических команд.

Поэтому современный RISC-процессор может быть гораздо сложнее, чем современный микроконтроллер с использованием набор команд CISC, не только с точки зрения реализации (электронная сложность схемы), но и с точки зрения количества инструкций или сложности кодирования их шаблонов. Только дифференцирование характеристик почти гарантирует тот факт, что большинство архитектур RISC используют равномерную длину для почти всех инструкций и используют строго отдельные загрузки / хранения инструкции.

Примеры архитектур наборов инструкций, которые были названы CISC являются CISC are System/360 through z/Architecture, the PDP-11 и VAX архитектуры, Data General Nova и многие другие. Хорошо известные микропроцессоры и микроконтроллеры, которые также были причислены к CISC во многих научных публикациях включают Motorola семей 6800, 6809 и 68000 ; процессоры Intel 8080, iAPX432 и x86; Zilog Z80, Z8 и Z8000; National Semiconductor 32016 и NS320xx линии; MOS технология 6502 серии; семья процессоровIntel 8051; и другие.

Несколько проектов рассматривались как пограничные случаи между RISC и CISC. Например, Microchip Technology PIC был назван RISC в одних кругах и CISC в других, а 6502 и 6809 были описаны оба как «RISC-подобные", хотя они и имеют сложные режимы адресации, а также арифметические инструкции, при обращении к памяти, вопреки к RISC-принципам.

Преимущества и особенности

Преимущества

Перед тем, как во многих процессорах начали использовать RISC, многие системные архитекторы пытались преодолеть семантический пробел, то есть разработать наборы инструкций, которые непосредственно поддерживаются конструкциями высокоуровневого программирования, такие как вызовы процедур, контроль цикла и сложные режимы адресации, что позволило бы объединить в единые инструкции доступ к массиву и структуру данных. Инструкции также были сильно закодированы в целях дальнейшего повышения плотности кода. Компактность таких наборов инструкций привела к уменьшению размеров программ и меньшего количества актов доступа к памяти, что в то время (в начале 1960-х годов и в последующие годы) привело к значительной экономии на стоимости памяти компьютера и дисков хранения, а также к более быстрому исполнению инструкций. Это также означает хорошую производительность даже в ассемблере, а языки программирования высокого уровня, такие как Fortran или алгол не всегда были доступны или соответствовали требованиям архитектуры (микропроцессоры в этой категории иногда до сих пор запрограммированы на языке ассемблера для критически важных приложений).

Особенности

  • нефиксированное значение длины команды;
  • арифметические действия кодируются в одной команде;
  • небольшое число регистров, каждый из которых выполняет строго определённую функцию.
  • нефиксированное количество обращений одной инструкции к памяти.
  • большое количество разных режимов адресации
  • сложная кодировка инструкций

История

Новые инструкции

В 1970-е годы анализ языков высокого уровня обнаружил несколько сложных реализаций на машинном языке, и было установлено, что новые инструкции могут улучшить производительность. Были добавлены некоторые инструкции, которые никогда не предназначались для использования на языке ассемблера, но хорошо согласуются с языками высокого уровня. Для того, чтобы воспользоваться этими инструкциями, необходимо было обновить компиляторы. Преимущества семантически богатых инструкций с компактными кодировками хорошо заметны в современных процессорах, а также, в частности, в высокопроизводительных сегментах, где кэши являются центральным компонентом (в отличие от большинства встраиваемых систем). Это происходит потому что быстрые, но сложные и дорогостоящие блоки памяти по своей природе ограничены в размерах, что делает компактный код выгодным. Конечно, основная причина их необходимости в том, что основные запоминающие устройства (т.е. динамическое ОЗУ сегодня) остается медленным по сравнению с ядром процессора.

Вопросы проектирования

В то время как многие проекты достигли цели: более высокая пропускная способность при меньших затратах, а также позволили языкам высокого уровня быть выраженными меньшим количеством инструкций, было отмечено, что этот случай появляется не всегда. Например, младшие версии сложных архитектур (т.е. с использованием меньшего аппаратного обеспечения) могут привести к ситуациям, когда можно было улучшить производительность за счет неиспользования сложных инструкций (например, вызов процедуры или ввод инструкции), вместо этого используя последовательность простых инструкций.

Одной из причин было то, что архитекторы (те, кто пишут микрокод) иногда делают "более продуманные" инструкции на языке ассемблера, т.е. в том числе функции, которые было бы невозможно эффективно реализовать на основной аппаратных средств. Это может, например, быть устранение "побочных эффектов", таких как установка регистра или ячейки памяти, которая, возможно, редко используется; если это было сделано с помощью обычных (не дублирующихся) внутренних шин, или даже внешней шины, то она требовала бы дополнительные циклы каждый раз, а это неэффективно.

Даже в сбалансированных высокопроизводительных конструкциях сильно закодированные и относительно высокоуровневые инструкции могут быть сложны для декодирования и эффективного выполнения в рамках ограниченного бюджета транзистора. Поэтому такие архитектуры требует много работы со стороны архитектора процессора в тех случаях, когда более простое, но как правило медленное решение на основе декодирования таблиц и/или микрокода последовательности не подходит. В то время, когда транзисторы и другие компоненты были ограниченным ресурсом, это также оставляло меньше компонентов и меньше возможностей для других видов оптимизации производительности.

Идея RISC

Схема, которая выполняет действия, определяемые микрокодом во многих CISC процессорах, сама по себе - процессор, который во многом напоминает структурой очень ранние конструкции процессора. В начале 1970-х годов это породило идеи о возвращении к более простой конструкции процессора чтобы обходиться без относительно больших ROM таблиц и/или PLA структуры для секвенирования и/или декодирования. Первый RISC-маркированный процессор (IBM 801 – IBM's Watson Research Center, середина 1970-х годов) была плотно конвейерной простой машиной, изначально предназначенной для использования в качестве внутреннего микрокода ядра в CISC конструкциях, но так же стал процессором, который ввел понятие RISC в общественный обиход. Простота и регулярность даже в видимых инструкциях упростила реализацию перекрывающихся этапов процессора на уровне машинного кода (т.е. уровень, обнаруживающийся составителями). Тем не менее, конвейерная обработка на этом уровне уже была использована в некоторых высокопроизводительных CISC суперкомпьютеров для сокращения времени выполнения цикла инструкции (несмотря на осложнения реализации в рамках ограниченного числа компонентов и сложно осуществимой проводки в то время). Внутреннее исполнение микрокода в CISC-процессоров, с другой стороны, могло быть более или менее родственным к конвейерной обработки в зависимости от конкретной конструкции, и, следовательно, родственным к базовой структуре процессоров RISC.

Суперскаляр

В более современном контексте, комплекс переменной длины кодирования, используемый некоторыми CISC-архитектурами делает его сложным, но все же возможным, для строительства суперскалярной реализации CISC-модели программирования; исправный суперскаляр оригинальный Intel P5 и не совсем исправный суперскалярный Cyrix 6x86 - хорошо известные примеры. Частые обращения к памяти за операндами у типичной CISC-машины может ограничить параллелизм на уровне команд, которые могут быть извлечены из кода. Из-за сути компактных и семантически богатых инструкций, среднее количество работы, выполняемой за единицу машинного кода (т.е. в байт или бит) выше для CISC, чем для RISC, что может дать им значительное преимущество в реализации на основе современного кэша.

Транзисторы для логики, PLAs и микрокоды больше не ограниченные ресурсы; сегодня только большая высокоскоростная кэш-память ограничена максимальным количеством транзисторов. Несмотря на это, количество транзисторов CISC-декодеров не растут в геометрической прогрессии, как общее число транзисторов на процессоре (большинство обычно используется для кэшей). Вместе с лучшими инструментами и усовершенствованными технологиями это привело к появлению новых реализаций сильно закодированных конструкций переменной длины без недостатков архитектуры load-store (т.е. не-RISC). Это определяет повторные реализации старых архитектур, таких как вездесущий x86, а также новые конструкции для микроконтроллеров встраиваемых систем и других аналогичных целей. Суперскалярная сложность в случае современных x86 была решена путем преобразования инструкций в одну или более микроопераций и динамически выдающих эти микрооперации, то есть косвенное и динамичное суперскалярное исполнение;примеры - метод Pentium Pro и AMD K5. Это позволяет расположить довольно простую суперскалярную архитектуру после (довольно сложных) декодеров (и буферов), что дает, так сказать, лучшее из обоих областей во многих отношениях.

Термины CISC и RISC

Термины CISC и RISC стали менее значимыми при дальнейшей эволюции обоих CISC и RISC конструкций и реализаций. Первой сильно конвейерной реализацией x86, 486 конструкций из Intel, AMD, Cyrix и IBM, поддерживали все инструкции, которые делали их предшественники, но достигали максимальной эффективности только на достаточно простой x86 архитектуре, которая было лишь немногим больше, чем типичный набор команд RISC (т.е. без типичного RISC load-store ограничений). Intel P5 поколение было суперскалярной версией этих принципов. Тем не менее, процессоры современным x86 также расшифровывают и делят инструкции в динамические последовательности внутри буферизованных микроопераций, которые не только помогают выполнить большее количество команд в конвейерном (перекрытием) стиле, но и способствует более продвинутому извлечению параллельности из потока кода для получения еще большей производительности.

Вопреки распространенному упрощению (которое представлено даже в некоторых академических текстах), не все CISC-системы являются микрокодом или имеют сложные инструкции. CISC стал широким термином, означающим всё, что не является архитектурой load-store (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 6502 - все они отличаются друг от друга по количеству, размеру и формату инструкций, числу, типу и размеру регистров, а также доступному типу данных. Некоторые из них имеют аппаратную поддержку для таких операций, как сканирование подстроки, арифметики произвольной точности BCD или трансцендентной функций, в то время как другие имеют только 8-битное сложение и вычитание. Но все они в категории CISC, потому что у у них архитектура инструкций load-operate, загрузка содержимого и/или хранения памяти в пределах той же инструкции, которые выполняют реальные вычисления. Например, PDP-8, имея только 8 инструкции фиксированной длины и вообще не являясь микрокодом, является CISC из-за того как инструкции работают, а PowerPC, который имеет более 230 команд (больше, чем некоторые VAXes) и такие сложные внутренние операции, как переименование регистров и изменение порядка буфера, является RISC, в то время как минимальная CISC имеет 8 инструкций, но это явно CISC, так как он сочетает в себе доступ к памяти и вычисление в одних и тех же инструкций.

Некоторые противоречия в этой терминологии, возможно, исчезнут ​​по мере того, как более систематические термины, такие как не-load/store становятся все более популярными и в конечном итоге заменят неточные и слегка нелогичные RISC/CISC термины.