Если вы не особенно интересуетесь компьютерами, вам простительно предположить, что единственными формами памяти в компьютере являются жесткий диск и оперативная память. Те из вас, кто интересуется компьютерами, вероятно, знают, что это не так, и что ЦП также имеет набор кешей, которые используются для кэширования данных из ОЗУ, чтобы ЦП мог получить к ним доступ. Быстрее. Все это рекламируемые функции, в первую очередь потому, что скорость и/или емкость являются достойным аргументом в пользу продажи и обычно влияют на уровень производительности.
Однако на самом деле есть еще один слой памяти. Как бы вы ни думали, что кеш L1 максимально близок к реальному вычислительному ядру, в иерархии памяти есть еще один более высокий уровень. Это регистры процессора. Причина, по которой они на самом деле не рекламируются и не упоминаются, заключается в том, что они вообще не изменились. Технически они могут быть, однако количество и размер регистров на самом деле имеют основополагающее значение для архитектуры. Это означает, что все процессоры x86-64 имеют одинаковое количество регистров. Они не продаются, потому что они не конкурируют.
Что делает регистр?
Регистр — это быстро доступное место хранения для процессора. Доступ к регистру осуществляется мгновенно с нулевой задержкой, тогда как даже кеш L1 имеет задержку примерно в 4-5 циклов в современных процессорах. Эта непосредственность доступа намекает на вариант использования регистров. Регистры используются для хранения инструкций, активно выполняемых ЦП. Они также хранят точки данных, которые должны быть обработаны. Некоторые регистры имеют общее назначение, в то время как другие имеют очень специфическое назначение. Примером регистра специального назначения может быть программный счетчик, в котором процессор отслеживает свою позицию в своей последовательности программ.
Многие регистры считаются доступными для пользователя. Это не означает, что пользователь компьютера может выбирать, какое значение в них вводить. Это означает, что работающее программное обеспечение может указать данные для загрузки в эти регистры. Меньшее количество регистров является внутренним, а это означает, что программное обеспечение вообще не может обращаться к ним. Регистр инструкций, в котором хранится инструкция, выполняемая в данный момент, является примером внутреннего регистра.
Зарегистрировать переименование
Хотя архитектура ЦП может допускать только одну конфигурацию регистров, на самом деле в этом есть небольшой нюанс. Все современные процессоры используют переименование регистров. Это метод, при котором вы можете иметь больше физических регистров и использовать их для предварительной загрузки данных или хранения данных, связанных с неправильной инструкцией, которая в противном случае была бы перезаписана. Когда ЦП доходит до того, что ему нужны данные в дополнительных регистрах, он просто переименовывает их так, чтобы они были адресуемыми, в то же время делая ранее адресуемый регистр неадресуемым.
Процесс переименования регистров может быть очень полезен для выполнения не по порядку. Например, если ячейка памяти запрограммирована для чтения, а затем для записи, и инструкции выполнялись в таком порядке, это нормально. Если, однако, инструкции переупорядочиваются для выполнения записи в первую очередь, инструкция чтения получит неправильное значение. Чтобы предотвратить это, исходное значение для чтения сохраняется в неиспользуемом регистре, который затем переименовывается при обработке соответствующей инструкции.
Вывод
Регистры являются самым высоким уровнем в иерархии памяти. Это единственная часть, напрямую адресуемая ЦП и не имеющая задержек. Регистры используются для хранения данных, активно выполняемых ЦП. Они также используются для хранения других точек данных, таких как программный счетчик, который отслеживает, какая инструкция должна быть выполнена следующей. Очень ограниченное количество регистров доступно в архитектуре x86-64, имеющей 16 регистров общего назначения и 16 или 32 регистра с плавающей запятой в зависимости от того, поддерживается ли AVX-512.