stringtranslate.com

Регистрационный файл

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

Современные регистровые файлы на основе интегральных схем обычно реализуются посредством быстрых статических ОЗУ с несколькими портами. Такие ОЗУ отличаются наличием выделенных портов чтения и записи, тогда как обычные многопортовые SRAM обычно считывают и записывают через одни и те же порты. Банкинг регистров — это метод использования одного имени для доступа к нескольким различным физическим регистрам в зависимости от режима работы.

Переключение регистра-банка

Файлы регистров могут быть объединены в банки регистров. [1] Процессор может иметь более одного банка регистров.

Процессоры ARM имеют как банковские, так и небанковские регистры. В то время как все режимы всегда используют одни и те же физические регистры для первых восьми регистров общего назначения, от R0 до R7, физический регистр, на который указывают банковские регистры, от R8 до R14, зависит от рабочего режима, в котором находится процессор. [2] Примечательно, что режим быстрого запроса прерывания (FIQ) имеет свой собственный банк регистров для R8 до R12, а архитектура также предоставляет частный указатель стека (R13) для каждого режима прерывания.

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

MODCOMP и более поздние процессоры , совместимые с 8051, используют биты в слове состояния программы для выбора текущего активного банка регистров.

Выполнение

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

Регистровые файлы имеют одну строку слов на запись на порт, одну битовую линию на бит ширины на порт чтения и две битовые линии на бит ширины на порт записи. Каждая битовая ячейка также имеет Vdd и Vss. Таким образом, площадь шага проводов увеличивается как квадрат числа портов, а площадь транзистора увеличивается линейно. [3] В какой-то момент может быть меньше и/или быстрее иметь несколько избыточных регистровых файлов с меньшим числом портов чтения, чем один регистровый файл со всеми портами чтения. Например, целочисленный блок MIPS R8000 имел 9-считывающий 4-записывающий порт 32-записывающий 64-битный регистровый файл, реализованный в 0,7 мкм процессе, что можно было увидеть, глядя на чип с расстояния вытянутой руки.

Два популярных подхода к разделению регистров на несколько регистровых файлов — это распределенная конфигурация регистрового файла и секционированная конфигурация регистрового файла. [3]

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

Ширина регистрового файла в битах обычно равна числу бит в процессорном слове size . Иногда она немного шире, чтобы прикрепить «дополнительные» биты к каждому регистру, например, бит отравления. Если ширина слова данных отличается от ширины адреса — или в некоторых случаях, например, 68000 , даже если они имеют одинаковую ширину — регистры адреса находятся в отдельном регистровом файле, нежели регистры данных.

Декодер

Множество

Типичный регистровый файл — «трехпортовый», способный одновременно считывать данные из двух регистров и записывать данные в один регистр — состоит из таких битовых ячеек.

Базовая схема для битовой ячейки:

Возможны многочисленные оптимизации:

Микроархитектура

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

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

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

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

Например, Alpha 21264 (EV6) была первой крупной микроархитектурой, реализовавшей «архитектуру теневого регистрового файла». Она имела две копии целочисленного регистрового файла и две копии регистра с плавающей точкой, расположенные в ее передней части (будущий и масштабируемый файл, каждый из которых содержал 2 порта чтения и 2 порта записи), и требовала дополнительного цикла для распространения данных между ними во время переключения контекста. Логика выдачи пыталась сократить количество операций, пересылающих данные между ними, и значительно улучшила ее целочисленную производительность, а также помогла уменьшить влияние ограниченного количества регистров общего назначения в суперскалярных архитектурах со спекулятивным выполнением. Эта конструкция была позже адаптирована SPARC , MIPS и некоторыми из более поздних реализаций x86.

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

SPARC также использует «архитектуру теневого регистрового файла» для своей высокопроизводительной линейки. Он имеет до 4 копий целочисленных регистровых файлов (будущих, отменённых, масштабируемых и стираемых, каждый из которых содержит 7 портов чтения и 4 порта записи) и 2 копии регистрового файла с плавающей точкой. Однако, в отличие от Alpha и x86, они расположены в бэкэнде как отменяемый блок сразу после блока с нарушением порядка и переименования регистровых файлов. Теневые регистры не загружают инструкции во время этапов извлечения и декодирования инструкций, и переключение контекста в этой конструкции не требуется.

