Структурные методы уменьшения времени
Лекция 4.
Структурные методы уменьшения времени доступа к памяти
Совершенствование архитектуры микропроцессоров и механизмов доступа к памяти не может происходить без принятия совокупности соглашений о структуре программ и обрабатываемых данных. Это обусловлено, например, тем, что время доступа в основную память десять и более раз больше, чем время выполнения преобразований данных в регистрах процессора. Потому необходимо находить решения по уменьшению времени доступа, учитывающие этот факт.
Иерархическая структура памяти. Идеальная память должна обеспечивать процессор командами и данными так, чтобы не вызывать простоев процессора. При этом память должна иметь большую емкость. В современных условиях уменьшение времени доступа достигается введением многоуровневой иерархии памяти. Время доступа зависит от объема и типа используемой памяти.
Типовая современная иерархия памяти имеет следующую структуру:
• регистры 64 - 256 слов с временем доступа 1 такт процессора;
• кэш 1 уровня - 8к слов с временем доступа 1-2 такта;
• кэш 2 уровня - 256к слов с временем доступа 3-5 тактов;
• основная память - до 4 Гигаслов с временем доступа 12-55 тактов.
Используя помимо основной памяти небольшую и более быструю буферную память, можно значительно сократить количество обращений к основной памяти, за счет аккумуляции текущего фрагмента программного кода в буферной памяти. Создание иерархической многоуровневой памяти, пересылающей блоки программ и данных между уровнями памяти за время, пока предшествующие блоки обрабатываются процессором, позволяет существенно сократить простои процессора в ожидании данных. При этом эффект уменьшения времени доступа в память будет тем больше, чем больше время обработки данных в буферной памяти по сравнению с временем пересылки между буферной и основной памятью. Это достигается при локальности обрабатываемых данных, когда процессор многократно использует одни и те же данные для выработки некоторого результата. Например, такая ситуация имеет место при решении систем уравнений в научных и инженерных расчетах, когда короткие участки программного кода с большим количеством вложенных и зацепленных друг с другом циклов обрабатывают поочередно, переходя от точки к точке, небольшие порции данных, многократно используя одни и те же данные и внутренние результаты.
В связи с тем, что локально обрабатываемые данные могут возникать в динамике вычислений и не обязательно сконцентрированы в одной области при статическом размещении в основной памяти, буферную память организуют как ассоциативную, в которой данные содержатся в совокупности с их адресом в основной памяти. Такая буферная память получила название кэш-памяти. Кэш-память позволяет гибко согласовывать структуры данных, требуемые в динамике вычислений, со статическими структурами данных основной памяти.
Рекомендуемые материалы
Кэш имеет совокупность строк (cache-lines), каждая из которых состоит из фиксированного количества адресуемых единиц памяти (байтов, слов) с последовательными адресами. Типичный размер строки: 16, 64, 128, 256 байтов.
Наиболее часто используются три способа организации кэш-памяти, отличающиеся объемом аппаратуры, требуемой для их реализации. Это так называемые кэш-память с прямым отображением (direct-mapped cache), частично ассоциативная кэш-память (set-associative cache) и ассоциативная кэш-память (fully associative cache).
При использовании кэш-памяти с прямым отображением адрес представляется как набор трех компонент, составляющих группы старших, средних и младших разрядов адреса, соответственно тега, номера строки, смещения. Например, при 16-разрядном адресе старшие 5 разрядов могут представлять тег, следующие 7 разрядов - номер строки и последние 4 разряда - смещение в строке. В этом случае строка состоит из 6 адресуемых единиц памяти, всего строк в кэше 128. Кэш-память с прямым отображением представляет собой набор строк, каждая из которых содержит компоненту тег и элементы памяти строки, адрес которых идентифицируется смещением относительно начала строки.
При этом устанавливается однозначное соответствие между адресом элемента памяти и возможным расположением этого элемента памяти в кэше, а именно: элемент памяти всегда располагается в строке, задаваемой компонентой "номер строки" адреса, и находится на позиции строки, задаваемой компонентой "смещение" адреса,
Наличие элемента данных по запрашиваемому адресу в кэше определяется значением тега. Если тег строки кэш-памяти равен компоненте "тег" адреса, то элемент данных содержится в кэш-памяти.
Иначе необходима подкачка в кэш-память строки, с заданным в адресе тегом.
Так как для определения наличия нужной строки данных в кэш-памяти требуется только одно сравнение тегов заданной строки и адреса, а само замещение строк выполняется по фиксированному местоположению, то объем оборудования, необходимый для реализации этого типа кэш-памяти, достаточно мал.
Недостатки этой организации - очевидны. Если программа использует поочередно элементы памяти из одной строки, но с различными значениями тегов, то это вызывает при каждом обращении замену строки с обращением к данным основной памяти.
Ассоциативная кэш-память использует двухкомпонентное представление адреса: группа старших разрядов трактуется как тег, а группа младших разрядов - как смещение в строке.
Нахождение строки в кэше определяется совпадением тега-строки со значением тега адреса. Количество строк в кэше может быть произвольным (естественное ограничение - количество возможных значений тегов). Поэтому при определении нахождения требуемой строки в кэш-памяти необходимо сравнение тега адреса с тегами всех строк кэша. Если выполнять это последовательно, строка за строкой, то время выполнения сравнений будет непозволительно большим. Поэтому сравнение выполняется параллельно во всех строках с использованием принципов построения ассоциативной памяти, что и дало название этому способу организации кэш-памяти.
При отсутствии необходимой строки в кэш-памяти одна из его строк должна быть заменена на требуемую. Используются разнообразные алгоритмы определения заменяемой строки, например циклический, замена наиболее редко используемой строки, замена строки, к которой дольше всего не было обращений, и другие.
Частично-ассоциативная кэш-память комбинирует оба вышеописанных подхода: кэш-память состоит из набора ассоциативных блоков кэш-памяти. Средняя компонента адреса задает в отличие от прямо адресуемой кэш-памяти не номер строки, а номер одного из ассоциативных блоков. При поиске данных ассоциативное сравнение тегов выполняется только для набора блоков (возможна организация кэша, когда таких наборов несколько), номер которого совпадает со средней компонентой адреса. По количеству n строк в наборе кэш-память называется n-входовой.
Соответствие между данными в оперативной памяти и кэш-памяти обеспечивается внесением изменений в те области оперативной памяти, для которых данные в кэш-памяти подверглись модификации. Соответствие данных обеспечивается параллельно с основными вычислениями. Существует несколько способов его реализации (и, соответственно, несколько режимов работы кэш-памяти).
Один способ предполагает внесение изменений в оперативную память сразу после изменения данных в кэше. При этом процессор простаивает в ожидании завершения записи в основную память. В основной памяти поддерживается правильная копия данных кэша, и при замене строк не требуется никаких дополнительных действий. Кэш-память, работающая в таком режиме, называется памятью со сквозной записью (write- through).
Другой способ предполагает отображение изменений в основной памяти только в момент вытеснения строки данных из кэша. Если данные по адресу памяти, в который необходимо произвести запись, находятся в кэш-памяти, то идет запись только в кэш-память. При отсутствии данных в кэш-памяти производится запись в основную память. Такой режим работы кэша получил название обратной записи (write-back).
Существуют также промежуточные варианты (buffed write though), при которых запросы на изменение в основной памяти буферизуются и не задерживают процессор на время операции записи в память. Эта запись выполняется по мере возможности доступа контроллера кэш-памяти к основной памяти.
В процессорах, предусматривающих возможность использования в мультипроцессорных конфигурациях, применяется более сложный протокол MESI (Modified, Exclusive, Shared, Invalid) организации кэш-памяти с обратной записью, который предотвращает лишние передачи данных между кэш-памятью и основной памятью.
Для мультипроцессорных систем, в которых память физически распределена между процессорными модулями, идентичность данных в кэшах (когерентность кэшей) различных модулей поддерживается с помощью межмодульных пересылок. Существует несколько основных подходов.
Прямолинейный подход к поддержанию когерентности кэшей в мультипроцессорной системе заключается в том, что при каждом непопадании в кэш в любом процессоре инициируется запрос требуемой строки из того блока памяти, в котором эта строка размешена. В дальнейшем этот блок памяти будет по отношению к этой строке называться резидентным. Запрос передается через коммутатор в модуль с резидентным для строки блоком памяти, из которого затем необходимая строка через коммутатор присылается в модуль, в котором произошло непопадание. Таким образом, в частности, обеспечивается начальное заполнение кэшей. При этом в каждом модуле для каждой резидентной строки ведется список модулей, в кэшах которых эта строка размещается. Строка, размещенная в кэше более чем одного модуля, в дальнейшем будет называться разделяемой.
Собственно когерентность кэшей обеспечивается следующим. При обращении к кэш-памяти в ходе операции записи данных, после самой записи, процессор приостанавливается до тех пор, пока не выполнится последовательность действий: измененная строка кэша пересылается в резидентную память модуля, затем, если строка была разделяемой, она пересылается из резидентной памяти во все модули, указанные в списке модулей, разделяющих эту строку. После получения подтверждений, что все копии изменены, резидентный модуль пересылает в процессор, приостановленный после записи, разрешение продолжать вычисления.
Изложенный алгоритм обеспечения когерентности хотя и является логически работоспособным, однако практически редко применяется из-за больших простоев процессоров при операциях записи в кэш строки. На практике применяют более сложные алгоритмы, обеспечивающие меньшие простои процессоров.
Для изложения одного из алгоритмов поддержки когерентности кэшей, известного как DASH, зададим некоторые начальные условия и введем определения.
Каждый модуль имеет для каждой строки, резидентной в модуле, список модулей, в кэшах которых размещены копии строк.
С каждой строкой в резидентном для нее модуле свяжем три ее возможных глобальных состояния:
1) "некэшированная", если копия строки не находится в кэше какого-либо другого модуля, кроме, возможно, резидентного для этой строки;
2) "удаленно-разделенная", если копии строки размещены в кэшах других модулей;
3) "удаленно-измененная", если строка изменена операцией записи в каком-либо модуле.
Кроме этого, каждая строка кэша может находиться в одном из трех локальных состояний:
1) "невозможная к использованию";
2) "разделяемая", если есть неизмененная копия, которая, возможно, размещается также в других кэшах;
3) "измененная", если копия изменена операцией записи,
Перейдем к изложению алгоритма. Каждый процессор может читать из своего кэша, если состояние читаемой строки "разделяемая" или "измененная". Если строка отсутствует в кэше или находится в состоянии "невозможная к использованию", то посылается запрос "промах чтения", который направляется в модуль, резидентный для требуемой строки.
Бели глобальное состояние строки в резидентном модуле - "некэшированная" или "удаленно-разделенная", то копия строки посылается в запросивший модуль, а в список модулей, содержащих копии рассматриваемой строки, вносится модуль, запросивший копию.
Если состояние строки "удаленно-измененная", то запрос "промах чтения" перенаправляется в модуль, содержащий измененную строку. Этот модуль пересылает требуемую строку в запросивший модуль и в модуль, резидентный для этой строки, и устанавливает в резидентном модуле для этой строки состояние удаленно-распределенная .
Если процессор выполняет операцию записи и состояние строки, в которую производится запись, - "измененная", то запись выполняется и вычисления продолжаются. Если состояние строки - "невозможная к использованию" или "разделяемая", то модуль посылает в резидентный для строки модуль запрос на захват в исключительное использование этой строки и приостанавливает выполнение записи до получения подтверждений, что все остальные модули, разделяющие с ним рассматриваемую строку, перевели ее копии в состояние "невозможная к использованию".
Если глобальное состояние строки в резидентном модуле - "некэшированная", то строка отсылается запросившему модулю, и этот модуль продолжает приостановленные вычисления .
Если глобальное состояние строки - "удаленно-разделенная", то резидентный модуль рассылает по списку всем модулям, имеющим копию строки, запрос на переход этих строк в состояние "невозможная к использованию". По получении этого запроса каждый из модулей изменяет состояние своей копии строки на "невозможная к использованию" и посылает подтверждение исполнения в модуль, инициировавший операцию записи. При этом в приостановленном модуле строка после исполнения записи переходит в состояние "удаленно-измененная".
Предпринимаются попытки повысить эффективность реализации алгоритма когерентности, в частности, за счет учета специфики параллельных программ, в которых используются асинхронно одни и те же данные на каждом временном интервале исключительно одним процессором с последующим переходом обработки к другому процессору. Такого рода ситуации случаются, например, при определении условий окончания итераций, В этом случае возможна более эффективная схема передачи строки из кэша одного процессора в кэш другого процессора.
В системах, использующих коммутатор с временным разделением (шину), интерфейс с шиной каждого модуля "прослушивает" все передачи по шине, поэтому нет необходимости вести списки модулей, разделяющих строки.
Кэш-память с обратной записью создает меньшую нагрузку на шину процессора и обеспечивает большую производительность, однако контроллер для write-back кэша значительно сложнее.
Контроллер кэша отслеживает адреса памяти, выдаваемые процессором, и если адрес соответствует данным, содержащимся в одной из строк кэша, то отмечается "попадание в кэш", и данные из кэша направляются в процессор. Если данных в кэше не оказывается, то фиксируется "промах", и инициируются действия по доставке в кэш из памяти требуемой строки. В ряде процессоров, выполняющих одновременно совокупность команд, допускается несколько промахов, прежде чем будет запущен механизм замены строк.
Рассуждения о том, какой способ организации кэш-памяти более предпочтителен, должны учитывать особенности генерации программ компилятором, а также использование программистом при подготовке программы сведений о работе компилятора и контроллера кэш-памяти. То есть более простой способ организации кэш-памяти, поддерживаемый компилятором, при исполнении программ, написанных в соответствии с некоторыми правилами, обусловленными особенностями компиляции и организации кэш-памяти, может дать лучший результат, чем сложный способ организации кэш-памяти.
Так как области памяти программ и данных различны и к ним происходит одновременный доступ, то для повышения параллелизма при работе с памятью делают отдельные кэши команд и данных.
Расслоение памяти. Другим структурным способом уменьшения времени доступа к памяти служит расслоение памяти. В предположении, что выборка из памяти выполняется по последовательным адресам возможно использование k блоков памяти с размещением в блоке i, где i=0,…, k-1, слов с адресами n=i+krrp mod k, где р=0,1,..., М. В этом случае возможно k параллельных обращений в память по адресам, принадлежащим различным блокам. Поэтому выборка команд программы за исключением команд, выбираемых как результат ветвления, может быть ускорена применением расслоения памяти. Аналогично может быть ускорена обработка массивов данных, последовательные элементы которых помещаются в разные блоки памяти.
Многоуровневая иерархия и расслоение памяти могут использоваться совместно.
CISC- и RISC- процессоры.
Аппаратные возможности процессоров определяются уровнем развития микроэлектронной технологии, которая ограничивает число логических элементов, размещаемых на кристалле. Фактически его размеры и число размещаемых на нем транзисторов почти целиком определяют тот набор аппаратных устройств, которые включаются в создаваемый процессор. Разработчики стремятся ввести в его состав как можно большее число различных арифметических и логических устройств, сопроцессоров и т.д., поскольку очевидно, что аппаратная реализация какой-либо функции обеспечивает более быстрое ее выполнение, чем программная. Да и длина кода для реализуемых аппаратным путем функций существенно меньше, Поэтому в 80-х годах процессоры "росли вширь", оснащались новыми узлами, совершенствуя уже имеющиеся. Кроме того, разработчикам процессоров приходилось постоянно подстраиваться под стремление программистов иметь возможно более мощную и гибкую систему команд. Такие системы команд с разнообразными способами адресации и наборами условных переходов и вызовов подпрограмм, строковыми операциями и префиксациями обеспечивали создание коротких программ, гарантировали меньшее число ошибок в них. И разработчики не могли не считаться с этим.
! Под архитектурой в данном случае следует понимать только систему команд, играющую роль интерфейса между аппаратным и программным обеспечением.
Первые ростки противоречий, приведших к тому, что пути занимающихся разработкой и производством МП компаний разошлись в разные стороны, обнаружились давно. За первые 10 лет существования МП сформировалась архитектура СISC (Complex Instruction Set Computing — вычисления со сложным набором инструкций). В построенных по её принципам процессорах более 2/3 кристалла занимают логика, реализующая выборку и декодирование сложных инструкций, прямое взаимодействие не только с регистровой памятью, но и с внешней, а также изощрённые схемы адресации. При этом блоки, непосредственно занятые вычислениями занимают лишь 1/3 площади кристалла. На протяжении нескольких десятилетий системы команд эволюционировали, находясь в сложной зависимости от стоимости аппаратных ресурсов, и прежде всего самого дорогого из них – оперативной памяти. Инженерами руководило стремление сократить размер программ, для этого они старались вложить как можно больше функциональности в одну команду. К началу 80-х число таких команд достигло почти 300 сотен, и почти каждая из них имела до 6 типов адресации. К тому же команды не имели фиксированной длины.
Однако, начиная с некоторого момента СISC-идеология стала не ускорителем, а тормозом роста производительности систем. Дело в том, что большое разнообразие команд и различная их длина существенно усложняют аппаратуру управления внутри процессора. Так, например, она должна определить длину команды (может варьироваться в пределах от одного до пяти-шести байт), выделить код операции, подготовить операнды, которые могут находиться как в регистрах, так и в оперативной памяти. Результат вычислений также нужно перенести или в память, или в какой-либо из регистров.
Осознав указанные факты, многие исследователи уже в 80-е годы начали поиски альтернативных путей повышения производительности процессоров. Было ясно, что нужно попытаться уменьшить «накладные расходы», отъедающие до двух третей полезной площади кристалла, снизив число логических элементов в них до минимума. Для этого было необходимо перенести "центр тяжести" на программные средства, оставив минимально возможное число команд, имеющих простую и регулярную структуру. Другими словами, начала формироваться стратегия "длинная программа — короткие команды" в противовес господствующей «короткая программа — длинные команды». Оставалось только найти разумный компромисс между ресурсами, отводимыми основным вычислительным узлам процессора и устройствам управления.
И вскоре этот компромисс был найден. Вначале Джон Кук из IBM Research Labs на своем экспериментальном компьютере "model 801" показал, что при использовании в программе лишь простейших команд формата «регистр—регистр» (операнды извлекаются исключительно из регистров и после выполнения операции помещаются только в регистры) скорость выполнения большинства вычислительных задач возрастает в два-три раза. Затем учеными Стенфордского университета было показано, что исключение из набора команд сложных операций уменьшает число элементов процессора на порядок за счет упрощения схем управления ресурсами процессора (при этом производительность системы остается практически неизменной).
Опыт многочисленных исследователей статистических свойств программ выявил, что 80 % процессорного времени обычно тратится на выполнение всего 20 % от общего числа инструкций обычных CISC-процессоров. Причем все эти 20 % приходятся на команды типа "регистр—регистр".
И наконец, в работах Д. Паттерсона и К. Секуина были сформулированы четыре основных принципа, которые должны быть положены в основу процессоров группы RISC (Reduced Instruction Set Computing – вычисления с сокращенным набором команд):
а) любая операция, к какому бы типу она ни принадлежала, должна выполняться за один такт;
б) операции обработки данных реализуются только в формате “регистр—регистр”. Обмен между памятью и регистрами (т. е. модификация памяти и чтение из нее необходимых данных) осуществляется только лишь с помощью специальных команд чтения/записи;
в) система команд должна содержать минимальное число наиболее часто используемых простейших команд одинаковой длины:
г) состав системы команд должен быть оптимизирован с учетом требований компиляторов языков высокого уровня.
Кстати, над идеями, вошедшими в концепцию RISC, трудились не только на Западе. Ещё в 70-х годах, когда американские учёные только приблизились к формулировке того, что стало называться RISC, в Советском Союзе уже были построены большие ЭВМ, в которых были реализованы решения, позволившие использовать RISC-архитектуру в области высокопроизводительных вычислений. Например, суперскалярная архитектура была реализована у нас 1978 году, в то время как американцы подошли к ней лишь в начале 90-х годов. А ведь именно суперскалярность называют сегодня 5-ым критерием принадлежности процессора к RISC-архитектуре.
Наиболее сложно выполнимое из упомянутых требований — первое, в соответствии с которым, каждая команда должна выполняться не более чем за один такт. Однако, несмотря на существенное упрощение, необходимо, чтобы устройство управления по-прежнему выполняло операции по чтению кода команды, декодированию, подготовке операндов, собственно выполнению команды и перемещению результата в соответствующий регистр. Если учесть, что каждая из этих операций обязана синхронизироваться с фронтом (или спадом) сигнала тактового генератора, то единственно возможный вариант решения проблемы - использование так называемого конвейера команд. При этом по первому перепаду сигнала тактового генератора в соответствующем устройстве выделяется код операции, который затем передается в устройство декодирования; по второму - в устройстве извлечения выделяется код операции следующей команды, а в устройстве декодирования происходит декодирование первой команды и передача ее в соответствующее исполнительное устройство - АЛУ, сопроцессор и т. д. Третий перепад сопровождается извлечением кода операции третьей команды, декодированием второй и подготовкой данных для выполнения первой.
Таким образом, по каждому из тактовых импульсов на конвейер вступает новая команда, и несколько уже обрабатываются на разных его ступенях. Одновременно, также по каждому из тактовых импульсов, его покидает одна выполненная команда. И хотя на выполнение каждой затрачивается по-прежнему от четырех до семи-восьми тактов (в рассмотренном выше условном конвейере - пять), каждый из них сопровождается, как это и требовалось, выполнением одной команды. Следовательно, если для RISC - процессоров конвейер команд является необязательным (хотя и желательным) элементом, то для RISC-процессоров он обязателен. Отметим, что большинство RISC-процессоров имеют не один, а несколько (от двух до четырех) конвейеров, за что они получили название суперскалярных (в отличие от скалярных - одноконвейерных).
Лекция "7 - Опорно-двигательная система клетки" также может быть Вам полезна.
Следующая особенность RISC-процессоров - высокая степень дробления конвейера. В рассмотренном выше примере он состоит из пяти ступеней: извлечения кода операции, декодирования, подготовки операндов, исполнения, сохранения результата. Реально RISC-процессоры характеризуются семидесяти ступенчатыми конвейерами. С увеличением числа ступеней действия, выполняемые на каждой из них, все более и более упрощаются. Последнее означает, что уменьшается число необходимых для этого логических элементов и появляется возможность повысить тактовую частоту процессора.
Третья особенность, вытекающая из предыдущей, - развитые средства прогнозирования ветвлений и переходов. В программах для семейства х86 команда перехода встречается в среднем через каждые шесть, в программах для RISC-процессоров, команды которых проще, - через каждые 10... 12 команд. Встретив команду условного перехода, процессор должен сделать предположение о том, выполнится условие или нет, и в зависимости от этого начать предвыборку команд либо с адреса предполагаемого перехода, либо с адреса, следующего за текущим. Если переход предсказан неправильно, процессору необходимо удалить со всех ступеней конвейера команды, относящиеся к неверно сделанному предположению, и перезагрузить конвейер. Это особенно сказывается на работе суперскалярных процессоров - на разных ступенях трех-четырех конвейеров может находиться довольно много команд. Их удаление с последующей перезагрузкой приводит к тому, что в течение нескольких тактов конвейер не покидает ни одна команда. Процессор, в котором это случается часто, теряет 20... 30 % своей производительности. Поэтому RISC-процессоры характеризуются весьма эффективными механизмами предсказания ветвлений. Кроме того, они содержат устройства, позволяющие выбрать те из команд в предсказанном переходе, которые можно выполнить прежде, чем станет ясно, правильно ли был предсказан переход.
Еще одна особенность RISC-процессоров - использование большого числа регистров. Как правило, в RISC-процессорах их не менее 32. Подобная свобода (семейство х86 имеет всего восемь регистров общего назначения) позволяет снизить число обращений к относительно медленной оперативной памяти в полтора-два раза (в сравнении с CISC-процессорами), что опять-таки положительно сказывается на росте реальной производительности системы. Добавим к этому, что все RISC-процессоры содержат системы управления кэш-памятью второго уровня, позволяющие работать с ней на максимальной скорости (в RISC-изделиях взаимодействие с кэш-памятью обычно происходит на частоте, более низкой, чем частота самого процессора).
Очевидно, что RISC-процессоры эффективны в тех областях применения, в которых можно продуктивно использовать структурные способы уменьшения времени доступа к оперативной памяти. Если программа генерирует произвольные последовательности адресов обращения к памяти и каждая единица данных используется только для выполнения одной команды, то фактически производительность процессора определяется временем обращения к основной памяти. В этом случае использование сокращенного набора команд только ухудшает эффективность, так как требует пересылки операндов между памятью и регистром вместо выполнения команд "память, память - память". Программист должен учитывать необходимость локального размещения обрабатываемых данных, чтобы при пересылках между уровнями памяти по возможности все данные пересылаемых блоков данных принимали участие в обработке. Если программа будет написана так, что данные будут размещены хаотично и из каждого пересылаемого блока данных будет использоваться только небольшая их часть, то скорость обработки замедлится в несколько раз до скорости работы основной памяти.
Развитие микропроцессоров происходит при постоянном стремлении сохранения преемственности программного обеспечения (ПО) и повышения производительности за счет совершенствования архитектуры и увеличения тактовой частоты. Сохранение преемственности ПО и повышение производительности, вообще говоря, противоречат друг другу. Процессоры с системой команд х86, относящиеся к классу CISC-процессоров, имеют более низкие тактовые частоты по сравнению с микропроцессорами ведущих компаний-изготовителей RISC-процессоров. Существуют приложения, на которых производительность х86 микропроцессоров значительно ниже. чем у RISC-процессоров, реализованных на той же элементной базе. Однако возможность использования совместимого ПО для различных поколений х86 процессоров, выпущенных в течение последнего десятилетия, обеспечивает им устойчивое доминирующее положение на рынке.
В настоящее время на основе разработок компаний NexGen и AMD, подхваченных компанией Intel, предпринята попытка решить проблему повышения производительности в рамках архитектуры х86. Эти компании, сохраняя преемственность по системе команд с CISC-микропроцессорами семейства х86, создают новые устройства с использованием элементов RISC-архитектуры, использующие концепцию разделенной (decoupled) архитектуры и RISC ядра. В микропроцессор встраивается аппаратный транслятор, превращающий команды х86, в команды RISC-процессора. При этом одна команда х86 может порождать до четырех команд RISC-процессора. Исполнение команд происходит как в развитом суперскалярном процессоре.