- •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.1.1. Примечания относительно точности с плавающей точкой.
Регистры с плавающей точкой имеют ширину 82 бита, при этом 17 битов отведено для диапазона порядка, 64 бита – для точности мантиссы и один бит для знака. В процессе вычислений, диапазон и точность результата определяются вычислительной моделью выбранной пользователем. Вычислительная модель указывается либо статически – в коде инструкции, либо динамически – в регистре состояния с плавающей точкой, через биты PC(управление точностью) иWRE(наибольший диапазон порядка). Используя соответствующую вычислительную модель, пользователь может минимизировать накопление ошибок при вычислениях. В вышеупомянутом примере умножения матриц, если вычисления умножения и сложения выполнены в полном диапазоне и точности регистрового файла, то результаты (в аккумуляторах) могут содержать 64 бита точности и до 17 битов диапазона, при исходных значениях которые могли быть числами с одинарной точностью. При выполнении округления с 64 битной точностью (вместо 24-битной для одинарной точности), накапливается меньше ошибок при каждом умножении и сложении. Кроме того, при 17 битах диапазона (вместо 8 битов для одинарной точности), в аккумулятор могут быть добавлены большие положительные или отрицательные произведения без переполнения или антипереполнения. Кроме того, обеспечение более точных результатов через дополнительный диапазон и точность, могут часто расширять эффективность итерационных вычислений, которые требуются для выполнения до достижения сходимости к указанной точности.
6.3.2. Инструкции умножения со сложением
Архитектура Itaniumопределяет объединенную инструкцию умножения со сложением (fma–fusedmultiply-add), как основную для вычислений с плавающей точкой, поскольку такая операция составляет ядро многих вычислений (линейная алгебра, ряды и т.п.), а ее время выполнения в аппаратных средствах, обычно меньше, чем суммарное время выполнения отдельной операции умножения (с округлением) и отдельной операции сложения (с округлением).
В вычислительных циклах, которые имеют зависимость переносимую циклически, и чье быстродействие часто определяется, скорее временем выполнения вычислений с плавающей точкой, чем рейтингом пиковых вычислений, операция умножения со сложением может использоваться очень эффективно. Рассмотрим общие рекуррентные соотношения из 9-го ядра Ливерморского ФОРТРАНА:
DO 191 k= 1,n
B5(k+KB5I)= SA(k) +STB5* SB(k)
STB5=B5(k+KB5I)-STB5
191 CONTINUE
Так как имеется истинная зависимость по данным между двумя операторами относительно переменной B5(k+KB5I) и зависимость несущего цикла по переменной STB5, то количество тактов цикла на итерацию, полностью определяется временем ожидания операций с плавающей точкой. В отсутствие операций типа fma, и предполагая, что время ожидания отдельных умножения и сложения составляет 5 тактов каждое, а загрузка имеет 8 тактов, то цикл был бы таков:
L1: (p16) ldf f32 = [r5], 8 // Загрузка SA(k)
(p16) ldf f42 = [r6], 8 // Загрузка SB(k)
(p17) fmul f5 = f7, f43;; // tmp, Такты 0,15 ...
(p17) fadd f6 = f33, f5 ;; // B5, такты 5,20 ...
(p17) stf [r7] = f6, 8 // Сохранение B5
(p17) fsub f7 = f6, f7 // STB5, Такты 10,25 ..
br.ctop L1 ;;
С fmaполное время ожидания цепочки операций уменьшается, и если примем, чтоfmaзанимает 5 тактов, то скорость итерации цикла будет 10 тактов (против 15 тактов ранее).
L1: (p16) ldf f32 = [r5], 8 // ЗагрузкаSA(k)
(p16) ldf f42 = [r6], 8 // Загрузка SB(k)
(p17) fma f6 = f7, f43, f33;; // B5, Такты 0,10 ...
(p17) stf [r7] = f6, 8 // Сохранение B5
(p17) fsub f7 = f6, f7 // STB5, Такты 5,15 ..
br.ctop L1 ;;
Объединенная операция умножения со сложением, также дает преимущество при ошибке округления для пары вычислений с единичной точностью, которая возможна при попытке вычислений маленьких различий больших чисел.