IBM использует тот же механизм, что и многие основные микропроцессоры, глубоко объединяя регистровый файл с декодером, но его регистровые файлы работают независимо от стороны декодера и не включают переключение контекста, что отличается от Alpha и x86. Большинство его регистровых файлов не только обслуживают его выделенный декодер, но и обслуживают вплоть до уровня потока. Например, POWER8 имеет до 8 декодеров инструкций, но до 32 регистровых файлов по 32 регистра общего назначения каждый (4 порта чтения и 4 порта записи) для облегчения одновременной многопоточности , поскольку его параллельные инструкции не могут использоваться в любом другом регистровом файле из-за отсутствия переключения контекста.

В линейке процессоров x86 типичный процессор до 486 не имел отдельного файла регистров, поскольку все регистры общего назначения работали напрямую с декодером, а стек x87 push был расположен внутри самого блока с плавающей точкой. Начиная с Pentium , типичный процессор x86, совместимый с Pentium, интегрирован с одной копией файла регистров архитектуры с одним портом, содержащего 6 регистров общего назначения, 4 регистра управления, 8 регистров отладки (два зарезервированы), 1 регистр указателя стека, 1 базовый регистр стека, 1 указатель инструкций, 1 регистр флагов и 6 сегментных регистров.

Процессоры не имели выделенных регистров для MMX , поэтому Intel вместо этого использовала стек push x87. Однако это привело к тому, что FPU стал непригоден для использования при использовании MMX , и процессору пришлось выполнять инструкции самостоятельно. На P6 инструкция может независимо храниться и выполняться параллельно на ранних этапах конвейера перед декодированием в микрооперации и переименованием при выполнении вне очереди. Начиная с P6 , все файлы регистров не требуют дополнительного цикла для распространения данных, файлы регистров, такие как архитектурные и с плавающей точкой, расположены между буфером кода и декодерами, называются «буфером отсрочки», буфером переупорядочивания и OoOE и соединены внутри кольцевой шины (16 байт). Сам файл регистра по-прежнему остается одним файлом регистра x86 и одним стеком x87, и оба служат для хранения отсрочки. Его файл регистра x86 был расширен до двухпортового, чтобы увеличить пропускную способность для хранения результатов. Регистры, такие как отладочный/условный код/управляющий/безымянный/флаг, были удалены из основного файла регистров и помещены в отдельные файлы между микрокомандным ПЗУ и секвенсором инструкций. Только недоступные регистры, такие как сегментный регистр, теперь отделены от файла регистров общего назначения (за исключением указателя инструкций); теперь они расположены между планировщиком и распределителем инструкций, чтобы облегчить переименование регистров и выполнение вне очереди. Стек x87 был позже объединен с файлом регистров с плавающей точкой после дебюта 128-битного регистра XMM в Pentium III, но файл регистра XMM по-прежнему находится отдельно от файлов целочисленных регистров x86.

