Скачиваний:
366
Добавлен:
01.06.2015
Размер:
2.01 Mб
Скачать

Регистры в risc-процессорах

Отличительная черта RISC-архитектуры — большое число регистров общего назначения, что объясняется стремлением свести все пересылки к типу «регистр-регистр». Но увеличение числа РОН способно дать эффект лишь при разумном их использовании. Оптимизация использования регистров в RISC-процессорах обеспечивается как программными, так и аппаратными средствами.

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

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

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

На рис. 9.37 приведен пример раскраски графа [36], и котором шесть виртуальных регистров отображаются на три физических. Доказаны временная последовательность активного вовлечения в выполнение каждого виртуального регистр (рис. 9.37, а) и раскрашенный граф (рис. 9.37,б).

Как видно, не удалось раскрасить только виртуальный регистр F, его придете отображать на ячейку памяти.

Аппаратная оптимизация использования регистров в RISC-процессорах орн ентирована па сокращение затрат времени при работе с процедурами. Наибольшее время в программах, написанных па ЯВУ, расходуется на вызовы процедуп и возврат из пик. Связано это с созданием и обработкой большого числа локальных переменных и констант. Одним из механизмов для борьбы с этим эффектом являются так называемые регистровые окна. Главная их задача — упростить и ус_ копить передачу параметров от вызывающей процедуры к вызываемой и обратно

Рис. 9.37. Иллюстрация метода раскраски графа: а — временная последовательность

активного использования виртуальных регистров; б — граф взаимного использования регистров

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

База окна (первый в последовательности регистров окна) указывается полем, называемым указателем текущего окна (CWP, Current Window Pointer), обычно расположенным в регистре (слоне) состояния ЦП. Если текущей процедуре назначено регистровое окно j, CWP содержит значение j.

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

Рис. 9.38. Перекрытие регистровых окон

Упомянутые k регистров сразу же будут доступны вызванной процедуре без всяких пересылок. Естественно, вызов приведет к увеличению содержимого поля CPW на единицу.

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

Рис. 9.39. Циклический буфер из пересекающихся регистровых окон

На рис. 9.39 показан циклический буфер из шести окон, заполненный на глубину 4 (процедура А вызвала В, В вызвала С, С вызвала D). Указатель текущего окна (CWP) идентифицирует окно активной на данный момент процедуры — D, то есть окно 03. При выполнении процедуры все ссылки на регистры в командах преобразуются в смещение относительно CWP. Указатель сохраненного окна (SWP, Saved Window Pointer) содержит номер последнего из окон, сохраненных в памяти ь причине переполнения циклического буфера. Если процедура D теперь вызовет процедуру Е, аргументы для нее она поместит в общее для обеих полей регистров, окон (пересечение окон 03 и 04), а значение CWP увеличится на единицу, то есть CWP будет показывать на окно 04.

Если далее процедура Е вызовет процедуру F, то этот вызов при существующем состоянии буфера не может быть выполнен, поскольку окно для F (05) перекрывается с окном процедуры А(00). Следовательно, при попытке F начать загружа-п. правое поле своего окна будут потеряны параметры процедуры А (АрИ). Поэтому когда CWP увеличивается на единицу (операция выполняется по модулю 6) и оказывается равным SWP, возникает прерывание и окно процедуры А сохраняется, в памяти (запоминаются только поля Ан1 и А_лок). Далее значение CWP мнкремсн-тируется и производится вызов процедуры F. Аналогичное прерывание происходит и при возврате, например когда выполнится возврат из В в A. CWP уменьшается па единицу (по модулю 6) и совпадет со значением SWP. Обработка прерывания приведет к восстановлению содержимого окна процедуры А из памяти.

Как видно из примера, регистровый файл из п окон способен поддерживать п-1 вызов процедуры. Число п не должно быть большим. В [208] показано, что при 8 регистровых окнах сохранение и восстановление окон в памяти требуется лишь для 1% операций вызова процедур. В ВМ Pyramid, например, используется 16 окон по 32 регистра в каждом.

Теоретически такой прием не исключен и в CISC. Однако устройство управления CISC-процессора оккупирует на кристалле более 50% площади, оставляя мало места для других подсистем, в частности для большого файла регистров. УУ RISC занимает порядка 10% поверхности кристалла, предоставляя возможность иметь большой регистровый файл.

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