Алгоритм сдваивания Стоуна для LU-разложения трёхдиагональной матрицы
Алгоритм сдваивания Стоуна для LU-разложения трёхдиагональной матрицы | |
Последовательный алгоритм | |
Последовательная сложность | 3(n-1)\lceil \log_2 (n-1) \rceil + o((n-1)\lceil \log_2 (n-1) \rceil) |
Объём входных данных | 3n-2 |
Объём выходных данных | 2n-1 |
Параллельный алгоритм | |
Высота ярусно-параллельной формы | 2 \lceil \log_2 (n-1) \rceil + 3 |
Ширина ярусно-параллельной формы | n |
Основные авторы описания: А.В.Фролов
Содержание
- 1 Свойства и структура алгоритмов
- 1.1 Общее описание алгоритма
- 1.2 Математическое описание алгоритма
- 1.3 Вычислительное ядро алгоритма
- 1.4 Макроструктура алгоритма
- 1.5 Схема реализации последовательного алгоритма
- 1.6 Последовательная сложность алгоритма
- 1.7 Информационный граф
- 1.8 Ресурс параллелизма алгоритма
- 1.9 Входные и выходные данные алгоритма
- 1.10 Свойства алгоритма
- 2 Программная реализация алгоритма
- 3 Литература
1 Свойства и структура алгоритмов
1.1 Общее описание алгоритма
Алгоритм сдваивания Стоуна для LU-разложения трёхдиагональной матрицы - часть метода сдваивания Стоуна для решения СЛАУ[1][2] вида Ax = b, где
- A = \begin{bmatrix} a_{11} & a_{12} & 0 & \cdots & \cdots & 0 \\ a_{21} & a_{22} & a_{23}& \cdots & \cdots & 0 \\ 0 & a_{32} & a_{33} & \cdots & \cdots & 0 \\ \vdots & \vdots & \ddots & \ddots & \ddots & 0 \\ 0 & \cdots & \cdots & a_{n-1 n-2} & a_{n-1 n-1} & a_{n-1 n} \\ 0 & \cdots & \cdots & 0 & a_{n n-1} & a_{n n} \\ \end{bmatrix}, x = \begin{bmatrix} x_{1} \\ x_{2} \\ \vdots \\ x_{n} \\ \end{bmatrix}, b = \begin{bmatrix} b_{1} \\ b_{2} \\ \vdots \\ b_{n} \\ \end{bmatrix}
Метод сдваивания Стоуна впервые предложен в начале 70-х гг. 20го века[3] в качестве альтернативы другим параллельным алгоритмам решения трёхдиагональных СЛАУ, например, методу циклической редукции.
Здесь рассматривается его первая часть - LU-разложение. Оно состоит в представлении матрицы
- A = \begin{bmatrix} a_{11} & a_{12} & 0 & \cdots & \cdots & 0 \\ a_{21} & a_{22} & a_{23}& \cdots & \cdots & 0 \\ 0 & a_{32} & a_{33} & \cdots & \cdots & 0 \\ \vdots & \vdots & \ddots & \ddots & \ddots & 0 \\ 0 & \cdots & \cdots & a_{n-1 n-2} & a_{n-1 n-1} & a_{n-1 n} \\ 0 & \cdots & \cdots & 0 & a_{n n-1} & a_{n n} \\ \end{bmatrix}
в виде произведения матриц
- L = \begin{bmatrix} 1 & 0 & 0 & \cdots & \cdots & 0 \\ l_{21} & 1 & 0 & \cdots & \cdots & 0 \\ 0 & l_{32} & 1 & \cdots & \cdots & 0 \\ \vdots & \vdots & \ddots & \ddots & \ddots & 0 \\ 0 & \cdots & \cdots & l_{n-1 n-2} & 1 & 0 \\ 0 & \cdots & \cdots & 0 & l_{n n-1} & 1 \\ \end{bmatrix}
и
- U = \begin{bmatrix} u_{11} & u_{12} & 0 & \cdots & \cdots & 0 \\ 0 & u_{22} & u_{23}& \cdots & \cdots & 0 \\ 0 & 0 & u_{33} & \cdots & \cdots & 0 \\ \vdots & \vdots & \ddots & \ddots & \ddots & 0 \\ 0 & \cdots & \cdots & 0 & u_{n-1 n-1} & u_{n-1 n} \\ 0 & \cdots & \cdots & 0 & 0 & u_{n n} \\ \end{bmatrix}
Важным моментом является то, что в условиях точных вычислений алгоритм сдваивания Стоуна вычисляет то же самое разложение, что и компактная схема метода Гаусса.
Теоретически метод Стоуна основан на том, что, если ввести величины q_i так, что q_0 = 1, q_1 = a_{11} и q_i = a_{ii} q_{i-1} - a_{ii-1}a_{i-1i} q_{i-2}, то после вычисления всех q_i легко вычислить все u_{ii} = q_i/q_{i-1}, l_{ii-1} = a_{ii-1}/u_{i-1i-1}. При этом не нужно вычислять u_{ii+1} = a_{ii+1}.
Вычисление всех q_i производится с использованием ассоциативности матричного умножения. Из рекуррентной связи q_i = a_{ii} q_{i-1} - a_{ii-1}a_{i-1i} q_{i-2} следует матричное равенство
- \begin{bmatrix} q_i \\ q_{i-1} \\ \end{bmatrix} = \begin{bmatrix} a_{ii} & -a_{ii-1}a_{i-1i} \\ 1 & 0 \\ \end{bmatrix} \begin{bmatrix} q_{i-1} \\ q_{i-2} \\ \end{bmatrix} = T_i \begin{bmatrix} q_{i-1} \\ q_{i-2} \\ \end{bmatrix} = T_i T_{i-1}...T_2 \begin{bmatrix} q_{1} \\ q_{0} \\ \end{bmatrix} = T_i T_{i-1}...T_2 \begin{bmatrix} a_{11} \\ 1 \\ \end{bmatrix}
Произведения матриц T_i T_{i-1}...T_2 вычисляются параллельной схемой сдваивания. При этом благодаря тому, что вторая строка всех матриц T_i равна первой строке единичной матрицы, вторая строка произведения T_i T_{i-1}...T_k совпадает с первой строкой произведения T_{i-1}...T_k, что позволяет сэкономить вычисления вдвое против перемножения неособенных матриц этого же порядка.
![](https://algowiki-project.org/algowiki/pool/images/thumb/2/2e/DoublingPartUniver.png/600px-DoublingPartUniver.png)
1.2 Математическое описание алгоритма
Вначале полагается для всех i от 2 до n
p_i = a_{ii}, r_i = -a_{ii-1}a_{i-1i},
а также
p_1 = 0, r_1 = 1.
Затем вычисления на каждом шаге (номер шага обозначим k) ведутся так:
начиная с i с 2, пропускают 2^{k-1} чисел, а потом для 2^{k-1} чисел берут ближайшее для них снизу j вида j = 1 + 2^{k} m .
Для первого шага перевычисляются новые значения p_i, r_i по формулам: p^{new}_i = p_i p_{i-1}, r^{new}_i = p_i r_{i-1} + r_i, а для остальных шагов - по формулам p^{new}_i = p_i p_{j}+r_i p_{j-1}, r^{new}_i = p_i r_{j} + r_i r_{j-1}.
Затем опять пропускают 2^{k-1} чисел, повторяют для 2^{k-1} чисел такие же вычисления, и так до исчерпания диапазона всего значений i от 2 до n.
Шаги повторяют до тех пор, пока не оказывается, что нужно пропустить все значения i от 2 до n. После этого выполняют вычисления
q_i = p_i a_{11} + r_i для всех i от 1 до n и затем u_{ii} = q_i/q_{i-1}, l_{ii-1} = a_{ii-1}/u_{i-1i-1} для всех i от 2 до n.
1.3 Вычислительное ядро алгоритма
Вычислительное ядро алгоритма составляют в основной части операции типа ab+cd и ab+c, с небольшой добавкой отдельных умножений и делений. Изолированные длинные ветви вычислений отсутствуют.
1.4 Макроструктура алгоритма
На макроуровне можно выделить такие 4 макрооперации: вычисление элементов матриц T_i, вычисление сдваиванием произведений матриц T_{i}, вычисление результатов.
1.5 Схема реализации последовательного алгоритма
Метод Стоуна изначально спроектирован для параллельного исполнения, поскольку является по отношению к, например, классической прогонке, алгоритмом с избыточными вычислениями. Смысла в его последовательной реализации нет ещё и из-за того, что он неустойчив.
1.6 Последовательная сложность алгоритма
Для полного выполнения алгоритма Стоуна и получения разложения трёхдиагональной матрицы на две двудиагональные нужно выполнить:
- 2n-2 делений,
- 2(n-1)\lceil \log_2 (n-1) \rceil + o((n-1)\lceil \log_2 (n-1) \rceil) умножений,
- (n-1)\lceil \log_2 (n-1) \rceil +o((n-1)\lceil \log_2 (n-1) \rceil) сложений.
Поэтому алгоритм должен быть отнесён к алгоритмам линейно-логарифмической сложности по количеству последовательных операций.
1.7 Информационный граф
Как уже отмечено, макроструктура алгоритма состоит из 4 частей.
В первой части производится вычисление недиагональных элементов матриц T_{i}.
Во второй части - вычисление сдваиванием произведений матриц T_{i}, оно показано на рисунке 1 и использует результаты 1й части.
В третьей, последней, части - вычисление результатов, с использованием результатов 2й части.
Внутренние графы 1й и 3й частей - пусты, их операции в зависимости только со 2й частью.
1.8 Ресурс параллелизма алгоритма
На критическом пути алгоритма Стоуна для LU-разложения трёхдиагональной матрицы нужно выполнить:
- 1 ярус делений,
- \lceil \log_2 (n-1) \rceil+1 ярусов умножений,
- \lceil \log_2 (n-1) \rceil+1 ярусов сложений.
Поэтому алгоритм должен быть отнесён к алгоритмам логарифмической сложности по количеству последовательных операций. Ширина яруса равна n, поэтому алгоритм должен быть отнесён к алгоритмам линейной сложности по ширине ярусов.
1.9 Входные и выходные данные алгоритма
Входные данные: трёхдиагональная матрица A (элементы a_{ij}).
Объём входных данных: 3n-2. В разных реализациях размещение для экономии хранения может быть выполнено разным образом. Например, каждая диагональ может быть строкой массива.
Выходные данные: нижняя двухдиагональная матрица L (элементы l_{ij}, причём l_{ii}=1) и верхняя двухдиагональная матрица U (элементы u_{ij}).
Объём выходных данных: формально 3n-2. Однако благодаря совпадению n входных и выходных данных реально вычисляется лишь 2n-2 элементов.
1.10 Свойства алгоритма
Соотношение последовательной и параллельной сложности, как хорошо видно, равно O(n).
При этом вычислительная мощность алгоритма как отношение числа операций к суммарному объему входных и выходных данных является логарифмической.
Алгоритм в рамках выбранной версии полностью детерминирован.
Устойчивость алгоритма остаётся только при условии невозрастания ведущих главных миноров матрицы. При росте миноров область устойчивости алгоритма очень мала.
2 Программная реализация алгоритма
2.1 Особенности реализации последовательного алгоритма
Из-за большой избыточности вычислений алгоритм сдваивания Стоуна никогда не предназначался для последовательной реализации. После обнаружения его неустойчивости стало ясно, что и в будущем он не будет реализован на последовательных архитектурах.
2.2 Возможные способы и особенности параллельной реализации алгоритма
Из-за неустойчивости алгоритма любые способы реализации теряют смысл.
Хотя исследование локальности и не имеет смысла из-за неустойчивости, можно сказать, что, как видно по графу алгоритма, ряд дуг длинны как по времени (по различию номеров ярусов операций, являющихся началом и концом дуги), так и по пространству (исключением является только размещение в гиперкубе, физически невозможное). Эта неустранимая нелокальность должна тормозить исполнение алгоритма. Реальное же исследование последовательного кода на обращения в память проводить бессмысленно, поскольку последовательный код не применяется и не будет применяться никем.
Из-за неустойчивости алгоритма не имеют смысла любые замеры эффективности любых его реализаций и их динамических характеристик. Кроме того, из-за избыточности вычислений ясно, что реальная эффективность будет существенно ограничена даже при малых размерах задач, где неустойчивость ещё не сказывается.
Из-за неустойчивости алгоритма его не используют на практике, поэтому планировавшаяся в исходной публикации[3] замена более популярной циклической редукции не удалась.
2.3 Результаты прогонов
2.4 Выводы для классов архитектур
На области относительно приемлемых ошибок (малые размеры задач) у метода всё равно нет шансов на нормальную реализацию - быстрее будет СЛАУ прогонкой на обычной персоналке решить.
3 Литература
- ↑ Воеводин В.В. Вычислительные основы линейной алгебры. М.: Наука, 1977.
- ↑ Воеводин В.В., Кузнецов Ю.А. Матрицы и вычисления. М.: Наука, 1984.
- ↑ Перейти обратно: 3,0 3,1 Stone H.S. An Efficient Parallel Algorithm for the Solution of a Tridiagonal Linear System of Equations // J. ACM, Vol. 20, No. 1 (Jan. 1973), P. 27-38.