Более поздние реализации P6 (Pentium M, Yonah) представили "Архитектуру теневого регистрового файла", которая была расширена до 2 копий двухпортированных целочисленных архитектурных регистровых файлов и состояла из контекстного переключения (между будущим и отставленным файлом и масштабированным файлом с использованием того же трюка, который использовался между целым и плавающей точкой). Это было сделано для того, чтобы решить узкое место регистра, которое существовало в архитектуре x86 после введения слияния микроопераций, но она по-прежнему имеет 8 записей 32-битных архитектурных регистров для общей емкости 32 байта на файл (сегментный регистр и указатель инструкций остаются в файле, хотя они недоступны программе) как спекулятивный файл. Второй файл обслуживается как масштабированный теневой регистровый файл, который без контекстного переключения масштабированный файл не может хранить некоторые инструкции независимо. Некоторые инструкции из SSE2/SSE3/SSSE3 требуют этой функции для целочисленных операций, например, такие инструкции, как PSHUFB, PMADDUBSW, PHSUBW, PHSUBD, PHSUBSW, PHADDW, PHADDD, PHADDSW, требуют загрузки EAX/EBX/ECX/EDX из обоих файлов регистров, хотя процессор x86 редко использовал другой файл регистров с той же инструкцией. В большинстве случаев второй файл обслуживается как файл с удаленной шкалой. Архитектура Pentium M по-прежнему имеет один двухпортовый файл регистров с плавающей точкой (8 записей MM/XMM), общий с тремя декодерами, а файл регистров FP не имеет файла теневых регистров вместе с ним, поскольку его архитектура файла теневых регистров не включала функции с плавающей точкой. В процессорах после P6 файлы архитектурных регистров являются внешними и расположены в бэкэнде процессора после удаленного файла, в отличие от внутреннего файла регистров, расположенного во внутреннем ядре для буфера переименования/переупорядочивания регистров. Однако в Core 2 он теперь размещен в блоке, называемом «таблицей псевдонимов регистров» (RAT), расположенном с распределителем инструкций, но имеющем тот же размер регистра, что и у выведенного на пенсию. Core 2 увеличил внутреннюю кольцевую шину до 24 байт (позволяет декодировать более 3 инструкций) и расширил свой регистровый файл с двухпортового (одно чтение/одна запись) до четырехпортового (два чтения/две записи), регистр по-прежнему остается 8 записей в 32 бита и 32 байта (не включая 6-сегментный регистр и один указатель инструкций, поскольку к ним невозможно получить доступ в файле любым кодом/инструкцией) в общем размере файла и расширен до 16 записей в x64 для общего размера файла 128 байт. Начиная с Pentium M, его порт конвейера и декодер увеличились, но они расположены с таблицей распределителя вместо буфера кода. Его регистровый файл FP XMM также увеличен до четырехпортового (2 чтения/2 записи), регистр по-прежнему содержит 8 записей в 32-битном режиме и расширен до 16 записей в режиме x64, а число записей по-прежнему равно 1, поскольку его архитектура файла теневых регистров не включает функции с плавающей точкой/SSE.

В более поздних реализациях x86, таких как Nehalem и более поздние процессоры, как целочисленные, так и регистры с плавающей точкой теперь включены в унифицированный октапортированный (шесть для чтения и два для записи) файл регистров общего назначения (8 + 8 в 32-битной и 16 + 16 в x64 на файл), в то время как файл регистров расширен до 2 с улучшенной «Архитектурой файла теневых регистров» в фаворитах выполнения гиперпоточности , и каждый поток использует независимые файлы регистров для своего декодера. Позже Sandy Bridge и далее заменили таблицу теневых регистров и архитектурные регистры гораздо большим и еще более продвинутым физическим файлом регистров перед декодированием в буфер переупорядочивания. Randered, что Sandy Bridge и далее больше не несут архитектурный регистр.

В линейке Atom была современная упрощенная версия P5. Она включает отдельные копии файла регистров, совместно используемых с потоком и декодером. Файл регистров представляет собой двухпортовую конструкцию, 8/16 записей GPRS, 8/16 записей отладочного регистра и 8/16 записей кода состояния интегрированы в один файл. Однако он имеет восемь записей 64-битного теневого регистра и восемь записей 64-битного безымянного регистра, которые теперь отделены от основных GPR в отличие от оригинальной конструкции P5 и расположены после исполнительного устройства, а файл этих регистров является однопортовым и не подвергается инструкциям, как масштабируемый теневой регистровый файл, найденный в Core/Core2 (теневой регистровый файл состоит из архитектурных регистров, а Bonnell не имел его из-за отсутствия «архитектуры теневого регистрового файла»), однако файл можно использовать для переименования из-за отсутствия внеочередного выполнения, обнаруженного в архитектуре Bonnell. Он также имел одну копию файла регистра с плавающей точкой XMM на поток. Отличие от Nehalem в том, что у Bonnell нет единого регистрового файла и нет выделенного регистрового файла для его гиперпоточности. Вместо этого Bonnell использует отдельный регистр переименования для своего потока, несмотря на то, что он не вышел из строя. Подобно Bonnell, Larrabee и Xeon Phi также имеют только один файл регистра общего назначения для целых чисел, но у Larrabee есть до 16 файлов регистров XMM (8 записей на файл), а у Xeon Phi есть до 128 файлов регистров AVX-512, каждый из которых содержит 32 512-битных регистра ZMM для хранения векторных инструкций, которые могут быть такими же большими, как кэш L2.

