1. Введение
2. Измерения вычислительных алгоритмов
2.1. Мера параллелизма
3. Параллельный алгоритм суммирования
4. Параллельные формы рекурсивных алгоритмов
5. Каскадное суммирование
6. Согласованность параллельных алгоритмов
7. Циклическая редукция для решения уравнения рекурсии 1 порядка
8. Параллельные алгоритмы и производительность ЭВМ
1. Источники вычислительных погрешностей
2. Погрешности исходных данных
3. Формы представления чисел в ЭВМ
4. Числа с плавающей запятой
4.1. Представление систем с плавающей точкой в ЭВМ
5. Особенности арифметики с плавающей запятой
5.1. Нарушение алгебраических законов в плавающей арифметике
6. Точность плавающей арифметики
7. Погрешности округления при вычислениях
7.1. Погрешности выполнения арифметических операций
8. Оптимизационные преобразования программ
1. Балансировка дерева вычислений
2. Исключение общих подвыражений
3. Разворачивание циклов
9. Блокировка оптимизационных преобразований
10. Особенности вычисления выражений в Фортране 90
11. Погрешности асинхронного распараллеливания
Данные | А1 | А2 | А3 | А4 | А5 | А6 | А7 | А8 |
Ярус 1 | А1+А2 | А3+А4 | А5+А6 | А7+А8 | ||||
Ярус 2 | А12+А3 | А12+А34 | А56+А7 | А56+А78 | ||||
Ярус 3 | А1234+А5 | А1234+А56 | А1234+А567 | А1234+А5678 |
A1 | + | 0 | = | A1 | + | 0 | = | A1 | + | 0 | = | A1 |
A2 | A1 | A12 | 0 | A12 | 0 | A12 | ||||||
A3 | A2 | A23 | A1 | A123 | 0 | A123 | ||||||
A4 | A3 | A34 | A12 | A1234 | 0 | A1234 | ||||||
A5 | A4 | A45 | A23 | A2345 | A1 | A12345 | ||||||
A6 | A5 | A56 | A34 | A3456 | A12 | A123456 | ||||||
A7 | A6 | A67 | A45 | A4567 | A123 | A1234567 | ||||||
A8 | A7 | A78 | A56 | A5678 | A1234 | A12345678 |
X = D DO L = 1,LOG2(N) X = X + SHIFTR(X,2**(L-1)) ENDDOРезультат векторной функции SHIFTR(A,l) есть массив (вектор), полученный из А , элементы которого сдвинуты на L позиций вправо, а L левых элементов заполнены нулями. Практическая реализация алгоритма может исключить излишние операции сложения с нулем, однако, и после этого, по сравнению с последовательным алгоритмом, данный - требует лишние операции.
n | t=P(n) | t=S(n) |
8 | 3170 | 1400 |
32 | 6190 | 6200 |
128 | 15*103 | 25*103 |
1024 | 0.1*106 | 0.2*106 |
221 | 419*106 | 415*106 |
X1 = D1 X2 = X1 * A2 + D2 ................. Xi = Xi-1 * Ai + Di ................. Xn = Xn-1 * An + Dnв общем виде: Xi = Xi-1 * Ai + Di, i = 2,3,...n, X1 = D1
A= |
| d= |
|
X(1) = A(1) + D(1) DO i = 1,n X(i) = X(i-1) * A(i) + D(i) ENDDOРекурсивная зависимость итераций цикла не позволяет ускорить вычисления за счет параллельной работы оборудования. Преобразуем данный алгоритм в параллельный методом циклической редукции. Рассмотрим два соседних уравнения:
Xi-1 = Xi-2 * Ai-1 + Di-1 Xi = Xi-1 * Ai + Diи подставив первое во второе, получаем:
Xi = (Xi-2 * Ai-1 + Di-1) * Ai + Di = Xi-2 * A1,i + D1,i ,Тогда, проведя эту операцию для всей системы уравнений, получим систему уравнений порядка n/2. Если повторить процедуру l раз (если n = 2l), то в результате получается значение: Xn = Dnl. Для получения полного вектора X необходимо модифицировать алгоритм, например, по аналогии с алгоритмами суммирования.
где
A1,i = Ai * Ai-1 , D1,i = Ai * Di-1 + Di
Xi = Ali * Xi-2l + Dli ,Если индекс i у любого Al,i, Dl,i и Xi попадает вне диапазона 1 <= i <= n , то он должен быть приравнен к нулю. Тогда , при l = log2n в уравнениях: Xi = Ali * Xi-2l + Dli индекс Xi-2l = Xi-n находится вне диапазона, и, следовательно, решением системы уравнений будет: вектор: Xi = Dli,
где l = 0,1,..,log2n , i = 1,2,..,n
Al,i = Al-1,i * Al-1,(i-2l-1) Dl,i = Al-1,i * Dl-1,(i-2l-1) + Dl-1,i Начальные данные: A0,i = Ai, D0,i = Di
X = D DO L = 1,LOG2(N) X = A * SHIFTR(X,2**(L-1)) + X A = A * SHIFTR(A,2**(L-1)) ENDDO
EPS = 1.0 1 EPS = 0.5 * EPS EPS1 = EPS + 1.0 IF (EPS1 .GT. 1.0) GO TO 1Задача. Написать программу, определяющую количество разрядов, используемых для представления мантиссы чисел с плавающей запятой. (Пусть на испытываемой ЭВМ мантисса числа хранится в нормализованном виде 1A2A3...An).
X = A + B + C + D | ----> | REG = B + C |
Y = B + E + C | X = A + D + REG | |
Y = E + REG |
DO I=1,100 DO I=1,100,4 A(I) = B(I) + C(I) A(I) = B(I) + C(I) ENDDO A(I+1) = B(I+1) + C(I+1) A(I+2) = B(I+2) + C(I+2) A(I+3) = B(I+3) + C(I+3) ENDDOПри этом преобразовании снижается количество анализов итерационной переменной. Данный алгоритм также может привести к нарушению предписанного первоначально порядка вычислений. Например:
DO I=1,10 DO I=1,10,2 S = S + A(I) S = S + A(I) ENDDO S1 = S1 + A(A+1) ENDDO S = S + S1Здесь, суммирование проводится отдельно для четных и нечетных элементов с последующем сложением частных сумм.
разрешаются преобразования: | и запрещаются: | ||||
x+y | -> | y+x | i/2 | -> | 0.5 *i |
x*y | -> | y*x | x*i/j | -> | x*(i/j) |
-x+y | -> | y-x | (x+y)+z | -> | (x+y+z) |
x+z+y | -> | y+(x+z) | i/j/a | -> | i/(j*a) |
x*a/z | -> | x*(a/z) | (x+y)+z | -> | x+(y+z) |
a/b/c | -> | a/(b*c) | (x*y)-(x*z) | -> | x*(y-z) |
a/5.0 | -> | 0.2*a | x*(y-z) | -> | x*y-x*z |