Непроверенная

Равномерная норма вектора, вещественная версия, последовательный вариант

Материал из Алговики
Перейти к навигации Перейти к поиску

Описание свойств и структуры алгоритма[править]

Словесное описание алгоритма[править]

Равномерная норма вектора используется в качестве одной из базовых операций в широком круге методов — как для вычисления получаемой ошибки финальных результатов, так и для промежуточных вычислений.

Математическое описание[править]

Исходные данные: одномерный массив [math]\displaystyle{ n }[/math] чисел. Вычисляемые данные: максимум абсолютной величины элементов массива. Формулы метода: для вектора [math]\displaystyle{ \vec{a} }[/math] из [math]\displaystyle{ n }[/math] элементов вычисляется выражение [math]\displaystyle{ \max\limits_i |a_i| }[/math].

При этом в последовательном варианте используется последовательный порядок сравнения элементов (обычно от меньших индексов к большим). Существуют и другие способы вычисления равномерной нормы, но здесь мы их рассматривать не будем.

Вычислительное ядро алгоритма[править]

Вычислительное ядро вычисления равномерной нормы в последовательном варианте можно представить в виде последовательного выбора максимума из уже имеющегося текущего значения и текущего модуля элемента массива.

Макроструктура алгоритма[править]

Как уже записано в описании ядра алгоритма, основную часть вычисления равномерной нормы в последовательном варианте составляет выполнение последовательного выбора максимума из уже имеющегося текущего значения и текущего модуля элемента массива.

Описание схемы реализации последовательного алгоритма[править]

Формулы метода описаны выше. Последовательность исполнения может быть разная — как по возрастанию, так и по убыванию индексов. Обычно без особых причин порядок не меняют, используя естественный (возрастание индексов).

Последовательная сложность алгоритма[править]

Для вычисления равномерной нормы массива, состоящего из [math]\displaystyle{ N }[/math] элементов, количество операций вычисления модуля неизменно и равно [math]\displaystyle{ N }[/math], а количество операций вычисления максимума равно [math]\displaystyle{ N-1 }[/math]. Поэтому алгоритм должен быть отнесён к алгоритмам линейной сложности по количеству последовательных операций.

Информационный граф[править]

Опишем граф алгоритма в виде рисунка. Изображен граф для случая [math]\displaystyle{ n = 6 }[/math].

Вычисление с нормы вектора с экономией вызовов функции максимума

Однако следует отметить, что в большинстве случаев программисты не экономят на одном вызове функции максимума, а инициализируют начальное значение переменной нулём. В этом случае граф становится таким, как на втором рисунке ([math]\displaystyle{ n = 6 }[/math]).

Упрощенная реализация вычисления нормы вектора

Описание ресурса параллелизма алгоритма[править]

Последовательный вариант вычисления равномерной нормы массива, несмотря на название, имеет ресурс параллелизма степени 2. Дело в том, что, если рассматривать отдельно вычисления модуля и максимума, то видно, что при выполнении очередного выбора максимума «подготовительное» отбрасывание знака к следующему можно выполнить заранее. В принципе, можно, если использовать дополнительную память для хранения всех модулей, вообще выполнить все отбрасывания знаков параллельно, а потом последовательно выполнить выбор максимального из вычисленных абсолютных величин. Таким образом, в получившемся алгоритме высота параллельной формы будет равна 1 операции вычисления функции ABS плюс [math]\displaystyle{ N-1 }[/math] операций выбора максимума. В таком виде алгоритм должен быть отнесён к алгоритмам линейной сложности как по высоте, так и по ширине параллельной формы. Однако если мы будем последовательно выполнять и вычисления абсолютных величин, то ширина параллельной формы может быть уменьшена до 2, что даёт нам постоянную сложность по ширине параллельной формы.

Описание входных и выходных данных[править]

Входные данные: массив [math]\displaystyle{ a }[/math] (элементы [math]\displaystyle{ a_i }[/math]).

Дополнительные ограничения: отсутствуют.

Объём входных данных: [math]\displaystyle{ n }[/math].

Выходные данные: максимум модулей элементов массива.

Объём выходных данных: один скаляр.

Свойства алгоритма[править]

Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является константой (2). При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных — всего-навсего 1 (входных и выходных данных почти столько же, сколько операций; если точнее — даже больше на 2). При этом алгоритм полностью детерминирован. Дуги информационного графа локальны. Важной особенностью алгоритма является то, что его видоизменение и переход к другому графу никак не повлияет на ошибки округления результата, поскольку функция максимума, в отличие от базовой арифметики (сложения и умножения) остаётся ассоциативной и в условиях действия машинного округления.

Программная реализация[править]

Особенности реализации последовательного алгоритма[править]

В простейшем (входные данные — вектор) варианте на Фортране можно записать так:

	NORMX = ABS(A(1))
	DO I = 2,N
		NORMX = MAX( NORMX, ABS(A(I)) )
	END DO

В варианте с «холостым» выбором максимума запись такая:

	NORMX = 0.
	DO I = 1,N
		NORMX = MAX( NORMX, ABS(A(I)) )
	END DO

Описание локальности данных и вычислений[править]

Описание локальности алгоритма[править]

Описание локальности реализации алгоритма[править]

Описание структуры обращений в память и качественная оценка локальности[править]
Количественная оценка локальности[править]
Анализ на основе теста Apex-Map[править]

Возможные способы и особенности реализации параллельного алгоритма[править]

Масштабируемость алгоритма и его реализации[править]

Описание масштабируемости алгоритма[править]

Описание масштабируемости реализации алгоритма[править]

Динамические характеристики и эффективность реализации алгоритма[править]

Выводы для классов архитектур[править]

Существующие реализации алгоритма[править]

Помимо выписанных выше простейших реализаций, существуют более сложные коды, реализующие тот же алгоритм. Это объясняется тем, что порой чисто программистскими приёмами оптимизируют работу с регистрами, с кэшем и т. п. В частности, даже в Линпаке есть разные реализации кода — из BLAS или другие варианты. Большинство их сводится к сведению одинарного цикла длиной [math]\displaystyle{ n }[/math] к двойному циклу либо к одинарному с меньшим числом итераций, но более длинной операцией в теле цикла. Между тем, разбиения циклов на группы могут быть полезны и для лучшего использования кэша на отдельных узлах, когда самих равномерных норм вычисляется сразу много и распараллеливание программы состоит в их распределении между узлами.