Есть некоторые другие линейки Intel x86, которые не имеют файла регистра во внутреннем дизайне, Geode GX и Vortex86 и многие встроенные процессоры, которые не являются Pentium -совместимыми или реверс-инжиниринговыми процессорами ранних 80x86. Поэтому большинство из них не имеют файла регистра для своих декодеров, но их GPR используются индивидуально. Pentium 4 (основанный на микроархитектуре NetBurst ), с другой стороны, не имеет файла регистра для своего декодера, поскольку его x86 GPR не существовали в его структуре из-за введения физического унифицированного файла регистра переименования (похожего на Sandy Bridge, но немного отличающегося из-за неспособности Pentium 4 использовать регистр перед наименованием) для попытки заменить архитектурный файл регистра и пропустить схему декодирования x86. Вместо этого он использует SSE для целочисленного выполнения и хранения результата перед АЛУ и после него, SSE2/SSE3/SSSE3 также используют тот же механизм для целочисленных операций.

Ранние разработки AMD , такие как K6, не имеют файла регистра, как Intel, и не поддерживают "Архитектуру теневого файла регистра", поскольку отсутствие контекстного переключателя и обходного инвертора, которые необходимы для правильного функционирования файла регистра, не требуется. Вместо этого они используют отдельные GPR, которые напрямую связаны с таблицей переименования регистров для своего OoOE CPU с выделенным целочисленным декодером и плавающим декодером. Механизм аналогичен линейке процессоров Intel до Pentium. Например, процессор K6 имеет четыре int (один временный файл scratch-регистра с восемью записями + один файл future-регистра с восемью записями + один файл fetched-регистра с восемью записями + один файл unnamed-регистра) и два файла регистров rename FP (два файла x87 ST с восемью записями, один идет fadd и один идет fmov), которые напрямую связаны с его x86 EAX для переименования целых чисел и регистром XMM0 для переименования чисел с плавающей точкой, но позже Athlon включил «теневой регистр» в свой front-end, он масштабируется до 40 записей унифицированного регистрового файла для упорядоченной целочисленной операции перед декодированием, регистровый файл содержит 8 записей scratch-регистра + 16 файлов future-регистров GPR + 16 файлов unnamed-регистров GPR. В более поздних разработках AMD отказывается от дизайна shadow-регистра и отдает предпочтение архитектуре K6 с дизайном прямой связи отдельных GPR. Как и Phenom , он имеет три файла регистров int и два файла регистров SSE, которые расположены в физическом файле регистра, напрямую связанном с GPR. Однако он масштабируется до одного целого числа + одного числа с плавающей точкой на Bulldozer . Как и в ранних разработках AMD, большинство производителей x86, таких как Cyrix, VIA, DM&P и SIS, также использовали тот же механизм, что приводило к отсутствию целочисленной производительности без переименования регистров для их упорядоченных ЦП. Таким компаниям, как Cyrix и AMD, пришлось увеличить размер кэша в надежде сократить узкое место. Целочисленная операция SSE от AMD работает иначе, чем в Core 2 и Pentium 4; она использует свой отдельный целочисленный регистр переименования для загрузки значения непосредственно перед этапом декодирования. Хотя теоретически ему понадобится только более короткий конвейер, чем реализация SSE от Intel, но в целом стоимость предсказания ветвлений намного выше и выше частота пропусков, чем у Intel, и ему потребовалось бы не менее двух циклов для выполнения инструкции SSE независимо от ширины инструкции, поскольку ранние реализации AMD не могли выполнять как FP, так и Int в наборе инструкций SSE, как это делала реализация Intel.

