Участник:Pandvik/Ортогонализация Грама - Шмидта: различия между версиями
Vvf63 (обсуждение | вклад) |
Pandvik (обсуждение | вклад) (Заполнен раздел "Ресурс параллелизма алгоритма") |
||
Строка 68: | Строка 68: | ||
== Ресурс параллелизма алгоритма == | == Ресурс параллелизма алгоритма == | ||
+ | |||
+ | На основе графа зависимости по данным, представленном на Рис. 1 или Рис. 2 раздела [[#Информационный граф]] можно выделить следующий ресурс параллелизма. После вычисления <math>b_{i}</math> можно начинать параллельно вычислять все <math>proj_{b_i}a_{j}</math>. На Рис. 2 блоки, которые можно вычислять параллельно представлены столбцами. | ||
+ | |||
+ | Кроме того, при очень больших размерностях можно также распараллелить вычисление проекций. Так как в функции проекции участвует пара векторов <math>a</math> и <math>b</math>, а сама операция проекции определяется как <math>\mathbf{proj}_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b</math>, где <math>\left \langle a,b \right \rangle</math> - скалярное произведение векторов <math>a</math> и <math>b</math>, то с помощью использования векторных операций можно получить некоторый выигрыш в производительности. | ||
+ | |||
+ | === Оценка ускорения параллельной реализации алгоритма === | ||
+ | |||
+ | Рассмотрим случай, когда присутствует возможность запуска бесконечного числа потоков. Попробуем оценить сложность вычисления ортогональных векторов, при условии, что параллельно будут запускаться все проекции использующие одинаковую <math>b_i</math>. В этом случае, останется единственный путь зависимости по данным: <math>b_1 \leftarrow proj_{b_2}a_{2} \leftarrow b_2 \leftarrow proj_{b_3}a_{3} \leftarrow \ldots \leftarrow proj_{b_{N-1}}a_{N-1} \leftarrow b_N</math>. Следовательно для оценки сложность распараллеленной версии алгоритма достаточно почитать сложность представленной цепочки вычислений. | ||
+ | |||
+ | В одной проекции <math>N*3</math> умножения, <math>(N-1)*2</math> сложения и 1 деление. В цепочке зависимости данных присутствует <math>N-1</math> проекция. Значит всего <math>N*N*3</math> умножения, <math>N*(N-1)*2</math> сложения и <math>N*1</math> деления. Получаем итоговую сложность <math>O(N^{2})</math>. | ||
== Входные и выходные данные алгоритма == | == Входные и выходные данные алгоритма == |
Версия 22:49, 13 октября 2016
Авторы описания алгоритма: Павлов Андрей, Филимонов Владимир.
Содержание
- 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 Общее описание алгоритма
В конечномерном евклидовом пространстве существует ортонормированный базис.
Для доказательства этого факта требуется находить и строить такие базисы. Построить ортонормированный базис можно, отталкиваясь от некоторого исходного базиса, при помощи алгоритма, который называют процессом ортогонализации Грама — Шмидта.
Процесс ортогонализации Грама-Шмидта используется для квадратных матриц, которые преобразуются, либо уже преобразованы, к верхнему(нижнему) треугольному виду.
Процесс ортогонализации Грама-Шмидта нашёл применение в оптимизации оценивания параметров моделей управления объектом, в протоколах безопасности, в обработке сигналов, в вычислении локальных минимумов целочисленных решёток и многом другом.
Обычно, процесс ортогонализации используется как промежуточный шаг в других алгоритмах для уменьшения количества вычислений.
1.2 Математическое описание алгоритма
Исходные данные: квадратная матрица A с линейно независимыми векторами \mathbf{a}_1,...,\mathbf{a}_N.
Определяется оператор проекции \mathbf{proj}_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b, где \left \langle a,b \right \rangle - скалярное произведение векторов a и b. Данный оператор используется для проецирования вектора a коллинеарно вектору b.
\mathbf{b}_1 = \mathbf{a}_1
\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2
\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3
\mathbf{b}_4 = \mathbf{a}_4 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_4 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_4 - \mathbf{proj}_{\mathbf{b}_3} \mathbf{a}_4
\vdots
\mathbf{b}_N = \mathbf{a}_N - \sum_{j=1}^{N-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_N
На основе каждого вектора \mathbf{b}_j (j = 1 \cdots N) может быть получен нормированный вектор \mathbf{e}_j = \frac{\mathbf{b}_j}{||\mathbf{b}_j||}.
Результаты процесса ортогонализации Грама-Шмидта: \mathbf{b}_1\cdots\mathbf{b}_N - система ортогональных векторов либо система ортонормированных векторов \mathbf{e}_1\cdots\mathbf{e}_N.
1.3 Вычислительное ядро алгоритма
1.4 Макроструктура алгоритма
1.5 Схема реализации последовательного алгоритма
1. \mathbf{b}_1 = \mathbf{a}_1
2. \mathbf{b}_i = \mathbf{a}_i - \sum_{j=1}^{i-1} \mathbf{proj}_{\mathbf{b}_{i-1}} \mathbf{a}_i (i = 2 \cdots N), для каждого \mathbf{proj}_b a выполняется \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle}b.
1.6 Последовательная сложность алгоритма
Последовательный алгоритм требует:
{\color{Blue}\bullet} \quad \frac{n(n-1)}{2}n - вычитаний;
{\color{Blue}\bullet} \quad \frac{n(n-1)}{2}n - делений;
{\color{Blue}\bullet} \quad n \cdot 2 \cdot (n-1)(n-2) - умножений.
1.7 Информационный граф
Опишем информационный граф алгоритма.
Для вычисления b_i требуется найти proj_{b_{j}}a_{i} для всех j \in [1, i]. Следовательно для полного вычисления вектора b_{i} требуется знать все b_{j} с меньшим индексом. Такая зависимость по данным очень не удачна для параллелизма. Однако, если разбить процесс вычисления b_{i} на несколько этапов, соответствующих функциям проекции (proj_{b_{j}}a_{i}), то это позволит производить некоторые предварительные вычисления для b_{j} до момента, когда станут известны все предшествующие ей b_{i}.
На Рис. 1 изображена зависимость каждого из этапов от предыдущих вычислений. Первая строка овалов содержит все проекции, зависящие от b_{1}, вторая строка - все проекции, зависящие от b_{2}, \;\cdots\; самая верхняя строка содержит проекцию, которая зависит от b_{N-1}.
Рис. 2 показывает зависимость по данным немного в другом формате. Каждая строка представляет собой набор данных, которые требуются для вычисления b_{i} из первого столбца. Второй и последующие столбцы группируют проекции, зависящие от одной из b_{i} и, с помощью стрелки, показывают эту зависимость.
1.8 Ресурс параллелизма алгоритма
На основе графа зависимости по данным, представленном на Рис. 1 или Рис. 2 раздела #Информационный граф можно выделить следующий ресурс параллелизма. После вычисления b_{i} можно начинать параллельно вычислять все proj_{b_i}a_{j}. На Рис. 2 блоки, которые можно вычислять параллельно представлены столбцами.
Кроме того, при очень больших размерностях можно также распараллелить вычисление проекций. Так как в функции проекции участвует пара векторов a и b, а сама операция проекции определяется как \mathbf{proj}_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b, где \left \langle a,b \right \rangle - скалярное произведение векторов a и b, то с помощью использования векторных операций можно получить некоторый выигрыш в производительности.
1.8.1 Оценка ускорения параллельной реализации алгоритма
Рассмотрим случай, когда присутствует возможность запуска бесконечного числа потоков. Попробуем оценить сложность вычисления ортогональных векторов, при условии, что параллельно будут запускаться все проекции использующие одинаковую b_i. В этом случае, останется единственный путь зависимости по данным: b_1 \leftarrow proj_{b_2}a_{2} \leftarrow b_2 \leftarrow proj_{b_3}a_{3} \leftarrow \ldots \leftarrow proj_{b_{N-1}}a_{N-1} \leftarrow b_N. Следовательно для оценки сложность распараллеленной версии алгоритма достаточно почитать сложность представленной цепочки вычислений.
В одной проекции N*3 умножения, (N-1)*2 сложения и 1 деление. В цепочке зависимости данных присутствует N-1 проекция. Значит всего N*N*3 умножения, N*(N-1)*2 сложения и N*1 деления. Получаем итоговую сложность O(N^{2}).
1.9 Входные и выходные данные алгоритма
1.10 Свойства алгоритма
2 ЧАСТЬ. Программная реализация алгоритма
2.1 Особенности реализации последовательного алгоритма
2.2 Локальность данных и вычислений
2.3 Возможные способы и особенности параллельной реализации алгоритма
2.4 Масштабируемость алгоритма и его реализации
2.5 Динамические характеристики и эффективность реализации алгоритма
2.6 Выводы для классов архитектур
2.7 Существующие реализации алгоритма
Существует реализация процесса отртогонализации Грама-Шмидта, которая является вычислительно более устойчивой, такая реализации имеет название Модифицированный процесс Грама-Шмидта.