#### Принципы работы алгоритма Томасуло. "Станции резервации"(reservation stations), переименование регистров, общая шина данных (Common Data Bus, CDB). Поля станций резервации. **Управление распределено по функциональным устройствам (в Табло - централизовано).** - **FU** имеют специальные буферы - **«станции резервации» (Reservation Station)**, которые содержат: - Незавершенные инструкции. - Операнды незавершенных инструкций. - Информацию о статусе инструкций (включая зависимости данных). - Станции резервации иногда называют «физическими регистрами» или «переименованными регистрами» в противоположность регистрам архитектуры, заданным в ISA. Регистры ISA в инструкциях заменяются либо их значениями (если доступны), либо указателями на станции резервации, которые предоставят значение позже. - Этот процесс называется **переименованием регистров**. - Переименование регистров исключает конфликты WAR, WAW (зависимости по именам). - Позволяет использовать аппаратное разворачивание циклов. - Станций резервации может быть больше, чем регистров ISA, что ведет к аппаратной оптимизации, которая невозможна для компиляторов, а также предотвращает узкое место из-за количества регистров ISA. **Недостатки:** - Сложность реализации. - Требуется большое число высокоскоростных ассоциативных портов чтения результатов с CDB. - Производительность может ограничиваться одной CDB. Возможное решение - несколько CDBs. **Принцип работы:** - **Стадия выдачи** Проверяем ожидает ли регистр какое-то значение от RS. Если ожидает - делаем пометку, что мы тоже ожидаем значение от той же RS, что и регистр. Иначе просто копируем значение регистра в аргумент. По итогу у нас либо есть все аргументы, либо мы знаем, от какой RS мы ожидаем аргументы. Потом помечаем, что наша станция busy. В конце помечаем выходной регистр, что он ожидает значения от нашей станции резервации. - **Исполнение** Если готовы оба аргумента - начинаем исполнение. - **Запись результата** 1) Если какой-то регистр ожидает ответа от нашей станции резервации, то записываем результат и помечаем, что регистр больше не ожидает - свободен. 2) Всем станциям, которые в качестве параметра ожидали значение от нашей станции - записываем это значение. 3) Если ожидала станция сохранения, то записываем 4) Помечаем текущую станцию незанятой. **Общая шина данных (CDB):** данные + адрес назначения (шина «куда) - 64 бит для данных + 4 бита для адреса функционального устройства - источника. - данные записываются в ждущую RS, если адрес источника совпадает с адресом RS, которая производит операнд источник. - передача результата происходит через рассылку ждущим RS, включая регистровый файл. **Поля станции резервации:** - **Busy** - RS занята. - **Op** - операция, выполняемая в устройстве. - $V_j,V_k$ - значения операндов источников S1, S2. Буферы записи имеют одно V поле, показывающее результат, который надо сохранить. - $Q_j,Q_k$ - RS, производящие операнды - источники. Нет флагов готовности, как в Табло: $Q_j,Q_k=0=>$ операнды готовы. Буферы сохранения имеют только Q, для RS, производящей результат. - **A** - информация об адресах для операций load/store. Сначала поле прямого адреса инструкции, потом реальный адрес, когда он вычислен. - $Q_i$ - показывает, какая RS будет записывать в регистр, если такая есть. Пустой (или 0), когда нет незаконченных инструкций (где-то в RS), которые будут записывать в тот регистр. Регистровый файл ведет себя как RS.