stringtranslate.com

Зарегистрировать переименование

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

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

Проблемный подход

В регистровой машине программы состоят из инструкций, которые оперируют значениями. Инструкции должны называть эти значения, чтобы отличать их друг от друга. Типичная инструкция может гласить: «добавить и вставить результат ». В этой инструкции , и — названия мест хранения.

Чтобы обеспечить компактное кодирование команд, большинство наборов команд процессора имеют небольшой набор специальных мест, к которым можно обращаться по специальным именам: регистры. Например, архитектура набора команд x86 имеет 8 целочисленных регистров, x86-64 — 16, многие RISC — 32, а IA-64 — 128. В процессорах меньшего размера имена этих мест соответствуют непосредственно элементам файла регистров .

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

Рассмотрим этот фрагмент кода, работающий на вышедшем из строя процессоре:

r1 м [ 1024 ]  г1 г1 + 2    м [ 1032 ] r1  r1 м [ 2048 ]  г1 г1 + 4    м [ 2056 ] r1  

Инструкции в последних трех строках не зависят от первых трех инструкций, но процессор не может завершить работу, пока не будет выполнено предыдущее (в противном случае будет записано неправильное значение).r1  m[2048]m[1032]  r1

Это ограничение устраняется изменением названий некоторых регистров:

r1 м [ 1024 ]  г1 г1 + 2    м [ 1032 ] r1  r2 м [ 2048 ]  г2 г2 + 4    м [ 2056 ] r2  

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

Многие высокопроизводительные процессоры реализуют это переименование аппаратно для достижения дополнительного параллелизма. На объектах без соответствующего обнаружения потока данных хорошие компиляторы обнаруживают независимые последовательности инструкций и выбирают разные регистры во время генерации кода .

Опасности данных

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

Чтение после записи (RAW)
чтение из регистра или ячейки памяти должно возвращать значение, помещенное туда последней записью в программном порядке, а не какую-либо другую запись. Это называется истинной зависимостью или зависимостью потока и требует, чтобы инструкции выполнялись в программном порядке.
Запись после записи (WAW)
последующие записи в определенный регистр или ячейку памяти должны оставить эту ячейку, содержащую результат второй записи. Эту проблему можно решить путем сжатия (также известного как отмена, аннулирование или обсуждение) первой записи, если это необходимо. Зависимости WAW также известны как выходные зависимости .
Запись после чтения (ВОЙНА)
чтение из регистра или ячейки памяти должно возвращать последнее предшествующее значение, записанное в эту ячейку, а не записанное программно после чтения. Это своего рода ложная зависимость , которую можно устранить путем переименования. Зависимости WAR также известны как антизависимости .

Вместо того, чтобы откладывать запись до завершения всех операций чтения, можно сохранить две копии местоположения: старое значение и новое значение. Операции чтения, которые в программном порядке предшествуют записи нового значения, могут обеспечиваться старым значением, даже если другие операции чтения, следующие за записью, обеспечиваются новым значением. Ложная зависимость разрушается и создаются дополнительные возможности для внеочередного выполнения. Когда все операции чтения, которым требуется старое значение, удовлетворены, его можно отбросить. Это основная концепция переименования регистров.

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

Ячейки памяти также можно переименовывать, хотя обычно это не делается в той степени, в которой это практикуется при переименовании регистров. Закрытый буфер хранения процессора Transmeta Crusoe представляет собой форму переименования памяти.

Если бы программы воздерживались от немедленного повторного использования регистров, не было бы необходимости в переименовании регистров. Именно по этой причине некоторые наборы команд (например, IA-64 ) определяют очень большое количество регистров. Однако у этого подхода есть ограничения:

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

Архитектурные и физические регистры

Программы на машинном языке определяют чтение и запись в ограниченный набор регистров, определенный архитектурой набора команд (ISA). Например, Alpha ISA определяет 32 целочисленных регистра шириной 64 бита каждый и 32 регистра с плавающей запятой шириной 64 бита каждый. Это архитектурные регистры. Программы, написанные для процессоров, выполняющих набор инструкций Alpha, будут определять операции чтения и записи этих 64 регистров. Если программист останавливает программу в отладчике, он может наблюдать за содержимым этих 64 регистров (и нескольких регистров состояния), чтобы определить ход работы машины.

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

Следующий текст описывает два стиля переименования регистров, которые отличаются схемой, которая удерживает данные готовыми для исполнительного устройства.

