- •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.4. Вычислительные модели
Архитектура Itaniumпредлагает совершенное управление вычислительной моделью для пользователя. Пользователь может выбрать точность и диапазон результата, режим округления и ответ ловушкиIEEE. Соответственно выбор вычислительной модели может дать в результате код, которые имеет более высокую точность, или более высокую производительность, или и то и другое.
Формат файла регистров един для трех типов данных – одинарных, двойных и двойных расширенных. Так как все вычисления выполняются в регистрах (не зависимо от типа данных и их содержания), то операнды различных типов могут легко комбинироваться. Поскольку преобразования из типов памяти в формат регистрового файла делается при загрузках автоматически, то не требуется дополнительных операций для выполнения преобразования формата.
Семантики синтаксиса C, также легко эмулируются. Загрузки, автоматически преобразовывают все входные операнды в формат регистрового файла. Операнды данных различных типов, постоянно находящиеся в формате регистрового файла, а также все промежуточные результаты, теперь могут быть использованы принудительно в двойной точности, а точность результата статически указывается в коде инструкции. Вычисление, ведущее к финальному результату, может указать точность и диапазон результата (статически в коде инструкции для одинарной или двойной точности, и динамически в битах поля состояния для двойной расширенной точности). Согласование со стилем вычисленийFPIA-32 (диапазон – расширенный, точность – одинарная/двойная/расширенная), также может достигаться использованием битов поля состояния.
6.3.5. Множество полей состояния.
Регистр FPSRделится на одно главное (архитектурное) поле состояния и три дополнительных идентичных поля состояния. Эти дополнительные поля состояния могут использоваться для улучшения эффективности.
Во-первых, последовательности деления и квадратного корня (описанные в разделе 6.3.3) содержат операции, которые, на промежуточных результатах, могли бы вызвать переполнение/антипереполнение либо оказаться неточными, даже если нет финальных результатов. Для поддержки корректного состояния флага IEEE, флаги состояния этих вычислений должны быть отвергнуты. Для отказа от этих флагов может быть использовано одно из дополнительных полей состояния (обычно поле состояния 1).
Во-вторых, спекулятивные операции с плавающей точкой требуют поддержки флагов состояния спекулятивных операций, отличающихся от архитектурных флагов состояния, до того момента, пока спекуляция не завершится, а флаги не перейдут в нормальное архитектурное состояние (если они когда-нибудь это сделают). Одно из дополнительных полей состояния (обычно поле состояния 2 или 3) может использоваться для этой цели.
Рассмотрим поиск Монте-Карло из LFK-16.
DO 470 k= 1,n
k2 = k2+1
j4 = j2+k+k
j5 = ZONE(j4)
IF(j5-n ) 420,475,450
415 IF(j5-n+II ) 430,425,425
420 IF(j5-n+LB ) 435,415,415
425 IF(PLAN(j5)-R) 445,480,440
430 IF(PLAN(j5)-S) 445,480,440
435 IF(PLAN(j5)-T) 445,480,440
440 IF(ZONE(j4-1)) 455,485,470
445 IF(ZONE(j4-1)) 470,485,455
450 k3 = k3+1
IF(D(j5)-(D(j5-1)*(T-D(j5-2))**2
, +(S-D(j5-3))**2
, +(R-D(j5-4))**2)) 445,480,440
455 m = m+1
IF(m-ZONE(1) ) 465,465,460
460 m = 1
465 IF(i1-m) 410,480,410
470 CONTINUE
475 CONTINUE
480 CONTINUE
485 CONTINUE
Профилирование показывает, что наиболее часто выполняется условное выражение после оператора 450. Поэтому выгодно спекулятивно выполнить вычисление в этом условном выражении в то время, пока будут оцениваться условные выражения 415…445. Если любое из условных выражений 415…445 заставит передать управление мимо 450, то результаты (и флаги) спекулятивно вычисленных операций (условного выражения после оператора 450) могут быть отвергнуты.
Доступность нескольких дополнительных полей состояния может позволить пользователю обслуживать несколько вычислительных сред и динамически выбирать среди них операцию на основании базиса операций. Одним таким использованием является выполнение кода арифметического интервала, где каждая арифметическая операция требуется для вычисления в двух различных режимах округления, для определения интервала результата.