В отличие от Alpha , SPARC и MIPS , которые позволяют загружать/извлекать только один операнд за раз; для достижения супермасштабирования потребуется несколько регистровых файлов. С другой стороны, процессор ARM не интегрирует несколько регистровых файлов для загрузки/извлечения инструкций. ARM GPR не имеют специального назначения для набора инструкций (ARM ISA не требует аккумулятора, индекса и точек стека/базы. Регистры не имеют аккумулятора, а точка базы/стека может использоваться только в режиме большого пальца). Любые GPR могут распространять и хранить несколько инструкций независимо в меньшем размере кода, который достаточно мал, чтобы поместиться в один регистр, а его архитектурный регистр действует как таблица и совместно используется со всеми декодерами/инструкциями с простым переключением банков между декодерами. Основное отличие ARM от других конструкций заключается в том, что ARM позволяет работать на одном и том же регистре общего назначения с быстрым переключением банков без необходимости в дополнительном файле регистров в суперскаляре. Несмотря на то, что x86 использует тот же механизм, что и ARM, в котором GPR могут хранить любые данные по отдельности, x86 столкнется с зависимостью от данных, если будет храниться более трех не связанных между собой инструкций, поскольку GPR на файл слишком малы (восемь в 32-битном режиме и 16 в 64-битном, по сравнению с 13 в 32-битном и 31 в 64-битном режиме ARM) для данных, и невозможно иметь суперскаляр без нескольких файлов регистров для подачи в его декодер (код x86 большой и сложный по сравнению с ARM). Поскольку большинство интерфейсов x86 стали намного больше и намного более прожорливыми, чем процессор ARM, чтобы быть конкурентоспособными (пример: Pentium M и Core 2 Duo, Bay Trail). Некоторые сторонние процессоры, эквивалентные x86, даже стали неконкурентоспособными с ARM из-за отсутствия выделенной архитектуры регистровых файлов. Особенно для AMD, Cyrix и VIA, которые не могут обеспечить никакой разумной производительности без переименования регистров и внеочередного выполнения, что оставляет только Intel Atom единственным процессорным ядром x86 с порядком выполнения в мобильном соревновании. Это было до тех пор, пока процессор x86 Nehalem не объединил и целочисленный регистр, и регистр с плавающей точкой в ​​один файл, и не ввел большую таблицу физических регистров и улучшенную таблицу распределителей в своем интерфейсе перед переименованием в своем неупорядоченном внутреннем ядре.

Переименование регистра

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

Регистрация окон

SPARC ISA определяет окна регистров , в которых 5-битные архитектурные имена регистров фактически указывают на окно в гораздо большем регистровом файле с сотнями записей. Реализация многопортовых регистровых файлов с сотнями записей требует большой площади. Окно регистров сдвигается на 16 регистров при перемещении, так что каждое архитектурное имя регистра может ссылаться только на небольшое количество регистров в большем массиве, например, архитектурный регистр r20 может ссылаться только на физические регистры #20, #36, #52, #68, #84, #100, #116, если в физическом файле всего семь окон.

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

Этот же метод используется в файле отображения переименования регистров R10000 , который хранит 6-битный виртуальный номер регистра для каждого из физических регистров. В файле переименования состояние переименования проверяется всякий раз, когда выполняется переход, так что когда обнаруживается, что переход был предсказан неправильно, старое состояние переименования может быть восстановлено за один цикл. (См. Переименование регистров .)

Смотрите также

Ссылки

  1. ^ Wikibooks: Проектирование микропроцессоров/Файл регистров#Банк регистров.
  2. ^ "ARM Architecture Reference Manual" (PDF) . ARM Limited. Июль 2005 . Получено 13 октября 2021 .
  3. ^ ab Йохан Янссен. «Стратегии компиляции для архитектур с транспортным триггером». 2001. стр. 169. стр. 171-173.
  4. ^ «Энергоэффективные асимметрично портированные регистровые файлы» Аниша Аггарвала и М. Франклина. 2003.

Внешние ссылки