В электронике , информатике и компьютерной инженерии микроархитектура , также называемая организацией компьютера и иногда сокращенно μarch или uarch , — это способ, которым данная архитектура набора инструкций (ISA) реализована в конкретном процессоре . [1] Данная ISA может быть реализована с помощью различных микроархитектур; [2] [3] реализации могут различаться из-за различных целей данной конструкции или из-за сдвигов в технологии. [4]
Архитектура компьютера представляет собой сочетание микроархитектуры и архитектуры набора команд.
ISA примерно то же самое, что и программная модель процессора, как ее видит программист на языке ассемблера или автор компилятора. ISA включает инструкции , модель выполнения , регистры процессора , адреса и форматы данных среди прочего. Микроархитектура включает составные части процессора и то, как они взаимодействуют и взаимодействуют для реализации ISA.
Микроархитектура машины обычно представлена в виде (более или менее подробных) диаграмм, которые описывают взаимосвязи различных микроархитектурных элементов машины, которые могут быть чем угодно, от отдельных вентилей и регистров до полных арифметико-логических устройств (АЛУ) и даже более крупных элементов. Эти диаграммы обычно разделяют тракт данных (где размещаются данные) и тракт управления (который, можно сказать, управляет данными). [5]
Человек, проектирующий систему, обычно рисует конкретную микроархитектуру как своего рода диаграмму потока данных . Как и блок-схема , диаграмма микроархитектуры показывает микроархитектурные элементы, такие как арифметико-логическое устройство и регистровый файл , как один схематический символ. Обычно диаграмма соединяет эти элементы стрелками, толстыми и тонкими линиями, чтобы различать трехсоставные шины (которые требуют трехсоставного буфера для каждого устройства, которое управляет шиной), однонаправленные шины (всегда управляемые одним источником, например, как адресная шина на более простых компьютерах всегда управляется регистром адреса памяти ) и отдельные линии управления. Очень простые компьютеры имеют единую организацию шины данных — у них есть одна трехсоставная шина . Диаграмма более сложных компьютеров обычно показывает несколько трехсоставных шин, которые помогают машине выполнять больше операций одновременно.
Каждый микроархитектурный элемент, в свою очередь, представлен схемой, описывающей взаимосвязи логических вентилей, используемых для его реализации. Каждый логический вентиль, в свою очередь, представлен принципиальной схемой, описывающей соединения транзисторов, используемых для его реализации в некотором конкретном логическом семействе . Машины с различными микроархитектурами могут иметь одинаковую архитектуру набора команд и, таким образом, быть способны выполнять одни и те же программы. Новые микроархитектуры и/или схемотехнические решения, наряду с достижениями в производстве полупроводников, являются тем, что позволяет новым поколениям процессоров достигать более высокой производительности при использовании той же ISA.
В принципе, одна микроархитектура может выполнять несколько различных ISA с небольшими изменениями в микрокоде .
Конвейерный тракт данных является наиболее часто используемым дизайном тракта данных в микроархитектуре сегодня. Эта техника используется в большинстве современных микропроцессоров, микроконтроллеров и DSP . Конвейерная архитектура позволяет нескольким инструкциям перекрываться при выполнении, как на сборочной линии. Конвейер включает в себя несколько различных этапов, которые являются основополагающими в проектах микроархитектуры. [5] Некоторые из этих этапов включают выборку инструкций, декодирование инструкций, выполнение и обратную запись. Некоторые архитектуры включают в себя другие этапы, такие как доступ к памяти. Проектирование конвейеров является одной из центральных задач микроархитектуры.
Исполнительные блоки также важны для микроархитектуры. Исполнительные блоки включают арифметико-логические блоки (ALU), блоки с плавающей точкой (FPU), блоки загрузки/хранения, предсказания ветвлений и SIMD . Эти блоки выполняют операции или вычисления процессора. Выбор количества исполнительных блоков, их задержки и пропускной способности является центральной задачей микроархитектурного проектирования. Размер, задержка, пропускная способность и подключение памяти в системе также являются микроархитектурными решениями.
Решения по проектированию на уровне системы, такие как включение или отсутствие периферийных устройств , таких как контроллеры памяти , можно считать частью процесса микроархитектурного проектирования. Это включает решения по уровню производительности и подключению этих периферийных устройств.
В отличие от архитектурного проектирования, где достижение определенного уровня производительности является главной целью, микроархитектурное проектирование уделяет больше внимания другим ограничениям. Поскольку решения по проектированию микроархитектуры напрямую влияют на то, что входит в систему, необходимо уделять внимание таким вопросам, как площадь/стоимость чипа, энергопотребление, сложность логики, простота подключения, технологичность, простота отладки и тестируемость.
Для запуска программ все одно- или многокристальные процессоры:
Цикл инструкций повторяется непрерывно до тех пор, пока не будет отключено питание.
Исторически самые ранние компьютеры были многоцикловыми. Самые маленькие и недорогие компьютеры часто все еще используют эту технику. Многоцикловые архитектуры часто используют наименьшее общее количество логических элементов и разумное количество энергии. Они могут быть спроектированы так, чтобы иметь детерминированную синхронизацию и высокую надежность. В частности, у них нет конвейера, который останавливается при выполнении условных переходов или прерываний. Однако другие микроархитектуры часто выполняют больше инструкций в единицу времени, используя то же логическое семейство. При обсуждении «улучшенной производительности» улучшение часто относится к многоцикловой конструкции.
В многоцикловом компьютере компьютер выполняет четыре шага последовательно, в течение нескольких циклов часов. Некоторые конструкции могут выполнять последовательность за два цикла часов, завершая последовательные этапы на чередующихся фронтах часов, возможно, с более длительными операциями, происходящими вне основного цикла. Например, первый этап на переднем фронте первого цикла, второй этап на заднем фронте первого цикла и т. д.
В логике управления комбинация счетчика циклов, состояния цикла (высокое или низкое) и битов регистра декодирования инструкций точно определяют, что должна делать каждая часть компьютера. Чтобы разработать логику управления, можно создать таблицу битов, описывающих сигналы управления для каждой части компьютера в каждом цикле каждой инструкции. Затем эту логическую таблицу можно протестировать в программной симуляции, запускающей тестовый код. Если логическая таблица помещается в память и используется для фактического запуска реального компьютера, она называется микропрограммой . В некоторых компьютерных конструкциях логическая таблица оптимизируется в форме комбинационной логики, созданной из логических вентилей, обычно с использованием компьютерной программы, которая оптимизирует логику. Ранние компьютеры использовали проектирование специальной логики для управления, пока Морис Уилкс не изобрел этот табличный подход и не назвал его микропрограммированием. [6]
Усложняет эту простую на вид последовательность шагов тот факт, что иерархия памяти, которая включает кэширование , основную память и энергонезависимое хранилище, такое как жесткие диски (где находятся инструкции программы и данные), всегда была медленнее самого процессора. Шаг (2) часто вносит длительную (с точки зрения ЦП) задержку, пока данные поступают по компьютерной шине . Значительный объем исследований был вложен в конструкции, которые максимально избегают этих задержек. На протяжении многих лет главной целью было выполнение большего количества инструкций параллельно, тем самым увеличивая эффективную скорость выполнения программы. Эти усилия привели к появлению сложной логики и структур схем. Первоначально эти методы могли быть реализованы только на дорогих мэйнфреймах или суперкомпьютерах из-за количества схем, необходимых для этих методов. По мере развития производства полупроводников все больше и больше этих методов могли быть реализованы на одном полупроводниковом кристалле. См. закон Мура .
Наборы инструкций менялись с годами, от изначально очень простых до иногда очень сложных (в разных отношениях). В последние годы в моде были архитектуры загрузки-хранения , типы VLIW и EPIC . Архитектуры, которые имеют дело с параллелизмом данных , включают SIMD и Vectors . Некоторые метки, используемые для обозначения классов архитектур ЦП, не являются особенно описательными, особенно метка CISC; многие ранние разработки, ретроспективно обозначенные как « CISC », на самом деле значительно проще современных процессоров RISC (в нескольких отношениях).
Однако выбор архитектуры набора инструкций может существенно повлиять на сложность реализации высокопроизводительных устройств. Знаменитая стратегия, использованная для разработки первых RISC-процессоров, заключалась в упрощении инструкций до минимума индивидуальной семантической сложности в сочетании с высокой регулярностью кодирования и простотой. Такие однородные инструкции легко извлекались, декодировались и выполнялись конвейерным способом, и простая стратегия заключалась в сокращении количества логических уровней для достижения высоких рабочих частот; кэш-память инструкций компенсировала более высокую рабочую частоту и изначально низкую плотность кода , в то время как большие наборы регистров использовались для вынесения за скобки как можно большего количества (медленных) обращений к памяти.
Одним из первых и наиболее мощных методов повышения производительности является использование конвейеризации инструкций . Ранние разработки процессоров выполняли все вышеперечисленные шаги для одной инструкции, прежде чем переходить к следующей. Большие части схемы оставались бездействующими на любом шаге; например, схема декодирования инструкций простаивала во время выполнения и т. д.
Конвейеризация повышает производительность, позволяя нескольким инструкциям проходить через процессор одновременно. В том же базовом примере процессор начал бы декодировать (шаг 1) новую инструкцию, пока предыдущая ждала результатов. Это позволило бы до четырех инструкций быть «в полете» одновременно, заставляя процессор выглядеть в четыре раза быстрее. Хотя любая отдельная инструкция занимает столько же времени для выполнения (все еще есть четыре шага), ЦП в целом «списывает» инструкции гораздо быстрее.
RISC делает конвейеры меньше и намного проще в построении, четко разделяя каждый этап процесса инструкций и заставляя их занимать одинаковое количество времени — один цикл. Процессор в целом работает по принципу сборочной линии , при этом инструкции поступают с одной стороны, а результаты выходят с другой. Благодаря уменьшенной сложности классического конвейера RISC , конвейерное ядро и кэш инструкций можно было разместить на кристалле того же размера, который в противном случае поместился бы только на ядро в дизайне CISC. Это была настоящая причина того, что RISC был быстрее. Ранние проекты, такие как SPARC и MIPS, часто работали более чем в 10 раз быстрее, чем решения Intel и Motorola CISC при той же тактовой частоте и цене.
Конвейеры ни в коем случае не ограничиваются RISC-проектами. К 1986 году топовая реализация VAX ( VAX 8800 ) представляла собой в значительной степени конвейерную конструкцию, немного предшествовавшую первым коммерческим проектам MIPS и SPARC. Большинство современных ЦП (даже встроенных ЦП) теперь конвейерные, а микрокодированные ЦП без конвейеризации можно увидеть только в самых ограниченных по площади встроенных процессорах. [ нужны примеры ] Большие машины CISC, от VAX 8800 до современных Pentium 4 и Athlon, реализованы как с помощью микрокода, так и с помощью конвейеров. Улучшения в конвейеризации и кэшировании являются двумя основными микроархитектурными достижениями, которые позволили производительности процессоров идти в ногу с технологией схем, на которой они основаны.
Вскоре усовершенствования в производстве микросхем позволили разместить на кристалле еще больше схем, и проектировщики начали искать способы их использования. Одним из наиболее распространенных было добавление все большего объема кэш-памяти на кристалл. Кэш — очень быстрая и дорогая память. К ней можно получить доступ за несколько циклов, в отличие от многих, необходимых для «общения» с основной памятью. ЦП включает в себя контроллер кэша, который автоматизирует чтение и запись из кэша. Если данные уже находятся в кэше, к ним осуществляется доступ оттуда — со значительной экономией времени, тогда как если их там нет, процессор «стопит», пока контроллер кэша считывает их.
В RISC-проектах кэш начали добавлять в середине-конце 1980-х годов, часто всего 4 КБ в общей сложности. Со временем это число росло, и теперь типичные ЦП имеют не менее 2 МБ, в то время как более мощные ЦП поставляются с 4, 6, 12 МБ или даже 32 МБ или более, причем в недавно выпущенной линейке EPYC Milan-X максимальный объем составляет 768 МБ, организованных на нескольких уровнях иерархии памяти . В общем, чем больше кэш, тем выше производительность из-за уменьшения простоев.
Кэши и конвейеры идеально подходили друг другу. Раньше не имело особого смысла строить конвейер, который мог бы работать быстрее, чем задержка доступа внешней памяти. Использование кэш-памяти на кристалле вместо этого означало, что конвейер мог работать со скоростью задержки доступа к кэшу, гораздо меньшее время. Это позволяло рабочим частотам процессоров увеличиваться гораздо быстрее, чем у внешней памяти.
Одним из препятствий для достижения более высокой производительности с помощью параллелизма на уровне инструкций являются остановки конвейера и сбросы из-за ветвлений. Обычно неизвестно, будет ли выполнен условный переход, до поздней стадии конвейера, поскольку условные переходы зависят от результатов, поступающих из регистра. С того момента, как декодер инструкций процессора выяснил, что он столкнулся с инструкцией условного перехода, до момента, когда можно считать значение регистра принятия решения, конвейер необходимо остановить на несколько циклов, или, если это не так и переход выполнен, конвейер необходимо очистить. По мере увеличения тактовой частоты увеличивается глубина конвейера, и некоторые современные процессоры могут иметь 20 стадий или более. В среднем каждая пятая выполненная инструкция является ветвью, поэтому без какого-либо вмешательства это большое количество простоев.
Такие методы, как предсказание ветвлений и спекулятивное выполнение, используются для уменьшения этих штрафов за ветвления. Предсказание ветвлений — это когда оборудование делает обоснованные предположения о том, будет ли взята конкретная ветвь. В действительности одна или другая сторона ветвления будет вызываться гораздо чаще, чем другая. Современные разработки имеют довольно сложные статистические системы прогнозирования, которые отслеживают результаты прошлых ветвлений, чтобы предсказать будущее с большей точностью. Предположение позволяет оборудованию предварительно выбирать инструкции, не дожидаясь чтения регистра. Спекулятивное выполнение — это дальнейшее усовершенствование, при котором код вдоль предсказанного пути не просто предварительно выбирает, но и выполняется до того, как станет известно, следует ли брать ветвь или нет. Это может обеспечить лучшую производительность, если предположение хорошее, с риском огромного штрафа, если предположение плохое, потому что инструкции необходимо отменить.
Даже при всей дополнительной сложности и вентилях, необходимых для поддержки концепций, описанных выше, усовершенствования в производстве полупроводников вскоре позволили использовать еще больше логических вентилей.
В схеме выше процессор обрабатывает части одной инструкции за раз. Компьютерные программы могли бы выполняться быстрее, если бы несколько инструкций обрабатывались одновременно. Этого достигают суперскалярные процессоры, копируя функциональные блоки, такие как АЛУ. Копирование функциональных блоков стало возможным только тогда, когда площадь кристалла процессора с одной задачей больше не выходила за пределы того, что можно было надежно изготовить. К концу 1980-х годов на рынок начали выходить суперскалярные конструкции.
В современных конструкциях обычно встречаются два блока загрузки, один блок сохранения (многие инструкции не имеют результатов для сохранения), два или более целочисленных математических блока, два или более блока с плавающей точкой и часто блок SIMD какого-либо вида. Логика выдачи инструкций усложняется за счет считывания огромного списка инструкций из памяти и передачи их различным исполнительным блокам, которые в этот момент простаивают. Затем результаты собираются и переупорядочиваются в конце.
Добавление кэшей снижает частоту или продолжительность простоев из-за ожидания извлечения данных из иерархии памяти, но не избавляет от этих простоев полностью. В ранних разработках промах кэша заставлял контроллер кэша останавливать процессор и ждать. Конечно, в программе может быть какая-то другая инструкция, данные которой доступны в кэше в этот момент. Выполнение вне очереди позволяет обрабатывать готовую инструкцию, пока более старая инструкция ждет в кэше, а затем переупорядочивает результаты, чтобы казалось, что все произошло в запрограммированном порядке. Этот метод также используется для предотвращения других простоев из-за зависимости операндов, таких как инструкция, ожидающая результата от операции с плавающей точкой с большой задержкой или других многоцикловых операций.
Переименование регистров относится к технике, используемой для избежания ненужного последовательного выполнения инструкций программы из-за повторного использования тех же регистров этими инструкциями. Предположим, у нас есть две группы инструкций, которые будут использовать один и тот же регистр . Один набор инструкций выполняется первым, чтобы оставить регистр другому набору, но если другой набор назначен другому похожему регистру, оба набора инструкций могут быть выполнены параллельно (или) последовательно.
Архитекторы компьютеров оказались в тупике из-за растущего несоответствия рабочих частот ЦП и времени доступа к DRAM . Ни одна из методик, которые использовали параллелизм на уровне инструкций (ILP) в пределах одной программы, не могла компенсировать длительные простои, которые возникали, когда данные приходилось извлекать из основной памяти. Кроме того, большое количество транзисторов и высокие рабочие частоты, необходимые для более продвинутых методик ILP, требовали уровней рассеивания мощности, которые больше нельзя было дешево охлаждать. По этим причинам новые поколения компьютеров начали использовать более высокие уровни параллелизма, которые существуют за пределами одной программы или программного потока .
Эту тенденцию иногда называют вычислением пропускной способности . Эта идея возникла на рынке мэйнфреймов, где обработка онлайн-транзакций подчеркивала не только скорость выполнения одной транзакции, но и способность справляться с огромным количеством транзакций. С учетом того, что за последнее десятилетие значительно возросло число приложений, основанных на транзакциях, таких как сетевая маршрутизация и обслуживание веб-сайтов, компьютерная индустрия вновь подчеркнула проблемы емкости и пропускной способности.
Один из методов достижения этого параллелизма — многопроцессорные системы, компьютерные системы с несколькими ЦП. Некогда зарезервированные для мощных мэйнфреймов и суперкомпьютеров , маломасштабные (2–8) многопроцессорные серверы стали обычным явлением для рынка малого бизнеса. Для крупных корпораций широкомасштабные (16–256) многопроцессорные серверы являются обычным явлением. Даже персональные компьютеры с несколькими ЦП появились с 1990-х годов.
С дальнейшим уменьшением размера транзистора, ставшим доступным благодаря достижениям полупроводниковой технологии, появились многоядерные процессоры , в которых несколько процессоров реализованы на одном кремниевом кристалле. Первоначально использовались в чипах, ориентированных на встраиваемые рынки, где более простые и меньшие процессоры позволяли бы нескольким экземплярам размещаться на одном куске кремния. К 2005 году полупроводниковая технология позволила производить в больших объемах двойные высокопроизводительные настольные процессоры CMP- чипы. Некоторые конструкции, такие как UltraSPARC T1 от Sun Microsystems , вернулись к более простым (скалярным, упорядоченным) конструкциям, чтобы разместить больше процессоров на одном куске кремния.
Другой метод, который стал более популярным в последнее время, — это многопоточность . При многопоточности, когда процессор должен извлечь данные из медленной системной памяти, вместо того, чтобы ждать поступления данных, процессор переключается на другую программу или программный поток, готовый к выполнению. Хотя это не ускоряет конкретную программу/поток, это увеличивает общую пропускную способность системы за счет сокращения времени простоя ЦП.
Концептуально многопоточность эквивалентна переключению контекста на уровне операционной системы. Разница в том, что многопоточный ЦП может выполнить переключение потока за один цикл ЦП вместо сотен или тысяч циклов ЦП, которые обычно требуются для переключения контекста. Это достигается путем репликации аппаратного обеспечения состояния (например, файла регистра и счетчика программ ) для каждого активного потока.
Дальнейшим усовершенствованием является одновременная многопоточность . Эта технология позволяет суперскалярным процессорам выполнять инструкции из разных программ/потоков одновременно в одном и том же цикле.
Комментарии по компьютерной архитектуре и организации: Компьютерная архитектура является ключевым компонентом компьютерной инженерии, и практикующий компьютерный инженер должен иметь практическое понимание этой темы...