- •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. Приложения с плавающей точкой
6.1. Краткий обзор
Itaniumархитектура с плавающей точкой полностью соответствует стандартуANSI/IEEE-754 и обеспечивает расширенные свойства эффективности, такие как, объединенная инструкция умножения с накоплением, большой файл регистров с плавающей точкой (со статической и ротируемой секциями), расширенный диапазон представления данных регистрового файла, множество независимых полей состояния с плавающей точкой, а также инструкции доступа к памяти с высокой пропускной способностью, которые позволяют создание компактного, высокоэффективного прикладного кода с плавающей точкой.
В начале этой главы рассматриваются некоторые специфические ограничения эффективности, являющиеся обычными в интенсивных прикладных кодах с плавающей точкой. Далее, на иллюстративных примерах кода, рассматриваются архитектурные особенности, адресующие эти ограничения. В конце этой главы освещается оптимизация некоторых, обычно применяемых ядер, использующих эти особенности.
6.2. Ограничения эффективности приложений с плавающей точкой.
Приложения с плавающей точкой характеризуются господством циклов. Одни циклы выполняют сложные вычисления на регулярных структурированных данных, другие просто копируют данные из одного места в другое, в то время как третьи выполняют операции типа сборки/рассеивания (gather/scatter), которые одновременно вычисляют и перестраивают данные. Следующие разделы описывают характеристики кода, ограничивающие эффективность и то, как они влияют на различные типы циклов.
6.2.1. Время ожидания выполнения
Циклы часто содержат рекуррентные соотношения. Рассмотрим ядро простого диагонального устранения (tri-diagonaleliminationkernel) из набораLivermoreFortranKernel(LFK).
DO 5 i = 2, N
5 X[i] = Z[i] * (Y[i] - X[i-1])
Зависимость между X[I]иX[I-1]ограничивает время итерации цикла суммой времени ожидания вычитаемого и сомножителя. Доступный параллелизм может быть увеличен разворачиванием цикла и может эксплуатироваться путем копированных вычислений, однако, фундаментальное ограничение зависимости по данным остается.
Иногда, даже если цикл распараллелен и может выполняться как программный конвейер, время итерации цикла ограничено временем ожидания выполнения аппаратных средств, выполняющих этот код. Деление простого вектора (показанное ниже) является типичным примером:
DO 1 I = 1, N
1 X[i] = Y[i] / Z[i]
Поскольку типичные современные микропроцессоры содержат исполнительные устройства с плавающей точкой, которые не являются конвейерными, то временем итерации цикла является время ожидания деления, которое может занимать десятки тактов.
6.2.2. Пропускная способность выполнения
Если существует и может эксплуатироваться достаточное количество ILP, то эффективность ограничивается доступностью ресурсов выполнения, иными словами, пропускной способностью (bandwidth) выполнения машины. Рассмотрим ядро умножения плотной матрицы для библиотекиBLAS3.
DO 1 i = 1, N
DO 1 j = 1, P
DO 1 k = 1, M
1 C[i,j] = C[i,j] + A[i,k]*B[k,j]
Обычные методы замены цикла, развертывания цикла и развертывание со сминанием (unrollandjam), могут использоваться для увеличения доступныхILPво внутреннем цикле. Когда это делается, внутренний цикл содержит изобилие независимых вычислений с плавающей точкой, при относительно небольшом количестве операций с памятью. Тогда, в значительной степени, ограничением эффективности является пропускная способность машины по выполнению операций с плавающей точкой (допуская, что доступно достаточное количество регистров для хранения суммC[i,j]и промежуточных вычислений).