Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MProc / M9 / Оптимизация часть 3..doc
Скачиваний:
17
Добавлен:
16.04.2013
Размер:
148.99 Кб
Скачать

3.4.3.4. Краткий обзор терминологии

Со спекуляцией по управлению связаны следующие термины:

Загрузка спекулятивная по управлению (control speculative load).

Спекулятивная загрузка, которая планируется до предшествующей передачи управления. Ссылки к спекулятивным загрузкам без квалификаторов, обычно относят к загрузкам спекулятивным по управлению, а не по данным. Загрузки, использующие инструкцию ld.sявляются спекулятивными по управлению.

Проверка спекуляции (speculation check).

Инструкция, которая проверяет, задержала ли спекулятивная инструкция исключение. Инструкции проверки спекуляции включают метки, которые указывают на код сгенерированный компилятором. Инструкцией проверки спекуляции является chk.s.

Код восстановления (recovery code).

Код, выполняемый для восстановления при не успешной спекуляции. Код восстановления при спекуляции по управлению аналогичен коду восстановления при спекуляции по данным.

3.4.4. Комбинирование спекуляций по данным и управлению

Загрузка, которая является спекулятивной и по данным и по управлению, называется спекулятивной предварительной загрузкой (speculativeadvancedload). Инструкцияld.saвыполняет обе операции и спекулятивной загрузки и предварительной загрузки. ЭлементALATне будет выделен, если этот тип загрузки генерирует маркер задержанного исключения, так что инструкция проверки предварительной загрузки (chk.a), является достаточной, чтобы проверить, и последующие сохранения, и задержанные исключения.

3.5. Оптимизация обращений к памяти

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

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

  • Различие между затратами на выполнение спекулятивного и не спекулятивного кодов.

  • Размер кода.

  • Вероятности взаимного влияния и свойства таблицы ALAT(для спекуляции по данным).

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

3.5.1. Соображения о спекуляции

Использование спекуляции по данным требует большего внимания, чем использование спекуляции по управлению. Частично, это является следствием того, что одна загрузка спекулятивная по управлению, не может по неосторожности привести к сбою другой загрузки спекулятивной по управлению. Такой эффект возможен с загрузками спекулятивными по данным, т.к.ALATимеет ограниченную емкость, а политика замены элементовALATявляется зависимой от реализации. Например, если запущена предварительная загрузка, но нет ни одного не использованного элементаALAT, то аппаратура может принять решение ликвидировать существующий элемент для того, чтобы создать место для нового элемента.

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

Хотя статистический критический путь программы может быть уменьшен при помощи спекуляции по данным, но следующие факторы способствуют выгодности/динамичности стоимости спекуляции по данным:

  • Вероятность того, что вмешается сохранение, которая пересечется с предварительной загрузкой.

  • Стоимость восстановления при неудачной предварительной загрузке.

  • Специфика микроархитектурной реализации ALAT: ее размер, ассоциативность и соответствие алгоритму.

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

При использовании предварительных загрузок, должно быть пошаговое рассмотрение того, что предпочтительно – только ли продвижение загрузки и использование ld.c, либо может быть продвижение и загрузки и ее пользователей, где потребуется использовать потенциально более дорогуюchk.a.

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