Введение
В компьютерной архитектуре переименование регистров — это техника, которая абстрагирует логические регистры от физических. Каждый логический регистр имеет связанный с ним набор физических регистров. Когда инструкция машинного кода обращается к конкретному логическому регистру, процессор динамически сопоставляет ему один из физических регистров. Физические регистры непрозрачны и не могут быть адресованы напрямую, а только через свои канонические имена. Эта техника используется для устранения ложных зависимостей по данным, возникающих при повторном использовании регистров последовательными инструкциями, между которыми нет реальных зависимостей по данным. Устранение этих ложных зависимостей выявляет больший параллелизм на уровне инструкций в потоке инструкций, который может быть использован различными и взаимодополняющими методами, такими как суперскалярное и внеочередное исполнение, для повышения производительности.
Подход к проблеме
Программы состоят из инструкций, которые оперируют значениями. Инструкции должны указывать эти значения, чтобы различать их друг от друга. Типичная инструкция может выглядеть так: сложить и и поместить результат в . В этой инструкции, , и – это имена ячеек памяти. Часто значения, с которыми проводятся операции, используются несколько раз подряд. Регистровые машины используют это, вводя ряд процессорных регистров – высокоскоростных областей памяти, которые хранят эти значения. Инструкции, использующие регистры в качестве промежуточных значений, выполняются значительно быстрее, чем те, которые обращаются к основной памяти. Это повышение производительности является ключевым элементом в архитектуре процессоров RISC, которые используют регистры для всех основных математических и логических инструкций. Совокупность регистров в конкретной реализации известна как регистровая память. Отдельные регистры в этой памяти адресуются по номеру в машинном коде. Кодирование номера в машинном коде требует нескольких бит. Например, в Zilog Z80 было восемь регистров общего назначения в регистровой памяти. Для выбора одного из восьми значений требуется три бита, поскольку 2³ = 8. Увеличение количества регистров в памяти приводит к повышению производительности, так как в памяти можно хранить больше временных значений, избегая тем самым дорогостоящих операций сохранения или загрузки из памяти. Как правило, более современные процессоры и процессоры с более длинными командами используют больше регистров, когда это возможно. Например, архитектура набора команд x86 имеет 8 регистров общего назначения, x86 64 – 16, многие RISC – 32, а IA 64 – 128. Преимущества большой регистровой памяти компенсируются необходимостью использовать больше бит для кодирования номера регистра. Например, в системе, использующей 32-битные инструкции, может потребоваться три регистра для выполнения операций типа = . Если регистровая память содержит 32 элемента, для каждой ссылки потребуется 5 бит, а набор из трех регистров займет 15 бит, оставляя 17 бит для кодирования операции и другой информации. Расширение регистровой памяти до 64 элементов потребует 6 бит, что в сумме составляет 18 бит. Хотя это может привести к более высокой производительности, это также означает, что для кодирования инструкции остается меньше бит. Это приводит к необходимости балансировать размер регистровой памяти с количеством возможных инструкций.
Файл реестра с индексацией тегов
Это стиль переименования, используемый в MIPS R10000, Alpha 21264 и в FP-секции AMD Athlon. На этапе переименования каждый архитектурный регистр, к которому происходит обращение (для чтения или записи), ищется в файле переназначения, индексированном по архитектурным регистрам. Этот файл возвращает тег и бит готовности. Тег считается не готовым, если в очереди есть инструкция, которая запишет в него данные, но еще не выполнена. Для операндов чтения этот тег заменяет архитектурный регистр в инструкции. Для каждой записи в регистр новый тег извлекается из FIFO свободных тегов, и новое соответствие записывается в файл переназначения, чтобы последующие инструкции, читающие архитектурный регистр, обращались к этому новому тегу. Тег помечается как не готовый, поскольку инструкция еще не выполнена. Предыдущий физический регистр, выделенный для этого архитектурного регистра, сохраняется вместе с инструкцией в буфере переупорядочивания – FIFO, хранящем инструкции в порядке их следования по программе между этапами декодирования и завершения. Затем инструкции помещаются в различные очереди выдачи. По мере выполнения инструкций теги их результатов транслируются, и очереди выдачи сопоставляют эти теги с тегами не готовых исходных операндов. Совпадение означает, что операнд готов. Файл переназначения также сопоставляет эти теги, чтобы отметить соответствующие физические регистры как готовые. Когда все операнды инструкции в очереди выдачи готовы, эта инструкция готова к выдаче. Очереди выдачи выбирают готовые инструкции для отправки в различные функциональные блоки на каждом цикле. Не готовые инструкции остаются в очередях. Этот неупорядоченный выбор инструкций из очередей может приводить к их увеличению и повышенному энергопотреблению. Выданные инструкции считываются из файла физических регистров, индексированного по тегам (с обходом только транслируемых операндов), а затем выполняются. Результаты выполнения записываются в файл физических регистров, индексированный по тегам, а также транслируются в сеть обхода, расположенную перед каждым функциональным блоком. На этапе завершения предыдущий тег для записанного архитектурного регистра помещается в очередь свободных тегов, чтобы его можно было повторно использовать для вновь декодированной инструкции. Исключение или неверное предсказание ветвления приводит к откату файла переназначения к состоянию переназначения на момент последней выполненной инструкции, используя комбинацию снимков состояния и последовательного просмотра предыдущих тегов в очереди предварительного завершения. Поскольку этот механизм необходим и может восстановить любое состояние переназначения (а не только состояние перед инструкцией, находящейся в процессе завершения), неверные предсказания ветвлений могут быть обработаны до этапа завершения ветвления, потенциально скрывая задержку, вызванную неверным предсказанием.
Станции резервирования
Это стиль, использованный в целочисленной части архитектур AMD K7 и K8. На этапе переименования каждый архитектурный регистр, к которому осуществляется доступ для чтения, ищется как в архитектурно-индексированном файле предсказаний (future file), так и в файле переименования. Файл предсказаний предоставляет значение этого регистра, если ещё нет инструкций, ожидающих записи в него (то есть, он готов). Когда инструкция помещается в очередь выдачи, значения, прочитанные из файла предсказаний, записываются в соответствующие ячейки станций резервирования. Запись в регистр в инструкции приводит к записи нового, не готового тега в файл переименования. Номер тега обычно назначается последовательно в порядке инструкций – дополнительная очередь свободных тегов не требуется. Как и в схеме с индексацией по тегам, очереди выдачи ожидают не готовых операндов, чтобы увидеть соответствующие широковещательные сигналы тегов. В отличие от схемы с индексацией по тегам, совпадающие теги приводят к записи соответствующего широковещательного значения в ячейку станции резервирования в очереди выдачи. Выданные инструкции читают свои аргументы из станции резервирования, обходят только операнды, полученные по широковещанию, и затем выполняются. Как упоминалось ранее, файлы регистров на станциях резервирования обычно небольшие, возможно, всего восемь ячеек. Результаты выполнения записываются в буфер переупорядочивания, на станции резервирования (если в очереди выдачи есть соответствующий тег) и в файл предсказаний, если это последняя инструкция, обращающаяся к данному архитектурному регистру (в этом случае регистр помечается как готовый). Завершение (graduation) копирует значение из буфера переупорядочивания в архитектурный файл регистров. Единственное назначение архитектурного файла регистров – восстановление после исключений и неправильных предсказаний переходов. Исключения и неправильные предсказания переходов, обнаруженные при завершении, приводят к копированию архитектурного файла в файл предсказаний и помечают все регистры как готовые в файле переименования. Обычно невозможно восстановить состояние файла предсказаний для какой-либо промежуточной инструкции между декодированием и завершением, поэтому обычно нет возможности быстрого восстановления после неправильных предсказаний переходов.
Сравнение схем
В обеих схемах инструкции вставляются в очереди в порядке поступления, но удаляются вне порядка. Если очереди не объединяют пустые слоты, то они либо будут содержать много неиспользуемых ячеек, либо потребуют некоторого вида кодирования приоритетов с переменным значением, чтобы несколько инструкций могли быть готовы к выполнению одновременно. Очереди, которые объединяют пустые слоты, имеют более простое кодирование приоритетов, но требуют простой, но большой схемы для продвижения инструкций по очереди. Станции резервирования обеспечивают меньшую задержку от переименования до выполнения, поскольку этап переименования находит значения регистров напрямую, а не физический номер регистра, а затем использует его для поиска значения. Эта задержка проявляется как компонент задержки при неверном предсказании ветвления. Станции резервирования также обеспечивают меньшую задержку от выдачи инструкции до выполнения, поскольку каждый локальный регистровый файл меньше, чем большой центральный файл схемы с индексацией тегов. Генерация тегов и обработка исключений также проще в схеме станций резервирования, как обсуждается ниже. Физические регистровые файлы, используемые станциями резервирования, обычно объединяют неиспользуемые ячейки параллельно с очередью, которую они обслуживают, что делает эти регистровые файлы больше в целом, потребляет больше энергии и сложнее, чем более простые регистровые файлы, используемые в схеме с индексацией тегов. Более того, в каждую ячейку каждой станции резервирования может записываться каждый шина результатов, поэтому станция резервирования с, например, 8 ячейками очереди выдачи на функциональный блок обычно будет иметь в 9 раз больше обходных сетей, чем эквивалентная станция с индексацией тегов. Следовательно, пересылка результатов потребляет гораздо больше энергии и площади, чем в схеме с индексацией тегов. Кроме того, схема станций резервирования имеет четыре места (Будущий файл, Станция резервирования, Буфер повторного упорядочивания и Архитектурный файл), где может храниться результирующее значение, в то время как схема с индексацией тегов имеет только одно (физический регистровый файл). Поскольку результаты от функциональных блоков, транслируемые во все эти места хранения, должны достигать гораздо большего числа мест в машине, чем в схеме с индексацией тегов, эта функция потребляет больше энергии, площади и времени. Тем не менее, в машинах, оснащенных очень точными схемами предсказания ветвлений, и если задержки выполнения имеют решающее значение, станции резервирования могут работать удивительно хорошо.