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

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 ;;

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