- •6. Приложения с плавающей точкой
- •6.1. Краткий обзор
- •6.2. Ограничения эффективности приложений с плавающей точкой.
- •6.2.1. Время ожидания выполнения
- •6.2.2. Пропускная способность выполнения
- •6.2.3. Время задержки при обращении к памяти
- •6.2.4. Пропускная способность памяти
- •6.3. Особенности с плавающей точкой в архитектуре IntelItanium
- •6.3.1. Большой и широкий набор регистров с плавающей точкой
- •6.3.1.1. Примечания относительно точности с плавающей точкой.
- •6.3.2. Инструкции умножения со сложением
- •6.3.3 Программная последовательность деление/вычисление квадратного корня
- •6.3.3.1. Удвоенная точность – деление
- •6.3.3.2. Удвоенная точность – вычисление квадратного корня
- •6.3.4. Вычислительные модели
- •6.3.5. Множество полей состояния.
- •6.3.6. Другие свойства
- •6.3.6.1. Поддержка экранирования операнда.
- •6.3.6.2. Min/Max/Amin/aMax
- •6.3.6.3. Преобразования между целыми и плавающими числами
- •6.3.6.4. Обработка подполей с плавающей точкой
- •6.3.7. Управление доступом к памяти
- •6.3.7.1. Инструкции парной загрузки
- •6.3.7.2. Предвыборка данных
- •6.3.7.3. Управление распределением
- •6.4. Итоги
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 ;; |
Следующее значение принято предустановленным: f10=1/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-битная точность деления является удовлетворительной и последовательность может быть короче, чем используется для одинарной или двойной точности.