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

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.