Во всех схемах переименования машина преобразует архитектурные регистры, на которые имеются ссылки в потоке команд, в теги. Если архитектурные регистры могут быть указаны от 3 до 5 бит, то теги обычно представляют собой числа от 6 до 8 бит. Файл переименования должен иметь порт чтения для каждого входа каждой инструкции, переименовываемой в каждом цикле, и порт записи для каждого выхода каждой инструкции, переименовываемой в каждом цикле. Поскольку размер файла регистров обычно увеличивается пропорционально квадрату числа портов, файл переименования обычно физически велик и потребляет значительную мощность.

В стиле файла регистров, индексированных по тегам , существует один большой файл регистров для значений данных, содержащий по одному регистру для каждого тега. Например, если машина имеет 80 физических регистров, то она будет использовать 7-битные теги. 48 из возможных значений тега в этом случае не используются.

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

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

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

Файл архитектурного реестра или файл реестра выбытия (RRF)
Зафиксированное состояние регистра машины. ОЗУ индексируется по номеру логического регистра. Обычно записывается, когда результаты удаляются или фиксируются из буфера переупорядочения.
Будущий файл
Наиболее спекулятивное состояние регистра машины. ОЗУ индексируется по номеру логического регистра.
Активный файл реестра
Термин группы Intel P6 для обозначения будущего файла.
Буфер истории
Обычно используется в сочетании с будущим файлом. Содержит «старые» значения регистров, которые были перезаписаны. Если производитель все еще находится в работе, он может быть проиндексирован в ОЗУ по номеру буфера истории. После неправильного предсказания ветвления необходимо использовать результаты из буфера истории — либо они копируются, либо поиск будущих файлов отключается, а буфер истории представляет собой память с адресацией по содержимому (CAM), индексируемую по номеру логического регистра.
Буфер переупорядочения (ROB)
Структура, которая последовательно (циклически) индексируется для каждой операции для инструкций в полете. Он отличается от буфера истории, поскольку буфер переупорядочения обычно располагается после файла будущего (если он существует) и перед файлом архитектурного регистра.
Буферы переупорядочения могут быть без данных или с полным объемом данных.
В ROB Уилламетта записи ROB указывают на регистры в файле физических регистров (PRF), а также содержат другую бухгалтерскую информацию.
Это также был первый дизайн «Не в порядке», выполненный Энди Глю из Иллинойса совместно с HaRRM.
ROB P6, записи ROB содержат данные; отдельного PRF нет.
Значения данных из ROB копируются из ROB в RRF при выводе из эксплуатации.
Одна маленькая деталь: если в записях ROB есть временная локальность (т. е. если инструкции расположены близко друг к другу в последовательности команд фон Неймана, они записывают обратно близко друг к другу во времени), возможно, можно выполнить объединение записей записей ROB и, таким образом, иметь меньше портов, чем отдельный ROB/PRF будет).
Неясно, имеет ли это значение, поскольку PRF необходимо хранить в банке.
ROB обычно не имеют ассоциативной логики, и уж точно ни один из ROB, разработанных Энди Глю, не имеет CAM.
Кейт Дифендорф на протяжении многих лет настаивал на том, что ROB имеют сложную ассоциативную логику.
Первое предложение ROB, возможно, имело CAM.

Регистровый файл, индексированный по тегам

Этот стиль переименования используется в MIPS R10000 , Alpha 21264 и в разделе FP AMD Athlon .

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

Инструкции затем помещаются в различные очереди выдачи . По мере выполнения инструкций теги их результатов передаются широковещательно, и очереди задач сопоставляют эти теги с тегами их неготовых исходных операндов. Соответствие означает, что операнд готов. Файл переназначения также соответствует этим тегам, чтобы можно было пометить соответствующие физические регистры как готовые. Когда все операнды инструкции в очереди выполнения готовы, эта инструкция готова к выполнению. Очереди задач выбирают готовые инструкции для отправки различным функциональным блокам в каждом цикле. Неготовые инструкции остаются в очередях выдачи. Такое неупорядоченное удаление инструкций из очередей задач может сделать их большими и энергозатратными.

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

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

Станции бронирования

Этот стиль используется в разделе целых чисел в конструкциях AMD K7 и K8.

На этапе переименования каждый архитектурный регистр, на который ссылаются при чтении, просматривается как в архитектурно-индексированном будущем файле , так и в файле переименования. Будущее чтение файла дает значение этого регистра, если еще нет невыполненной инструкции для записи в него (т. е. он готов). Когда инструкция помещается в очередь выдачи, значения, считанные из будущего файла, записываются в соответствующие записи на станциях резервирования. Запись регистра в инструкции приводит к записи нового, неготового тега в файл переименования. Номер тега обычно присваивается последовательно в порядке инструкций — FIFO свободных тегов не требуется.

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

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

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

