Скачиваний:
56
Добавлен:
16.04.2013
Размер:
123.39 Кб
Скачать

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), корректно соответствующийIEEE754, но и флаги (вS1), соответствующие требованиям стандарта. Если деление является частью спекулятивной цепочки операций, которая используетS2 в качестве своего поля состояния, то в этих последовательностяхS0 должно быть заменено наS2. ПолеS1 может быть использовано промежуточными операциями всех последовательностей деления, т.к. все его флаги отвергаются.

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

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