Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MProc / M9 / Архитектура часть 4..doc
Скачиваний:
18
Добавлен:
16.04.2013
Размер:
430.08 Кб
Скачать

4.15. Инструкции, связанные со спекуляцией по управлению

Мнемоника

Действие

ld.s, ldf.s, ldfp.s

Спекулятивные загрузки GRиFR

ld8.fill, ldf.fill

Восстановить GRв наборе сNaT, восстановитьFR

st8.spill, stf.spill

Слить GRв наборе сNaT, слитьFR

shk.s

Проверить GRилиFRна маркер отложенного исключения

tnat

Проверить NaTбитыGRи установить предикат

4.4.5. Спекуляция по данным

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

4.4.5.1. Концепция спекуляции по данным

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

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

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

4.4.5.2. Спекуляция по данным и инструкции

Предварительная (advanced) загрузка возможна в нескольких формах: целочисленная (ld.a), с плавающей точкой (ldf.a) и парная с плавающей точкой (ldfp.a). Когда предварительная загрузка выполнена, то выделяется элемент (entry) в структуре называемойALAT(Advanced Load Address Table – таблица адресов предварительной загрузки). Позже, когда соответствующая инструкция проверки выполнена, присутствие элемента указывает на то, что спекуляция по данным прошла успешно, в противном случае – спекуляция не удачна и выполняется один из двух видов восстановления генерируемых компилятором:

  1. Инструкции проверки загрузки ld.с, ldf.с, ldfp.cиспользуются для восстановления, когда только планирование инструкций перед сохранением, которое является неоднозначно связанным с предварительной загрузкой, сами являются предварительными загрузками. Проверка загрузки просматриваетALATи ищет элемент. Если находит, то спекуляция считается успешной; если в результате поиска элемент не найден, то спекуляция безуспешная и проверка загрузки перезагружает правильное значение из памяти. На рис.4.2. показано это преобразование.

До спекуляции

После спекуляции по данным

// другие инструкции

st8 [r4]=f12

ld8 r6=[r8];;

add r5=r6,r7;;

st8 [r18]=r5

ld8.a r6=[r8];; //предварительная загрузка

// другие инструкции

st8 [r4]=f12

ld8.c.clr r6=[r8] //проверка загрузки

add r5=r6,r7;;

st8 [r18]=r5

Рис.4.2. Использование ld.cв восстановлении при спекуляции по данным

  1. Проверка предварительной загрузки используется тогда, когда предварительная загрузка и несколько инструкций зависят от того, что загруженное значение планируется перед сохранением, которое является неоднозначно связанным с предварительной загрузкой. Проверка предварительной загрузки работает как спекулятивная проверка (chk.s) в том что, если спекуляция успешна, то продолжается естественное выполнение, а восстановление не нужно; если же спекуляция не успешна, тоchk.aсделает переход на код восстановления, сгенерированный компилятором. Код восстановления содержит инструкции, которые заново выполнят всю работу, которая зависела от спекулятивно загруженных данных оказавшихся неправильными в точке инструкции проверки. Как и при проверке загрузки, успех спекуляции по данным, устанавливается использованием проверки предварительной загрузки, которая просматриваетALATдля поиска элемента. Это преобразование показано на рис.4.3.

До спекуляции

После спекуляции по данным

// другие инструкции

st8 [r4]=f12

ld8 r6=[r8];;

add r5=r6,r7;;

st8 [r18]=r5

ld8.a r6=[r8];;

// другие инструкции

add r5=r6,r7;;

// другие инструкции

st8 [r4]=f12

ld8.c.clr r6=[r8]

back:

st8 [r18]=r5

// где-то в другом месте программы

recover:

ld8 r6=[r8];;

add r5=r6,r7;;

br back

Рис.4.3. Использование chk.aв восстановлении при спекуляции по данным

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

Соседние файлы в папке M9