Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией
![]() | Эта работа прошла предварительную проверку Дата последней правки страницы: 04.10.2017 Данная работа соответствует формальным критериям. Проверено ASA. |
Алгоритм Ланцоша с полной переортогонализацией | |
Последовательный алгоритм | |
Последовательная сложность | O(n^2k) |
Объём входных данных | \frac{n(n + 1)}{2} |
Объём выходных данных | k(n + 1) |
Авторы: А.В.Ерошкин (ссылкаКод), М.М.Маликов (ссылка)
Содержание
- 1 Свойства и структура алгоритма
- 1.1 Общее описание алгоритма
- 1.2 Математическое описание алгоритма
- 1.3 Вычислительное ядро алгоритма
- 1.4 Макроструктура алгоритма
- 1.5 Схема реализации последовательного алгоритма
- 1.6 Последовательная сложность алгоритма
- 1.7 Информационный граф
- 1.8 Ресурс параллелизма алгоритма
- 1.9 Входные и выходные данные алгоритма
- 1.10 Свойства алгоритма
- 2 Программная реализация алгоритма
- 2.1 Особенности реализации последовательного алгоритма
- 2.2 Локальность данных и вычислений
- 2.3 Возможные способы и особенности параллельной реализации алгоритма
- 2.4 Масштабируемость алгоритма и его реализации
- 2.5 Динамические характеристики и эффективность реализации алгоритма
- 2.6 Выводы для классов архитектур
- 2.7 Существующие реализации алгоритма
- 3 Литература
1 Свойства и структура алгоритма
1.1 Общее описание алгоритма
Алгоритм Ланцоша - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы A размера n*n, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра k \lt \lt n, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа k (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших n.
1.2 Математическое описание алгоритма
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] . Входные данные алгоритма: квадратная симметричная матрица A размерности n*n, вектор начального приближения b, а так же число итераций k. Метод осуществляет поиск трехдиагональной симметричной матрицы T_k=Q_k^TAQ_k.
T_k=\begin{bmatrix} \alpha_1 & \beta_2 \\ \beta_2 & \alpha_2 & \beta_3 &\\ &. & . & .\\ &&\beta_{k-1} & \alpha_{k-1} & \beta_k\\ &&&\beta_k & \alpha_k \end{bmatrix}
Описание метода:
\begin{array}{l} q_1 = b / \Vert b \Vert_2\\ j = \overline{1, k}:\\ \quad z_j = A q_j \\ \quad \alpha_j = q_j^T z_j \\ \quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\ \quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\ \quad \beta_j = \Vert z_j \Vert_2\\ \quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j \end{array}
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы T_k=Q_k^TAQ_k. Ее собственные значения приближают собственные значения исходной матрицы. Пусть Tk=V\LambdaVT - спектральное разложение матрицы Tk, тогда столбцы матрицы QkV рассматриваются как приближения к соответствующим собственным векторам матрицы A и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы A.
Поиск собственных значений матрицы T намного легче, чем для исходной матрицы, так как предполагается, что k \lt \lt n, и матрица T - трехдиагональная.
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор qj+1 ортогонален уже имеющимся векторам q1..j. Без этого процесса будут накапливаться существенные вычислительный ошибки.
1.3 Вычислительное ядро алгоритма
Вычислительным ядро алгоритма состоит ииз двух основных частей:
- Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i) - умножение симметричной матрицы A размерности n*n на вектор q размерности n.
- z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i. - процесс ортогонализации Грама-Шмидта.
1.4 Макроструктура алгоритма
Основные операции алгоритма:
1. Перемножение матрицы на вектор. b=Ax.
2. Двойная ортогонализация методом Грмма-Шмидта. z=z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i, z=z-\alpha_jq_j-\beta_{j}q_{j-1}.
3. Вычисление обновленного базисного вектора. q_{i+1} = z/ \beta.
1.5 Схема реализации последовательного алгоритма
В параграфе 1.2 приводится полная схема последовательного алгоритма.
Заполняем начальные значения алгоритма (b - начальное преближение).
\begin{align} & q_1=b/||b||,\\ & \beta_1=0,\\ &q_0=0, \\ \end{align}
Для всех j=1..k:
- 1. Вычисляется j-й диагональный элемент матрицы T_k: z=Aq_j; \alpha_j=q_j^Tz;
- 2. Проводится полная переортогонализация Грамма-Шмидта: z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;
- 3. Вычисляются значения \beta_{j+1} матрицы T_k: \beta_{j+1}=||z||;
- 4. Если \beta_{j+1}=0, то алгоритм завершается;
- 5. Сохраняем значения для следующей итерации q_{j+1}=z/\beta_{j+1}.
1.6 Последовательная сложность алгоритма
- 1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы A размерности n*n на вектор q размерности n - вычислительная сложность: n^2 умножений и n^2-n сложений. Остальные операции основного цикла производят меньше n^2 операций сложения или умножения. Так как умножение матрицы на вектор производится k раз, то сложность этой части алгоритма - O(kn^2)
- 2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: k^2n+k(n+2) умножений и k^2n + k(n + 1) + 2 сложений. Производится в цикле k раз. Сложность - O(nk^2)
- 3. Процесс разложения матрицы T размерности k*k. Сложность - O(k^2)
Так как число итераций много меньше размерности матрицы A, k \lt \lt n, то общая сложность алгоритма сокращается до O(kn^2).
1.7 Информационный граф
Черные маленькие стрелочки - куда идут данные.
Большие стрелочки - обозначение прохода по массиву (изменение индекса)
В больших кружках преобразования (операции над данными или вычисления)
В маленьких кружках запись в переменную.
1.8 Ресурс параллелизма алгоритма
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть:
- 1. умножение матрицы размерности n * n на вектор длины n требует последовательного выполнения n ярусов умножений и сложений;
- 2. вычисление \alpha_j требует n ярусов сложений с 1 операцией умножения в каждом;
- 3. переортагонализация требует вычисления j ярусов сложений с n операциями умножения в каждом, n ярусов сложений с j операциями умножения в каждом;
- 4. вычисление нормы вектора длины n требует n ярусов сложений с 1 операцией умножения в каждом.
1.9 Входные и выходные данные алгоритма
Входные данные: A\in\mathbb{R}^{n\times n} - симметричная матрица, т. е. a_{ij}= a_{ji}, i, j = 1, \ldots, n. Объем данных: \frac{n (n + 1)}{2}.
Выходные данные: \Lambda - вектор собственных значений матрицы и соответствующие им собственные вектора v_i,i=1,\ldots, k . Объем данных: k(n+1) .
1.10 Свойства алгоритма
- В классическом алгоритме Ланцоша возникает большая погрешность при округлении чисел с плавающей точкой. Выбранный вариант с полной переортогонализацией устраняет этот недостаток, однако является более ресурсоемким. На практике наиболее популярен вариант с частичной переортогонализацией.
- Вычислительная мощность алгоритма (отношение числа операций к суммарному объему данных) оценивается как \approx 2k.
- Преимуществом алгоритма является то, что он начинает поиск собственных значений матрицы начиная с максимального в абсолютном смысле значения.
- Нет необходимости хранения исходной матрицы на каждом вычислительном ядре, так как метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать регулярность структуры матрицы.
- Существует модифицированный блочный вариант алгоритма, применяемый в случае кратных собственных значений.
2 Программная реализация алгоритма
2.1 Особенности реализации последовательного алгоритма
2.2 Локальность данных и вычислений
2.3 Возможные способы и особенности параллельной реализации алгоритма
2.4 Масштабируемость алгоритма и его реализации
Проверка масштабируемости алгоритма проходила на IBM Blue Gene/P ВМК МГУ.
Используемые компиляторы: intel/15.0.090 и OpenMPI/1.8.4-icc.
Для проведения расчетов и получения полноценной картины поведения алгоритма в зависимости от входных данных и числа процессоров, программа была запущена на следующих параметрах:
- размеры входной матрицы: [5000:30000] c шагом 5000;
- число процессоров: от 1, 2, 4 .. 64.
Сборка осуществлялась с параметрами:
- openmpi/1.5.5-icc
- intel/13.1.0
По графику видно, что время выполнения уменьшается с увеличением количества процессоров примерно до 16, дальше начинает медленно увеличиваться вплоть до 64 и далее. Это можно объяснить тем, что с увеличением количества вычислительных ядер растет количество передаваемых данных, и дальнейшее увеличение их числа только ухудшает положение.
2.5 Динамические характеристики и эффективность реализации алгоритма
2.6 Выводы для классов архитектур
2.7 Существующие реализации алгоритма
The IETL Project http://www.comp-phys.org/software/ietl/ C++
NAG Library http://www.nag.com/content/nag-library C, C++, Fortran, C#, MATLAB, R
ARPACK https://people.sc.fsu.edu/~jburkardt/m_src/arpack/arpack.html MATLAB
GrapLab https://turi.com/products/create/open_source.html C++
LANSO/PLANSO http://web.cs.ucdavis.edu/~bai/ET/lanczos_methods/overview_PLANSO.html Fortran (уже распараллелена)
Julia Math https://github.com/JuliaMath/IterativeSolvers.jl Julia
SciPy https://scipy.org/ Python
3 Литература
Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)
<references \>