- •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.6. Другие свойства
Архитектура Itaniumпредлагает ряд других архитектурных конструкций для расширения эффективности различных архитектурных ситуаций.
6.3.6.1. Поддержка экранирования операнда.
Экранирование (screening) операнда – это часто нужный или полезный шаг для вычислений. Операнд может быть экранирован для гарантии того, что он находится в допустимом диапазоне (например, положительное или нулевое исходное значение для квадратного корня; не нулевой делитель), либо он может быть экранирован, чтобы сделать ранний выход – результат вычисления предопределен или может быть вычислен более эффективно другим способом. Инструкцияfclassможет использоваться для классификации того, относится ли входной операнд к набору некоторого класса. Рассмотрим следующий код, используемый для экранирования недопустимых операндов при вычислении квадратного корня:
IF (A.EQ. NATVAL OR
A.EQ. SNAN OR A.EQ. QNAN OR
A.EQ. NEG_INF OR A.EQ. POS_INF OR
A.LT. 0.0D0) THEN
WRITE (*, "INVALID INPUT OPERAND")
ELSE
WRITE (*, "SQUARE-ROOT = ", SQRT(A))
ENDIF
Это условие может быть задано с помощью инструкций двух классов, как показано ниже:
fclass.m p1, p2 = f2,0x1E3;; // Выявляем NaTVal, NaN, +Inf или -Inf
(p2) fclass.m p1, p2 = f2,0x01A // Выявляем-Norm или -Unorm
Полученные комплиментарные предикаты (р1 и р2) могут использоваться для управления операторами ELSEиTHEN, соответственно.
6.3.6.2. Min/Max/Amin/aMax
Архитектура Itaniumобеспечивает прямую поддержку на уровне инструкций для конструкции ФортранаMIN(a,b)(либо эквивалентнойCидиомы:a<b ? a:b) и для конструкции ФортранаMAX(b,a)(либо эквивалентнойCидиомы:a<b ? b:a). Эти инструкции могут расширить эффективность путем ухода от издержек из-за обращения к функции в Фортране и, путем уменьшения критического пути в С. Инструкции разработаны в подражание поведению оператораCтак, чтобы они могли генерироваться компилятором. Кроме того, они не коммутативны. Выбирая соответствующий порядок входных операндов, пользователь может либо игнорировать, либо улавливать значенияNaN.
Рассмотрим проблему поиска минимального значения в массиве (подобную LFK-24):
XMIN = X(1)
DO 24 k= 2,n
24 IF(X(k) .LT. XMIN) XMIN = X(k)
Поскольку значения NaNне являются упорядоченными, то сравнения сNaN(включая иLT) приведет к ошибке. Следовательно, если этот код реализован так:
ldf f5 = [r5], 8;;
L1: ldf f6 = [r5], 8
fmin f5 = f6, f5
br.cloop L1 ;;
то значения NaNиз массива (Х) будут игнорироваться.
Если значение из массива Х (загруженное в f6) являетсяNaN, то новое минимальное значение (вf5) останется неизменным, посколькуNaNприведет к ошибке сравнения.LT., аfminвернет второй аргумент – в данном случае старое минимальное значение вf5.
Однако если код осуществлен так:
ldf f5 = [r5], 8;;
L1: ldf f6 = [r5], 8
fmin f5 = f5, f6
br.cloop L1 ;;
то значения NaNиз массива (Х) будут сбрасывать минимальное значение.
Теперь, если значение из массива Х (загруженное в f6) являетсяNaN, то новое минимальное значение (вf5) будет установлено вNaN, посколькуNaNприведет к ошибке сравнения.LT., а fminвернет второй аргумент – в данном случаеNaN– вf6. На следующей итерации, новое значение массива (загруженное вf6) станет новым минимумом.
Инструкции famin/famaxвыполняют сравнение абсолютных значений исходных операндов (т.е. они игнорируют знаковый бит), однако используют тот же самый (не коммутативный) способ, что и инструкцииfmin/fmax.