Введение
В компьютерной инженерии окна регистров – это аппаратная особенность, предназначенная для повышения производительности. Она заключается в выделении регистров подпрограмме посредством динамического сопоставления подмножества внутренних регистров фиксированным, видимым программисту регистрам. Окна регистров реализуются для улучшения производительности процессора за счет уменьшения числа операций со стеком, необходимых при вызовах и возвратах из функций. Являясь одной из наиболее значимых особенностей архитектуры Berkeley RISC, они впоследствии были реализованы в архитектурах наборов команд, таких как AMD Am29000, Intel i960, Sun Microsystems SPARC и Intel Itanium.
In computer engineering, register windows are a feature which dedicates registers to a subroutine by dynamically aliasing a subset of internal registers to fixed, programmer visible registers. Register windows are implemented to improve the performance of a processor by reducing the number of stack operations required for function calls and returns. One of the most influential features of the Berkeley RISC design, they were later implemented in instruction set architectures such as AMD Am29000, Intel i960, Sun Microsystems SPARC, and Intel Itanium.
Общая работа
Для различных частей программы предусмотрено несколько наборов регистров. Регистры намеренно скрыты от программиста, чтобы заставить несколько подпрограмм совместно использовать ресурсы процессора. Скрытие регистров может быть реализовано эффективно: процессор определяет переход от одной части программы к другой при вызове процедуры. Это достигается с помощью одного из небольшого числа инструкций (пролога) и завершается одним из аналогично небольшого набора инструкций (эпилога). В архитектуре Беркли при таких вызовах происходит "подмена" нового набора регистров в этот момент, либо они помечаются как "неиспользуемые" (или "пригодные для повторного использования") по окончании вызова.
Применение в процессорах
В дизайне Berkeley RISC программам видны только восемь регистров из общего числа 64. Полный набор регистров известен как регистровый файл, а любой конкретный набор из восьми – как окно. Регистровый файл позволяет до восьми процедурных вызовов иметь собственные наборы регистров. Пока глубина цепочки вызовов не превышает восемь, регистры не требуют сброса в основную память или кэш, что является медленной операцией по сравнению с доступом к регистрам. Для сравнения, архитектура SPARC от Sun Microsystems обеспечивает одновременный доступ к четырем наборам по восемь регистров каждый. Три набора по восемь регистров каждый организованы как "окна". Восемь регистров (i0–i7) формируют входные регистры текущего уровня процедуры. Восемь регистров (L0–L7) являются локальными для текущего уровня процедуры, а восемь регистров (o0–o7) – выходными данными текущего уровня процедуры для следующего вызываемого уровня. При вызове процедуры регистровое окно сдвигается на шестнадцать регистров, скрывая старые входные и локальные регистры и делая старые выходные регистры новыми входными. Общие регистры (старые выходные и новые входные) используются для передачи параметров. Наконец, восемь регистров (g0–g7) глобально видны всем уровням процедур. AMD 29000 улучшила конструкцию, позволив окнам иметь переменный размер, что повышает эффективность использования в типичном случае, когда для вызова требуется менее восьми регистров. Также регистры были разделены на глобальный набор из 64 и дополнительные 128 для окон. Аналогично, архитектура IA 64 (Itanium) использовала окна переменного размера с 32 глобальными регистрами и 96 для окон. В архитектуре Infineon C166 большинство регистров являются, по сути, областями во внутренней оперативной памяти, которые также доступны как регистры. При этом адреса 16 регистров общего назначения (R0–R15) не фиксированы. Вместо этого регистр R0 расположен по адресу, на который указывает регистр "указатель контекста" (CP), а остальные 15 регистров следуют за ним последовательно. Регистровые окна также обеспечивают простой путь для модернизации. Поскольку дополнительные регистры невидимы для программ, дополнительные окна можно добавлять в любое время. Например, использование объектно-ориентированного программирования часто приводит к большему количеству "небольших" вызовов, которые можно обработать, увеличив размер окон, например, с восьми до шестнадцати. Такой подход был реализован в SPARC, где в новых поколениях архитектуры было добавлено больше регистровых окон. В результате снижается количество медленных операций сброса и заполнения регистровых окон, поскольку окна переполняются реже.
Критика
Окна регистров — не единственный способ повысить производительность регистров. Группа Стэнфордского университета, разрабатывавшая MIPS, ознакомилась с работой, выполненной в Беркли, и пришла к выводу, что проблема заключалась не в недостатке регистров, а в неэффективном использовании имеющихся. Поэтому они сосредоточили больше усилий на распределении регистров в своем компиляторе, обеспечив его разумное использование большего набора регистров, доступного в MIPS. Это позволило упростить схему чипа, уменьшив общее количество регистров вдвое, и при этом потенциально повысить производительность в тех случаях, когда одна процедура могла использовать большее видимое пространство регистров. В конечном итоге, благодаря современным компиляторам, MIPS более эффективно использует пространство своих регистров даже при вызовах процедур.