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

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]и промежуточных вычислений).