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

6.3.3 Программная последовательность деление/вычисление квадратного корня

Для выполнения операций деления или вычисления квадратного корня, в архитектуре Itanium используется программа, основанная на последовательности операций. Последовательность состоит из получения первоначальной оценки (используя инструкции frcpa/frsqrta), а затем идет улучшение оценки путем выполнения итераций Ньютона-Рафсона, до тех пор, пока ошибка не окажется достаточно мала для того, чтобы не влиять на округление результата. Далее даны примеры деления и вычисления квадратного корня с двойной точностью, оптимизированные по времени ожидания и производительности.

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

6.3.3.1. Удвоенная точность – деление

Деление (Max пропускная способность)

(10 инструкций, 8 групп)

Деление (Min время выполнения)

(13 инструкций, 7 групп)

frcpa.s0 f8,p6 = f6,f7 ;;

(p6) fnma.s1 f9 = f7,f8,f1 ;;

(p6) fma.s1 f8 = f9,f8,f8

(p6) fma.s1 f9 = f9,f9,f0 ;;

(p6) fma.s1 f8 = f9 ,f8,f8

(p6) fma.s1 f9 = f9,f9,f0 ;;

(p6) fma.s1 f8 = f9,f8,f8 ;;

(p6) fma.d.s1 f9 = f6,f8,f0 ;;

(p6) fnma.d.s1 f6 = f7,f9,f6 ;;

(p6) fma.d.s0 f8 = f6,f8,f9

frcpa.s0 f8,p6 = f6,f7 ;;

(p6) fma.s1 f9 = f6,f8,f0

(p6) fnma.s1 f10 = f7,f8,f1 ;;

(p6) fma.s1 f9 = f10,f9,f9

(p6) fma.s1 f11 = f10,f10,f0

(p6) fma.s1 f8 = f10,f8,f8 ;;

(p6) fma.s1 f9 = f11,f9,f9

(p6) fma.s1 f10 = f11,f11,f0

(p6) fma.s1 f8 = f11,f8,f8 ;;

(p6) fma.d.s1 f9 = f10,f9,f9

(p6) fma.s1 f8 = f10,f8,f8 ;;

(p6) fnma.d.s1 f6 = f7,f9,f6 ;;

(p6) fma.d.s0 f8 = f6,f8,f9

6.3.3.2. Удвоенная точность – вычисление квадратного корня

Деление (Max пропускная способность)A

(14 инструкций, 10 групп)

Деление (Min время выполнения)B

(17 инструкций, 10 групп)

frsqrta.s0 f7,p6=f6 ;;

(p6) fma.s1 f8=f10,f7,f0

(p6) fma.s1 f7=f6,f7,f0 ;;

(p6) fnma.s1 f9=f7,f8,f10 ;;

(p6) fma.s1 f8=f9,f8,f8

(p6) fma.s1 f7=f9,f7,f7 ;;

(p6) fnma.s1 f9=f7,f8,f10 ;;

(p6) fma.s1 f8=f9,f8,f8

(p6) fma.s1 f7=f9,f7,f7 ;;

(p6) fnma.s1 f9=f7,f8,f10 ;;

(p6) fma.s1 f8=f9,f8,f8

(p6) fma.d.s1 f7=f9,f7,f7 ;;

(p6) fnma.s1 f9=f7,f7,f6 ;;

(p6) fma.d.s0 f7=f9,f8,f7 ;;

frsqrta.s0 f7,p6=f6 ;;

(p6) fma.s1 f8=f9,f7,f0

(p6) fma.s1 f7=f6,f7,f0 ;;

(p6) fnma.s1 f9=f7,f8,f9 ;;

(p6) fma.s1 f10=f11,f9,f10

(p6) fma.s1 f11=f9,f9,f0

(p6) fma.s1 f12=f13,f9,f12 ;;

(p6) fma.s1 f10=f11,f10,f9

(p6) fma.s1 f11=f11,f11,f0

(p6) fma.s1 f9=f9,f12,f14 ;;

(p6) fma.s1 f12=f10,f7,f7

(p6) fma.s1 f7=f7,f11,f0

(p6) fma.s1 f10=f11,f9,f10 ;;

(p6) fma.d.s1 f7=f9,f7,f12

(p6) fma.s1 f8=f10,f8,f8 ;;

(p6) fnma.s1 f9=f7,f7,f6 ;;

(p6) fma.d.s0 f7=f9,f8,f7 ;;

  1. Следующее значение принято предустановленным: f10=1/2.

  2. Следующие значения приняты предустановленными: f9=1/2, f10=3/2, f11=5/2, f12=63/8, f14=35/8.

Для деления, первая инструкция (frcpa) обеспечивает приближение (8 битное) обратной величины f7 и устанавливает в 1 предикат (f6), если отношение f6/f7 может быть описано, используя заданные итерации Ньютона-Рафсона. Если же отношение f6/f7 является особенным (конечное/0, конечное/бесконечное и т.п.), то окончательный результат обеспечивается в f8, а предикат (f6) – очищается. При некоторых граничных условиях (когда значения операндов (f6 и f7) выходят за единичный, двойной и даже за двойной расширенный диапазон точности), инструкция frcpa вызовет вспомогательную программную ошибку, программа-обработчик сформирует отношение f6/f7, вернет его в f8 и очистит предикат (f6).

В этих последовательностях используется множество полей состояния, находящихся в FPSR. Поле S0 является главным (архитектурным) полем состояния и оно записывается с помощью первой операции (frcpa) для сигнализации о любых ошибках (V, Z, D), а также, с помощью последней операции для сигнализации о любых ловушках. Условия всех промежуточных операций игнорируются, путем записи их в S1. Таким образом, эти последовательности получают не только результат (в f8), корректно соответствующий IEEE 754, но и флаги (в S1), соответствующие требованиям стандарта. Если деление является частью спекулятивной цепочки операций, которая использует S2 в качестве своего поля состояния, то в этих последовательностях S0 должно быть заменено на S2. Поле S1 может быть использовано промежуточными операциями всех последовательностей деления, т.к. все его флаги отвергаются.

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

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