Градация копирует значение из буфера переупорядочения в файл архитектурного регистра. Единственное использование файла архитектурного регистра — восстановление исключений и неправильных предсказаний ветвей.

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

Сравнение схем

В обеих схемах инструкции вставляются в очереди выполнения по порядку, но удаляются не по порядку. Если очереди не сжимают пустые слоты, то в них либо будет много неиспользуемых записей, либо потребуется какое-то кодирование с переменным приоритетом, когда несколько инструкций одновременно готовы к работе. Очереди, которые схлопывают дыры, имеют более простое кодирование приоритетов, но требуют простой, но большой схемы для продвижения инструкций по очереди.

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

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

Файлы физических регистров, используемые станциями резервирования, обычно сжимают неиспользуемые записи параллельно с очередью выдачи, которую они обслуживают, что в совокупности увеличивает размер этих файлов регистров, потребляет больше энергии и усложняет их, чем более простые файлы регистров, используемые в схеме индексации тегов. . Хуже того, каждая запись на каждой станции резервирования может быть записана каждой результирующей шиной, так что машина станции резервирования, например, с 8 записями очереди задач на функциональный блок, обычно будет иметь в 9 раз больше обходных сетей, чем эквивалентная машина, индексированная по тегам. машина. Следовательно, пересылка результатов потребляет гораздо больше энергии и места, чем в схеме с индексацией тегов.

Кроме того, схема станции резервирования имеет четыре места (Файл будущего, Станция резервирования, Буфер переупорядочения и Архитектурный файл), в которых может храниться результирующее значение, тогда как схема с индексацией тегов имеет только одно (файл физического регистра). Поскольку результаты функциональных блоков, передаваемые во все эти места хранения, должны достигать гораздо большего числа мест в машине, чем в схеме с индексацией тегов, эта функция потребляет больше энергии, площади и времени. Тем не менее, на машинах, оснащенных очень точными схемами прогнозирования ветвей, и если задержки выполнения являются серьезной проблемой, станции резервирования могут работать удивительно хорошо.

История

IBM System/360 Model 91 была первой машиной, поддерживавшей выполнение инструкций вне порядка; здесь использовался алгоритм Томасуло , использующий переименование регистров.

POWER1 — первый микропроцессор , который использовал переименование регистров и выполнение вне очереди в 1990 году .

В исходной конструкции R10000 не было ни схлопывающихся очередей задач, ни кодирования с переменным приоритетом, и в результате возникали проблемы с голоданием - самая старая инструкция в очереди иногда не выполнялась до тех пор, пока декодирование обеих инструкций полностью не прекращалось из-за отсутствия регистров переименования, а все остальные инструкции не выполнялись. был выпущен. В более поздних версиях конструкции, начиная с R12000 , для решения этой проблемы использовался энкодер с частично изменяемым приоритетом.

Ранние вышедшие из строя машины не разделяли функции переименования и хранения ROB/PRF. В этом отношении некоторые из первых, такие как RUU компании Sohi или Metaflow DCAF, объединяли планирование, переименование и хранение в одной и той же структуре.

Большинство современных машин переименовывают, индексируя в ОЗУ таблицу сопоставления с номером логического регистра. Например, P6 сделал это; будущие файлы делают это и хранят данные в той же структуре.

Однако более ранние машины использовали в переименовании память, адресуемую по содержимому (CAM). Например, HPSM RAT или таблица псевдонимов регистров по существу использовала CAM для номера логического регистра в сочетании с различными версиями регистра.

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

Микроархитектура P6 была первой микроархитектурой Intel, реализовавшей как внеочередное выполнение, так и переименование регистров. Микроархитектура P6 использовалась в микропроцессорах Pentium Pro, Pentium II, Pentium III, Pentium M, Core и Core 2. Cyrix M1 , выпущенный 2 октября 1995 года [1] , был первым процессором x86, который использовал переименование регистров и выполнение вне очереди. Другие процессоры x86 (такие как NexGen Nx686 и AMD K5 ), выпущенные в 1996 году, также отличались переименованием регистров и внеочередным выполнением RISC -операций (вместо собственных инструкций x86). [2] [3]

Рекомендации

  1. ^ «Процессор Cyrix 6x86» .
  2. ^ "NexGen Nx686" .
  3. ^ "PC Mag, 6 декабря 1994 г." Зифф Дэвис. 06.12.1994.