<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nikkou</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nikkou"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Nikkou"/>
	<updated>2026-10-22T16:10:18Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=25056</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=25056"/>
		<updated>2017-12-08T08:48:17Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру в основном составляют:&lt;br /&gt;
&lt;br /&gt;
1) двумерные свертки, приведенные в математическом описании;&lt;br /&gt;
&lt;br /&gt;
2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.&lt;br /&gt;
&lt;br /&gt;
Эти элементы алгоритма приведены в разделе с математическим описанием.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Запись на C++-подобном псевдокоде:&lt;br /&gt;
&amp;lt;pre&amp;gt;float *sobel(float *img) {&lt;br /&gt;
    // Оператор собеля разложим на одномерные свертки с ядрами [1, 0, -1] и [1, 2, 1]&lt;br /&gt;
    // Здесь они обозначены как соответственно diff_kernel и sum_kernel&lt;br /&gt;
    horiz_der = conv(img, diff_kernel, sum_kernel); // Аппроксимация производной по горизонтальному направлению&lt;br /&gt;
    vert_der = conv(img, sum_kernel, diff_kernel); // Аппроксимация производной по вертикальному направлению&lt;br /&gt;
    return combine_horiz_vert(horiz_der, vert_der);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; n_images; i++) {&lt;br /&gt;
    img = get_input(i); // Чтение изображения с диска&lt;br /&gt;
    res = sobel(img);&lt;br /&gt;
    write_result(res); // Запись результата на диск&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для повышения производительности в последовательной реализации всегда следует использовать сепарабельность свертки и считать двумерную свертку как композицию из одномерных.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;O(M\cdot N \cdot K)&amp;lt;/math&amp;gt; при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Graph.png]]&lt;br /&gt;
&lt;br /&gt;
Группы вершин:&lt;br /&gt;
&lt;br /&gt;
1) выполняет операцию чтения изображения с диска. Количество вершин равно количеству изображений K.&lt;br /&gt;
&lt;br /&gt;
2) выполняет горизонтальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
3) выполняет вертикальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
4) комбинирует частичные результаты.&lt;br /&gt;
&lt;br /&gt;
5) записывает результат на диск.&lt;br /&gt;
&lt;br /&gt;
Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.&lt;br /&gt;
&lt;br /&gt;
Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Группы параллельных ветвей:&lt;br /&gt;
&lt;br /&gt;
1) Операции над разными изображениями независимы и образуют массово параллельные ветви.&lt;br /&gt;
&lt;br /&gt;
2) Одномерные свертки в разложении двумерной могут считаться независимо. Это конечный параллелизм.&lt;br /&gt;
&lt;br /&gt;
3) Одномерные свертки можно считать независимо по каждому пикселю - массовый параллелизм. Можно сделать их вычисление параллельным на практике если и не по пикселям, то по крайней мере по специально сконструированным блокам изображения для оптимального выполнения на GPU.&lt;br /&gt;
&lt;br /&gt;
В предположении неограниченной доступности вычислительных узлов алгоритм выполняется за константное время. Последовательными операциями в таком случае являются только чтение, подсчет сверток по направлениям, их комбинация и запись результата на диск.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: K вещественных матриц размером N*M с диапазоном значений от 0 до 1. О структуре данных нельзя делать предположений.&lt;br /&gt;
Выходные данныые: K вещественных матриц размером N*M. Дополнительно можно отнормировать диапазон значений результата для визуализации.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
При обилии входных данных очень легко распределить различные изображения на различные процессы. Но при параллельной обработке одного изображения возникают тонкости, связанные с барьерными синхронизациями между операциями, эффективным использованием быстрой памяти и &amp;quot;разогревом&amp;quot; GPU.&lt;br /&gt;
&lt;br /&gt;
В целом значительных препятствий для распараллеливания нет, что можно видеть по графику слабой масштабируемости.&lt;br /&gt;
&lt;br /&gt;
График сильной масштабируемости:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Strong.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
В силу возможности эффективно распараллелить фильтрацию с ядром Собеля и широких возможностей практического применения, есть&lt;br /&gt;
&lt;br /&gt;
- последовательные реализации (OpenCV)&lt;br /&gt;
&lt;br /&gt;
- параллельные реализации на CUDA для GPU: [https://github.com/JoeLoser/Sobel-Filter-CUDA 1], [https://github.com/JakubDziworski/Cuda-Sobel 2]&lt;br /&gt;
&lt;br /&gt;
- параллельная реализация на MPI для CPU: [https://github.com/cnavarropalos/sobel-mpi ссылка].&lt;br /&gt;
&lt;br /&gt;
Автор статьи написал параллельную реализацию, которая использует и MPI для распределения входных данных по GPU на узлах, и CUDA для эффективного просчета на GPU. За основу был взят [https://github.com/phrb/intro-cuda/tree/master/src/cuda-samples/3_Imaging/convolutionSeparable код примера эффективной реализации сепарабельной двумерной свертки над CUDA] от NVIDIA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Podlozhnyuk, V. (2007). Image convolution with CUDA. NVIDIA Corporation white paper, June, 2097(3).&lt;br /&gt;
&lt;br /&gt;
Ogawa, K., Ito, Y., &amp;amp; Nakano, K. (2010, November). Efficient Canny edge detection using a GPU. In Networking and Computing (ICNC), 2010 First International Conference on (pp. 279-280). IEEE.&lt;br /&gt;
&lt;br /&gt;
Luo, Y., &amp;amp; Duraiswami, R. (2008, June). Canny edge detection on NVIDIA CUDA. In Computer Vision and Pattern Recognition Workshops, 2008. CVPRW&#039;08. IEEE Computer Society Conference on (pp. 1-8). IEEE.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Graph.png&amp;diff=25055</id>
		<title>Файл:Graph.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Graph.png&amp;diff=25055"/>
		<updated>2017-12-08T08:47:57Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=25054</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=25054"/>
		<updated>2017-12-08T08:14:33Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру в основном составляют:&lt;br /&gt;
&lt;br /&gt;
1) двумерные свертки, приведенные в математическом описании;&lt;br /&gt;
&lt;br /&gt;
2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.&lt;br /&gt;
&lt;br /&gt;
Эти элементы алгоритма приведены в разделе с математическим описанием.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Запись на C++-подобном псевдокоде:&lt;br /&gt;
&amp;lt;pre&amp;gt;float *sobel(float *img) {&lt;br /&gt;
    // Оператор собеля разложим на одномерные свертки с ядрами [1, 0, -1] и [1, 2, 1]&lt;br /&gt;
    // Здесь они обозначены как соответственно diff_kernel и sum_kernel&lt;br /&gt;
    horiz_der = conv(img, diff_kernel, sum_kernel); // Аппроксимация производной по горизонтальному направлению&lt;br /&gt;
    vert_der = conv(img, sum_kernel, diff_kernel); // Аппроксимация производной по вертикальному направлению&lt;br /&gt;
    return combine_horiz_vert(horiz_der, vert_der);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; n_images; i++) {&lt;br /&gt;
    img = get_input(i); // Чтение изображения с диска&lt;br /&gt;
    res = sobel(img);&lt;br /&gt;
    write_result(res); // Запись результата на диск&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для повышения производительности в последовательной реализации всегда следует использовать сепарабельность свертки и считать двумерную свертку как композицию из одномерных.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;O(M\cdot N \cdot K)&amp;lt;/math&amp;gt; при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Группы вершин:&lt;br /&gt;
&lt;br /&gt;
1) выполняет операцию чтения изображения с диска. Количество вершин равно количеству изображений K.&lt;br /&gt;
&lt;br /&gt;
2) выполняет горизонтальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
3) выполняет вертикальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
4) комбинирует частичные результаты.&lt;br /&gt;
&lt;br /&gt;
5) записывает результат на диск.&lt;br /&gt;
&lt;br /&gt;
Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.&lt;br /&gt;
&lt;br /&gt;
Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Группы параллельных ветвей:&lt;br /&gt;
&lt;br /&gt;
1) Операции над разными изображениями независимы и образуют массово параллельные ветви.&lt;br /&gt;
&lt;br /&gt;
2) Одномерные свертки в разложении двумерной могут считаться независимо. Это конечный параллелизм.&lt;br /&gt;
&lt;br /&gt;
3) Одномерные свертки можно считать независимо по каждому пикселю - массовый параллелизм. Можно сделать их вычисление параллельным на практике если и не по пикселям, то по крайней мере по специально сконструированным блокам изображения для оптимального выполнения на GPU.&lt;br /&gt;
&lt;br /&gt;
В предположении неограниченной доступности вычислительных узлов алгоритм выполняется за константное время. Последовательными операциями в таком случае являются только чтение, подсчет сверток по направлениям, их комбинация и запись результата на диск.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: K вещественных матриц размером N*M с диапазоном значений от 0 до 1. О структуре данных нельзя делать предположений.&lt;br /&gt;
Выходные данныые: K вещественных матриц размером N*M. Дополнительно можно отнормировать диапазон значений результата для визуализации.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
При обилии входных данных очень легко распределить различные изображения на различные процессы. Но при параллельной обработке одного изображения возникают тонкости, связанные с барьерными синхронизациями между операциями, эффективным использованием быстрой памяти и &amp;quot;разогревом&amp;quot; GPU.&lt;br /&gt;
&lt;br /&gt;
В целом значительных препятствий для распараллеливания нет, что можно видеть по графику слабой масштабируемости.&lt;br /&gt;
&lt;br /&gt;
График сильной масштабируемости:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Strong.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
В силу возможности эффективно распараллелить фильтрацию с ядром Собеля и широких возможностей практического применения, есть&lt;br /&gt;
&lt;br /&gt;
- последовательные реализации (OpenCV)&lt;br /&gt;
&lt;br /&gt;
- параллельные реализации на CUDA для GPU: [https://github.com/JoeLoser/Sobel-Filter-CUDA 1], [https://github.com/JakubDziworski/Cuda-Sobel 2]&lt;br /&gt;
&lt;br /&gt;
- параллельная реализация на MPI для CPU: [https://github.com/cnavarropalos/sobel-mpi ссылка].&lt;br /&gt;
&lt;br /&gt;
Автор статьи написал параллельную реализацию, которая использует и MPI для распределения входных данных по GPU на узлах, и CUDA для эффективного просчета на GPU. За основу был взят [https://github.com/phrb/intro-cuda/tree/master/src/cuda-samples/3_Imaging/convolutionSeparable код примера эффективной реализации сепарабельной двумерной свертки над CUDA] от NVIDIA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Podlozhnyuk, V. (2007). Image convolution with CUDA. NVIDIA Corporation white paper, June, 2097(3).&lt;br /&gt;
&lt;br /&gt;
Ogawa, K., Ito, Y., &amp;amp; Nakano, K. (2010, November). Efficient Canny edge detection using a GPU. In Networking and Computing (ICNC), 2010 First International Conference on (pp. 279-280). IEEE.&lt;br /&gt;
&lt;br /&gt;
Luo, Y., &amp;amp; Duraiswami, R. (2008, June). Canny edge detection on NVIDIA CUDA. In Computer Vision and Pattern Recognition Workshops, 2008. CVPRW&#039;08. IEEE Computer Society Conference on (pp. 1-8). IEEE.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=25053</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=25053"/>
		<updated>2017-12-08T08:10:09Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру в основном составляют:&lt;br /&gt;
&lt;br /&gt;
1) двумерные свертки, приведенные в математическом описании;&lt;br /&gt;
&lt;br /&gt;
2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.&lt;br /&gt;
&lt;br /&gt;
Эти элементы алгоритма приведены в разделе с математическим описанием.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Запись на C++-подобном псевдокоде:&lt;br /&gt;
&amp;lt;pre&amp;gt;float *sobel(float *img) {&lt;br /&gt;
    // Оператор собеля разложим на одномерные свертки с ядрами [1, 0, -1] и [1, 2, 1]&lt;br /&gt;
    // Здесь они обозначены как соответственно diff_kernel и sum_kernel&lt;br /&gt;
    horiz_der = conv(img, diff_kernel, sum_kernel); // Аппроксимация производной по горизонтальному направлению&lt;br /&gt;
    vert_der = conv(img, sum_kernel, diff_kernel); // Аппроксимация производной по вертикальному направлению&lt;br /&gt;
    return combine_horiz_vert(horiz_der, vert_der);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; n_images; i++) {&lt;br /&gt;
    img = get_input(i); // Чтение изображения с диска&lt;br /&gt;
    res = sobel(img);&lt;br /&gt;
    write_result(res); // Запись результата на диск&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для повышения производительности в последовательной реализации всегда следует использовать сепарабельность свертки и считать двумерную свертку как композицию из одномерных.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;O(M\cdot N \cdot K)&amp;lt;/math&amp;gt; при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Группы вершин:&lt;br /&gt;
&lt;br /&gt;
1) выполняет операцию чтения изображения с диска. Количество вершин равно количеству изображений K.&lt;br /&gt;
&lt;br /&gt;
2) выполняет горизонтальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
3) выполняет вертикальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
4) комбинирует частичные результаты.&lt;br /&gt;
&lt;br /&gt;
5) записывает результат на диск.&lt;br /&gt;
&lt;br /&gt;
Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.&lt;br /&gt;
&lt;br /&gt;
Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Группы параллельных ветвей:&lt;br /&gt;
&lt;br /&gt;
1) Операции над разными изображениями независимы и образуют массово параллельные ветви.&lt;br /&gt;
&lt;br /&gt;
2) Одномерные свертки в разложении двумерной могут считаться независимо. Это конечный параллелизм.&lt;br /&gt;
&lt;br /&gt;
3) Одномерные свертки можно считать независимо по каждому пикселю - массовый параллелизм. Можно сделать их вычисление параллельным на практике если и не по пикселям, то по крайней мере по специально сконструированным блокам изображения для оптимального выполнения на GPU.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: K вещественных матриц размером N*M с диапазоном значений от 0 до 1. О структуре данных нельзя делать предположений.&lt;br /&gt;
Выходные данныые: K вещественных матриц размером N*M. Дополнительно можно отнормировать диапазон значений результата для визуализации.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
При обилии входных данных очень легко распределить различные изображения на различные процессы. Но при параллельной обработке одного изображения возникают тонкости, связанные с барьерными синхронизациями между операциями, эффективным использованием быстрой памяти и &amp;quot;разогревом&amp;quot; GPU.&lt;br /&gt;
&lt;br /&gt;
В целом значительных препятствий для распараллеливания нет, что можно видеть по графику слабой масштабируемости.&lt;br /&gt;
&lt;br /&gt;
График сильной масштабируемости:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Strong.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
В силу возможности эффективно распараллелить фильтрацию с ядром Собеля и широких возможностей практического применения, есть&lt;br /&gt;
&lt;br /&gt;
- последовательные реализации (OpenCV)&lt;br /&gt;
&lt;br /&gt;
- параллельные реализации на CUDA для GPU: [https://github.com/JoeLoser/Sobel-Filter-CUDA 1], [https://github.com/JakubDziworski/Cuda-Sobel 2]&lt;br /&gt;
&lt;br /&gt;
- параллельная реализация на MPI для CPU: [https://github.com/cnavarropalos/sobel-mpi ссылка].&lt;br /&gt;
&lt;br /&gt;
Автор статьи написал параллельную реализацию, которая использует и MPI для распределения входных данных по GPU на узлах, и CUDA для эффективного просчета на GPU. За основу был взят [https://github.com/phrb/intro-cuda/tree/master/src/cuda-samples/3_Imaging/convolutionSeparable код примера эффективной реализации сепарабельной двумерной свертки над CUDA] от NVIDIA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Podlozhnyuk, V. (2007). Image convolution with CUDA. NVIDIA Corporation white paper, June, 2097(3).&lt;br /&gt;
&lt;br /&gt;
Ogawa, K., Ito, Y., &amp;amp; Nakano, K. (2010, November). Efficient Canny edge detection using a GPU. In Networking and Computing (ICNC), 2010 First International Conference on (pp. 279-280). IEEE.&lt;br /&gt;
&lt;br /&gt;
Luo, Y., &amp;amp; Duraiswami, R. (2008, June). Canny edge detection on NVIDIA CUDA. In Computer Vision and Pattern Recognition Workshops, 2008. CVPRW&#039;08. IEEE Computer Society Conference on (pp. 1-8). IEEE.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=25052</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=25052"/>
		<updated>2017-12-08T08:09:46Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру в основном составляют:&lt;br /&gt;
&lt;br /&gt;
1) двумерные свертки, приведенные в математическом описании;&lt;br /&gt;
&lt;br /&gt;
2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.&lt;br /&gt;
&lt;br /&gt;
Эти элементы алгоритма приведены в разделе с математическим описанием.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Запись на C++-подобном псевдокоде:&lt;br /&gt;
&amp;lt;pre&amp;gt;float *sobel(float *img) {&lt;br /&gt;
    // Оператор собеля разложим на одномерные свертки с ядрами [1, 0, -1] и [1, 2, 1]&lt;br /&gt;
    // Здесь они обозначены как соответственно diff_kernel и sum_kernel&lt;br /&gt;
    horiz_der = conv(img, diff_kernel, sum_kernel); // Аппроксимация производной по горизонтальному направлению&lt;br /&gt;
    vert_der = conv(img, sum_kernel, diff_kernel); // Аппроксимация производной по вертикальному направлению&lt;br /&gt;
    return combine_horiz_vert(horiz_der, vert_der);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; n_images; i++) {&lt;br /&gt;
    img = get_input(i); // Чтение изображения с диска&lt;br /&gt;
    res = sobel(img);&lt;br /&gt;
    write_result(res); // Запись результата на диск&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для повышения производительности в последовательной реализации всегда следует использовать сепарабельность свертки и считать двумерную свертку как композицию из одномерных.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;O(M\cdot N \cdot K)&amp;lt;/math&amp;gt; при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Группы вершин:&lt;br /&gt;
&lt;br /&gt;
1) выполняет операцию чтения изображения с диска. Количество вершин равно количеству изображений K.&lt;br /&gt;
&lt;br /&gt;
2) выполняет горизонтальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
3) выполняет вертикальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
4) комбинирует частичные результаты.&lt;br /&gt;
&lt;br /&gt;
5) записывает результат на диск.&lt;br /&gt;
&lt;br /&gt;
Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.&lt;br /&gt;
&lt;br /&gt;
Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Группы параллельных ветвей:&lt;br /&gt;
&lt;br /&gt;
1) Операции над разными изображениями независимы и образуют массово параллельные ветви.&lt;br /&gt;
&lt;br /&gt;
2) Одномерные свертки в разложении двумерной могут считаться независимо. Это конечный параллелизм.&lt;br /&gt;
&lt;br /&gt;
3) Одномерные свертки можно считать независимо по каждому пикселю - массовый параллелизм. Можно сделать их вычисление параллельным на практике если и не по пикселям, то по крайней мере по специально сконструированным блокам изображения для оптимального выполнения на GPU.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: K вещественных матриц размером N*M с диапазоном значений от 0 до 1. О структуре данных нельзя делать предположений.&lt;br /&gt;
Выходные данныые: K вещественных матриц размером N*M. Дополнительно можно отнормировать диапазон значений результата для визуализации.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
При обилии входных данных очень легко распределить различные изображения на различные процессы. Но при параллельной обработке одного изображения возникают тонкости, связанные с барьерными синхронизациями между операциями, эффективным использованием быстрой памяти и &amp;quot;разогревом&amp;quot; GPU.&lt;br /&gt;
&lt;br /&gt;
В целом значительных препятствий для распараллеливания нет, что можно видеть по графику слабой масштабируемости.&lt;br /&gt;
&lt;br /&gt;
График сильной масштабируемости:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Strong.PNG]]&lt;br /&gt;
&lt;br /&gt;
График слабой масштабируемости:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Weak.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
В силу возможности эффективно распараллелить фильтрацию с ядром Собеля и широких возможностей практического применения, есть&lt;br /&gt;
&lt;br /&gt;
- последовательные реализации (OpenCV)&lt;br /&gt;
&lt;br /&gt;
- параллельные реализации на CUDA для GPU: [https://github.com/JoeLoser/Sobel-Filter-CUDA 1], [https://github.com/JakubDziworski/Cuda-Sobel 2]&lt;br /&gt;
&lt;br /&gt;
- параллельная реализация на MPI для CPU: [https://github.com/cnavarropalos/sobel-mpi ссылка].&lt;br /&gt;
&lt;br /&gt;
Автор статьи написал параллельную реализацию, которая использует и MPI для распределения входных данных по GPU на узлах, и CUDA для эффективного просчета на GPU. За основу был взят [https://github.com/phrb/intro-cuda/tree/master/src/cuda-samples/3_Imaging/convolutionSeparable код примера эффективной реализации сепарабельной двумерной свертки над CUDA] от NVIDIA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Podlozhnyuk, V. (2007). Image convolution with CUDA. NVIDIA Corporation white paper, June, 2097(3).&lt;br /&gt;
&lt;br /&gt;
Ogawa, K., Ito, Y., &amp;amp; Nakano, K. (2010, November). Efficient Canny edge detection using a GPU. In Networking and Computing (ICNC), 2010 First International Conference on (pp. 279-280). IEEE.&lt;br /&gt;
&lt;br /&gt;
Luo, Y., &amp;amp; Duraiswami, R. (2008, June). Canny edge detection on NVIDIA CUDA. In Computer Vision and Pattern Recognition Workshops, 2008. CVPRW&#039;08. IEEE Computer Society Conference on (pp. 1-8). IEEE.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24848</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24848"/>
		<updated>2017-12-02T17:42:28Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру в основном составляют:&lt;br /&gt;
&lt;br /&gt;
1) двумерные свертки, приведенные в математическом описании;&lt;br /&gt;
&lt;br /&gt;
2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.&lt;br /&gt;
&lt;br /&gt;
Эти элементы алгоритма приведены в разделе с математическим описанием.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Запись на C++-подобном псевдокоде:&lt;br /&gt;
&amp;lt;pre&amp;gt;float *sobel(float *img) {&lt;br /&gt;
    // diff_kernel is [1, 0, -1]; sum_kernel is [1, 2, 1]&lt;br /&gt;
    horiz_der = conv(img, diff_kernel, sum_kernel);&lt;br /&gt;
    vert_der = conv(img, sum_kernel, diff_kernel);&lt;br /&gt;
    return combine_horiz_vert(horiz_der, vert_der);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; n_images; i++) {&lt;br /&gt;
	img = get_input(i);&lt;br /&gt;
	res = sobel(img);&lt;br /&gt;
	write_result(res);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для повышения производительности в последовательной реализации всегда следует использовать сепарабельность свертки и считать двумерную свертку как композицию из одномерных.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;O(M\cdot N \cdot K)&amp;lt;/math&amp;gt; при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Группы вершин:&lt;br /&gt;
&lt;br /&gt;
1) выполняет операцию чтения изображения с диска. Количество вершин равно количеству изображений K.&lt;br /&gt;
&lt;br /&gt;
2) выполняет горизонтальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
3) выполняет вертикальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
4) комбинирует частичные результаты.&lt;br /&gt;
&lt;br /&gt;
5) записывает результат на диск.&lt;br /&gt;
&lt;br /&gt;
Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.&lt;br /&gt;
&lt;br /&gt;
Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Группы параллельных ветвей:&lt;br /&gt;
&lt;br /&gt;
1) Операции над разными изображениями независимы и образуют массово параллельные ветви.&lt;br /&gt;
&lt;br /&gt;
2) Одномерные свертки в разложении двумерной могут считаться независимо. Это конечный параллелизм.&lt;br /&gt;
&lt;br /&gt;
3) Одномерные свертки можно считать независимо по каждому пикселю - массовый параллелизм. Можно сделать их вычисление параллельным на практике если и не по пикселям, то по крайней мере по специально сконструированным блокам изображения для оптимального выполнения на GPU.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: K вещественных матриц размером N*M с диапазоном значений от 0 до 1. О структуре данных нельзя делать предположений.&lt;br /&gt;
Выходные данныые: K вещественных матриц размером N*M. Дополнительно можно отнормировать диапазон значений результата для визуализации.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
При обилии входных данных очень легко распределить различные изображения на различные процессы. Но при параллельной обработке одного изображения возникают тонкости, связанные с барьерными синхронизациями между операциями, эффективным использованием быстрой памяти и &amp;quot;разогревом&amp;quot; GPU.&lt;br /&gt;
&lt;br /&gt;
В целом значительных препятствий для распараллеливания нет, что можно видеть по графику слабой масштабируемости.&lt;br /&gt;
&lt;br /&gt;
График сильной масштабируемости:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Strong.PNG]]&lt;br /&gt;
&lt;br /&gt;
График слабой масштабируемости:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Weak.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
В силу возможности эффективно распараллелить фильтрацию с ядром Собеля и широких возможностей практического применения, есть&lt;br /&gt;
&lt;br /&gt;
- последовательные реализации (OpenCV)&lt;br /&gt;
&lt;br /&gt;
- параллельные реализации на CUDA для GPU: [https://github.com/JoeLoser/Sobel-Filter-CUDA 1], [https://github.com/JakubDziworski/Cuda-Sobel 2]&lt;br /&gt;
&lt;br /&gt;
- параллельная реализация на MPI для CPU: [https://github.com/cnavarropalos/sobel-mpi ссылка].&lt;br /&gt;
&lt;br /&gt;
Автор статьи написал параллельную реализацию, которая использует и MPI для распределения входных данных по GPU на узлах, и CUDA для эффективного просчета на GPU. За основу был взят [https://github.com/phrb/intro-cuda/tree/master/src/cuda-samples/3_Imaging/convolutionSeparable код примера эффективной реализации сепарабельной двумерной свертки над CUDA] от NVIDIA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
Podlozhnyuk, V. (2007). Image convolution with CUDA. NVIDIA Corporation white paper, June, 2097(3).&lt;br /&gt;
&lt;br /&gt;
Ogawa, K., Ito, Y., &amp;amp; Nakano, K. (2010, November). Efficient Canny edge detection using a GPU. In Networking and Computing (ICNC), 2010 First International Conference on (pp. 279-280). IEEE.&lt;br /&gt;
&lt;br /&gt;
Luo, Y., &amp;amp; Duraiswami, R. (2008, June). Canny edge detection on NVIDIA CUDA. In Computer Vision and Pattern Recognition Workshops, 2008. CVPRW&#039;08. IEEE Computer Society Conference on (pp. 1-8). IEEE.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24847</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24847"/>
		<updated>2017-12-02T17:39:12Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру в основном составляют:&lt;br /&gt;
&lt;br /&gt;
1) двумерные свертки, приведенные в математическом описании;&lt;br /&gt;
&lt;br /&gt;
2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.&lt;br /&gt;
&lt;br /&gt;
Эти элементы алгоритма приведены в разделе с математическим описанием.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Запись на C++-подобном псевдокоде:&lt;br /&gt;
&amp;lt;pre&amp;gt;float *sobel(float *img) {&lt;br /&gt;
    // diff_kernel is [1, 0, -1]; sum_kernel is [1, 2, 1]&lt;br /&gt;
    horiz_der = conv(img, diff_kernel, sum_kernel);&lt;br /&gt;
    vert_der = conv(img, sum_kernel, diff_kernel);&lt;br /&gt;
    return combine_horiz_vert(horiz_der, vert_der);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; n_images; i++) {&lt;br /&gt;
	img = get_input(i);&lt;br /&gt;
	res = sobel(img);&lt;br /&gt;
	write_result(res);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для повышения производительности в последовательной реализации всегда следует использовать сепарабельность свертки и считать двумерную свертку как композицию из одномерных.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;O(M\cdot N \cdot K)&amp;lt;/math&amp;gt; при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Группы вершин:&lt;br /&gt;
&lt;br /&gt;
1) выполняет операцию чтения изображения с диска. Количество вершин равно количеству изображений K.&lt;br /&gt;
&lt;br /&gt;
2) выполняет горизонтальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
3) выполняет вертикальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
4) комбинирует частичные результаты.&lt;br /&gt;
&lt;br /&gt;
5) записывает результат на диск.&lt;br /&gt;
&lt;br /&gt;
Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.&lt;br /&gt;
&lt;br /&gt;
Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Группы параллельных ветвей:&lt;br /&gt;
&lt;br /&gt;
1) Операции над разными изображениями независимы и образуют массово параллельные ветви.&lt;br /&gt;
&lt;br /&gt;
2) Одномерные свертки в разложении двумерной могут считаться независимо. Это конечный параллелизм.&lt;br /&gt;
&lt;br /&gt;
3) Одномерные свертки можно считать независимо по каждому пикселю - массовый параллелизм. Можно сделать их вычисление параллельным на практике если и не по пикселям, то по крайней мере по специально сконструированным блокам изображения для оптимального выполнения на GPU.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: K вещественных матриц размером N*M с диапазоном значений от 0 до 1. О структуре данных нельзя делать предположений.&lt;br /&gt;
Выходные данныые: K вещественных матриц размером N*M. Дополнительно можно отнормировать диапазон значений результата для визуализации.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
При обилии входных данных очень легко распределить различные изображения на различные процессы. Но при параллельной обработке одного изображения возникают тонкости, связанные с барьерными синхронизациями между операциями, эффективным использованием быстрой памяти и &amp;quot;разогревом&amp;quot; GPU.&lt;br /&gt;
&lt;br /&gt;
В целом значительных препятствий для распараллеливания нет, что можно видеть по графику слабой масштабируемости.&lt;br /&gt;
&lt;br /&gt;
График сильной масштабируемости:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Strong.PNG]]&lt;br /&gt;
&lt;br /&gt;
График слабой масштабируемости:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Weak.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
В силу возможности эффективно распараллелить фильтрацию с ядром Собеля и широких возможностей практического применения, есть&lt;br /&gt;
&lt;br /&gt;
- последовательные реализации (OpenCV)&lt;br /&gt;
&lt;br /&gt;
- параллельные реализации на CUDA для GPU: [https://github.com/JoeLoser/Sobel-Filter-CUDA 1], [https://github.com/JakubDziworski/Cuda-Sobel 2]&lt;br /&gt;
&lt;br /&gt;
- параллельная реализация на MPI для CPU: [https://github.com/cnavarropalos/sobel-mpi ссылка].&lt;br /&gt;
&lt;br /&gt;
Автор статьи написал параллельную реализацию, которая использует и MPI для распределения входных данных по GPU на узлах, и CUDA для эффективного просчета на GPU. За основу был взят [https://github.com/phrb/intro-cuda/tree/master/src/cuda-samples/3_Imaging/convolutionSeparable код примера эффективной реализации сепарабельной двумерной свертки над CUDA] от NVIDIA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24845</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24845"/>
		<updated>2017-12-02T17:29:18Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру в основном составляют:&lt;br /&gt;
&lt;br /&gt;
1) двумерные свертки, приведенные в математическом описании;&lt;br /&gt;
&lt;br /&gt;
2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.&lt;br /&gt;
&lt;br /&gt;
Эти элементы алгоритма приведены в разделе с математическим описанием.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Запись на C++-подобном псевдокоде:&lt;br /&gt;
&amp;lt;pre&amp;gt;float *sobel(float *img) {&lt;br /&gt;
    // diff_kernel is [1, 0, -1]; sum_kernel is [1, 2, 1]&lt;br /&gt;
    horiz_der = conv(img, diff_kernel, sum_kernel);&lt;br /&gt;
    vert_der = conv(img, sum_kernel, diff_kernel);&lt;br /&gt;
    return combine_horiz_vert(horiz_der, vert_der);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; n_images; i++) {&lt;br /&gt;
	img = get_input(i);&lt;br /&gt;
	res = sobel(img);&lt;br /&gt;
	write_result(res);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для повышения производительности в последовательной реализации всегда следует использовать сепарабельность свертки и считать двумерную свертку как композицию из одномерных.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;O(M\cdot N \cdot K)&amp;lt;/math&amp;gt; при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Группы вершин:&lt;br /&gt;
&lt;br /&gt;
1) выполняет операцию чтения изображения с диска. Количество вершин равно количеству изображений K.&lt;br /&gt;
&lt;br /&gt;
2) выполняет горизонтальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
3) выполняет вертикальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
4) комбинирует частичные результаты.&lt;br /&gt;
&lt;br /&gt;
5) записывает результат на диск.&lt;br /&gt;
&lt;br /&gt;
Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.&lt;br /&gt;
&lt;br /&gt;
Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Группы параллельных ветвей:&lt;br /&gt;
&lt;br /&gt;
1) Операции над разными изображениями независимы и образуют массово параллельные ветви.&lt;br /&gt;
&lt;br /&gt;
2) Одномерные свертки в разложении двумерной могут считаться независимо. Это конечный параллелизм.&lt;br /&gt;
&lt;br /&gt;
3) Одномерные свертки можно считать независимо по каждому пикселю - массовый параллелизм. Можно сделать их вычисление параллельным на практике если и не по пикселям, то по крайней мере по специально сконструированным блокам изображения для оптимального выполнения на GPU.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: K вещественных матриц размером N*M с диапазоном значений от 0 до 1. О структуре данных нельзя делать предположений.&lt;br /&gt;
Выходные данныые: K вещественных матриц размером N*M. Дополнительно можно отнормировать диапазон значений результата для визуализации.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
При обилии входных данных очень легко распределить различные изображения на различные процессы. Но при параллельной обработке одного изображения возникают тонкости, связанные с барьерными синхронизациями между операциями, эффективным использованием быстрой памяти и &amp;quot;разогревом&amp;quot; GPU.&lt;br /&gt;
&lt;br /&gt;
В целом значительных препятствий для распараллеливания нет, что можно видеть по графику слабой масштабируемости.&lt;br /&gt;
&lt;br /&gt;
График сильной масштабируемости:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Strong.PNG]]&lt;br /&gt;
&lt;br /&gt;
График слабой масштабируемости:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Weak.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24842</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24842"/>
		<updated>2017-12-02T17:09:59Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру в основном составляют:&lt;br /&gt;
&lt;br /&gt;
1) двумерные свертки, приведенные в математическом описании;&lt;br /&gt;
&lt;br /&gt;
2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.&lt;br /&gt;
&lt;br /&gt;
Эти элементы алгоритма приведены в разделе с математическим описанием.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Запись на C++-подобном псевдокоде:&lt;br /&gt;
&amp;lt;pre&amp;gt;float *sobel(float *img) {&lt;br /&gt;
    // diff_kernel is [1, 0, -1]; sum_kernel is [1, 2, 1]&lt;br /&gt;
    horiz_der = conv(img, diff_kernel, sum_kernel);&lt;br /&gt;
    vert_der = conv(img, sum_kernel, diff_kernel);&lt;br /&gt;
    return combine_horiz_vert(horiz_der, vert_der);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; n_images; i++) {&lt;br /&gt;
	img = get_input(i);&lt;br /&gt;
	res = sobel(img);&lt;br /&gt;
	write_result(res);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для повышения производительности в последовательной реализации всегда следует использовать сепарабельность свертки и считать двумерную свертку как композицию из одномерных.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;O(M\cdot N \cdot K)&amp;lt;/math&amp;gt; при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Группы вершин:&lt;br /&gt;
&lt;br /&gt;
1) выполняет операцию чтения изображения с диска. Количество вершин равно количеству изображений K.&lt;br /&gt;
&lt;br /&gt;
2) выполняет горизонтальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
3) выполняет вертикальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
4) комбинирует частичные результаты.&lt;br /&gt;
&lt;br /&gt;
5) записывает результат на диск.&lt;br /&gt;
&lt;br /&gt;
Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.&lt;br /&gt;
&lt;br /&gt;
Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Группы параллельных ветвей:&lt;br /&gt;
&lt;br /&gt;
1) Операции над разными изображениями независимы и образуют массово параллельные ветви.&lt;br /&gt;
&lt;br /&gt;
2) Одномерные свертки в разложении двумерной могут считаться независимо. Это конечный параллелизм.&lt;br /&gt;
&lt;br /&gt;
3) Одномерные свертки можно считать независимо по каждому пикселю - массовый параллелизм. Можно сделать их вычисление параллельным на практике если и не по пикселям, то по крайней мере по специально сконструированным блокам изображения для оптимального выполнения на GPU.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: K вещественных матриц размером N*M с диапазоном значений от 0 до 1. О структуре данных нельзя делать предположений.&lt;br /&gt;
Выходные данныые: K вещественных матриц размером N*M. Дополнительно можно отнормировать диапазон значений результата для визуализации.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
График сильной масштабируемости:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Strong.PNG]]&lt;br /&gt;
&lt;br /&gt;
График слабой масштабируемости:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Weak.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Strong.PNG&amp;diff=24841</id>
		<title>Файл:Strong.PNG</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Strong.PNG&amp;diff=24841"/>
		<updated>2017-12-02T17:09:02Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Weak.PNG&amp;diff=24840</id>
		<title>Файл:Weak.PNG</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Weak.PNG&amp;diff=24840"/>
		<updated>2017-12-02T17:08:08Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24839</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24839"/>
		<updated>2017-12-02T17:06:30Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру в основном составляют:&lt;br /&gt;
&lt;br /&gt;
1) двумерные свертки, приведенные в математическом описании;&lt;br /&gt;
&lt;br /&gt;
2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.&lt;br /&gt;
&lt;br /&gt;
Эти элементы алгоритма приведены в разделе с математическим описанием.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Запись на C++-подобном псевдокоде:&lt;br /&gt;
&amp;lt;pre&amp;gt;float *sobel(float *img) {&lt;br /&gt;
    // diff_kernel is [1, 0, -1]; sum_kernel is [1, 2, 1]&lt;br /&gt;
    horiz_der = conv(img, diff_kernel, sum_kernel);&lt;br /&gt;
    vert_der = conv(img, sum_kernel, diff_kernel);&lt;br /&gt;
    return combine_horiz_vert(horiz_der, vert_der);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; n_images; i++) {&lt;br /&gt;
	img = get_input(i);&lt;br /&gt;
	res = sobel(img);&lt;br /&gt;
	write_result(res);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для повышения производительности в последовательной реализации всегда следует использовать сепарабельность свертки и считать двумерную свертку как композицию из одномерных.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;O(M\cdot N \cdot K)&amp;lt;/math&amp;gt; при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Группы вершин:&lt;br /&gt;
&lt;br /&gt;
1) выполняет операцию чтения изображения с диска. Количество вершин равно количеству изображений K.&lt;br /&gt;
&lt;br /&gt;
2) выполняет горизонтальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
3) выполняет вертикальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
4) комбинирует частичные результаты.&lt;br /&gt;
&lt;br /&gt;
5) записывает результат на диск.&lt;br /&gt;
&lt;br /&gt;
Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.&lt;br /&gt;
&lt;br /&gt;
Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Группы параллельных ветвей:&lt;br /&gt;
&lt;br /&gt;
1) Операции над разными изображениями независимы и образуют массово параллельные ветви.&lt;br /&gt;
&lt;br /&gt;
2) Одномерные свертки в разложении двумерной могут считаться независимо. Это конечный параллелизм.&lt;br /&gt;
&lt;br /&gt;
3) Одномерные свертки можно считать независимо по каждому пикселю - массовый параллелизм. Можно сделать их вычисление параллельным на практике если и не по пикселям, то по крайней мере по специально сконструированным блокам изображения для оптимального выполнения на GPU.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: K вещественных матриц размером N*M с диапазоном значений от 0 до 1. О структуре данных нельзя делать предположений.&lt;br /&gt;
Выходные данныые: K вещественных матриц размером N*M. Дополнительно можно отнормировать диапазон значений результата для визуализации.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24838</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24838"/>
		<updated>2017-12-02T16:59:29Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру в основном составляют:&lt;br /&gt;
&lt;br /&gt;
1) двумерные свертки, приведенные в математическом описании;&lt;br /&gt;
&lt;br /&gt;
2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.&lt;br /&gt;
&lt;br /&gt;
Эти элементы алгоритма приведены в разделе с математическим описанием.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Запись на C++-подобном псевдокоде:&lt;br /&gt;
&amp;lt;pre&amp;gt;float *sobel(float *img) {&lt;br /&gt;
    // diff_kernel is [1, 0, -1]; sum_kernel is [1, 2, 1]&lt;br /&gt;
    horiz_der = conv(img, diff_kernel, sum_kernel);&lt;br /&gt;
    vert_der = conv(img, sum_kernel, diff_kernel);&lt;br /&gt;
    return combine_horiz_vert(horiz_der, vert_der);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; n_images; i++) {&lt;br /&gt;
	img = get_input(i);&lt;br /&gt;
	res = sobel(img);&lt;br /&gt;
	write_result(res);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для повышения производительности в последовательной реализации всегда следует использовать сепарабельность свертки и считать двумерную свертку как композицию из одномерных.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;O(M\cdot N \cdot K)&amp;lt;/math&amp;gt; при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Группы вершин:&lt;br /&gt;
&lt;br /&gt;
1) выполняет операцию чтения изображения с диска. Количество вершин равно количеству изображений K.&lt;br /&gt;
&lt;br /&gt;
2) выполняет горизонтальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
3) выполняет вертикальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
4) комбинирует частичные результаты.&lt;br /&gt;
&lt;br /&gt;
5) записывает результат на диск.&lt;br /&gt;
&lt;br /&gt;
Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.&lt;br /&gt;
&lt;br /&gt;
Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Группы параллельных ветвей:&lt;br /&gt;
&lt;br /&gt;
1) Операции над разными изображениями независимы и образуют массово параллельные ветви.&lt;br /&gt;
&lt;br /&gt;
2) Одномерные свертки в разложении двумерной могут считаться независимо. Это конечный параллелизм.&lt;br /&gt;
&lt;br /&gt;
3) Однромерные свертки можно считать независимо по каждому пикселю - массовый параллелизм. Можно сделать их вычисление параллельным на практике если и не по пикселям, то по крайней мере по специально сконструированным блокам изображения для оптимального выполнения на GPU.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: K вещественных матриц размером N*M с диапазоном значений от 0 до 1. О структуре данных нельзя делать предположений.&lt;br /&gt;
Выходные данныые: K вещественных матриц размером N*M. Дополнительно можно отнормировать диапазон значений результата для визуализации.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24837</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24837"/>
		<updated>2017-12-02T16:56:45Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру в основном составляют:&lt;br /&gt;
&lt;br /&gt;
1) двумерные свертки, приведенные в математическом описании;&lt;br /&gt;
&lt;br /&gt;
2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.&lt;br /&gt;
&lt;br /&gt;
Эти элементы алгоритма приведены в разделе с математическим описанием.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Запись на C++-подобном псевдокоде:&lt;br /&gt;
&amp;lt;pre&amp;gt;float *sobel(float *img) {&lt;br /&gt;
    // diff_kernel is [1, 0, -1]; sum_kernel is [1, 2, 1]&lt;br /&gt;
    horiz_der = conv(img, diff_kernel, sum_kernel);&lt;br /&gt;
    vert_der = conv(img, sum_kernel, diff_kernel);&lt;br /&gt;
    return combine_horiz_vert(horiz_der, vert_der);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; n_images; i++) {&lt;br /&gt;
	img = get_input(i);&lt;br /&gt;
	res = sobel(img);&lt;br /&gt;
	write_result(res);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для повышения производительности в последовательной реализации всегда следует использовать сепарабельность свертки и считать двумерную свертку как композицию из одномерных.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;O(M\cdot N \cdot K)&amp;lt;/math&amp;gt; при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Группы вершин:&lt;br /&gt;
&lt;br /&gt;
1) выполняет операцию чтения изображения с диска. Количество вершин равно количеству изображений K.&lt;br /&gt;
&lt;br /&gt;
2) выполняет горизонтальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
3) выполняет вертикальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
4) комбинирует частичные результаты.&lt;br /&gt;
&lt;br /&gt;
5) записывает результат на диск.&lt;br /&gt;
&lt;br /&gt;
Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.&lt;br /&gt;
&lt;br /&gt;
Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Группы параллельных ветвей:&lt;br /&gt;
&lt;br /&gt;
1) Операции над разными изображениями независимы и образуют массово параллельные ветви.&lt;br /&gt;
&lt;br /&gt;
2) Одномерные свертки в разложении двумерной могут считаться независимо. Это конечный параллелизм.&lt;br /&gt;
&lt;br /&gt;
3) Однромерные свертки можно считать независимо по каждому пикселю - массовый параллелизм. Можно сделать их вычисление параллельным на практике если и не по пикселям, то по крайней мере по специально сконструированным блокам изображения для оптимального выполнения на GPU.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24836</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24836"/>
		<updated>2017-12-02T16:56:00Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру в основном составляют:&lt;br /&gt;
&lt;br /&gt;
1) двумерные свертки, приведенные в математическом описании;&lt;br /&gt;
&lt;br /&gt;
2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.&lt;br /&gt;
&lt;br /&gt;
Эти элементы алгоритма приведены в разделе с математическим описанием.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Запись на C++-подобном псевдокоде:&lt;br /&gt;
&amp;lt;pre&amp;gt;float *sobel(float *img) {&lt;br /&gt;
    // diff_kernel is [1, 0, -1]; sum_kernel is [1, 2, 1]&lt;br /&gt;
    horiz_der = conv(img, diff_kernel, sum_kernel);&lt;br /&gt;
    vert_der = conv(img, sum_kernel, diff_kernel);&lt;br /&gt;
    return combine_horiz_vert(horiz_der, vert_der);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; n_images; i++) {&lt;br /&gt;
	img = get_input(i);&lt;br /&gt;
	res = sobel(img);&lt;br /&gt;
	write_result(res);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для повышения производительности в последовательной реализации всегда следует использовать сепарабельность свертки и считать двумерную свертку как композицию из одномерных.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;O(M\cdot N \cdot K)&amp;lt;/math&amp;gt; при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Группы вершин:&lt;br /&gt;
&lt;br /&gt;
1) выполняет операцию чтения изображения с диска. Количество вершин равно количеству изображений K.&lt;br /&gt;
&lt;br /&gt;
2) выполняет горизонтальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
3) выполняет вертикальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
4) комбинирует частичные результаты.&lt;br /&gt;
&lt;br /&gt;
5) записывает результат на диск.&lt;br /&gt;
&lt;br /&gt;
Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.&lt;br /&gt;
&lt;br /&gt;
Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Несколько групп массово параллельных ветвей:&lt;br /&gt;
&lt;br /&gt;
1) Операции над разными изображениями независимы и образуют массово параллельные ветви.&lt;br /&gt;
&lt;br /&gt;
2) Одномерные свертки в разложении двумерной могут считаться независимо. Это конечный параллелизм.&lt;br /&gt;
&lt;br /&gt;
3) Однромерные свертки можно считать независимо по каждому пикселю - массовый параллелизм. Можно сделать их вычисление параллельным на практике если и не по пикселям, то по крайней мере по специально сконструированным блокам изображения для оптимального выполнения на GPU.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24835</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24835"/>
		<updated>2017-12-02T16:50:02Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру в основном составляют:&lt;br /&gt;
&lt;br /&gt;
1) двумерные свертки, приведенные в математическом описании;&lt;br /&gt;
&lt;br /&gt;
2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.&lt;br /&gt;
&lt;br /&gt;
Эти элементы алгоритма приведены в разделе с математическим описанием.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Запись на C++-подобном псевдокоде:&lt;br /&gt;
&amp;lt;pre&amp;gt;float *sobel(float *img) {&lt;br /&gt;
    // diff_kernel is [1, 0, -1]; sum_kernel is [1, 2, 1]&lt;br /&gt;
    horiz_der = conv(img, diff_kernel, sum_kernel);&lt;br /&gt;
    vert_der = conv(img, sum_kernel, diff_kernel);&lt;br /&gt;
    return combine_horiz_vert(horiz_der, vert_der);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; n_images; i++) {&lt;br /&gt;
	img = get_input(i);&lt;br /&gt;
	res = sobel(img);&lt;br /&gt;
	write_result(res);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для повышения производительности в последовательной реализации всегда следует использовать сепарабельность свертки и считать двумерную свертку как композицию из одномерных.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;O(M\cdot N \cdot K)&amp;lt;/math&amp;gt; при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Группы вершин:&lt;br /&gt;
&lt;br /&gt;
1) выполняет операцию чтения изображения с диска. Количество вершин равно количеству изображений K.&lt;br /&gt;
&lt;br /&gt;
2) выполняет горизонтальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
3) выполняет вертикальную свертку каждого изображения.&lt;br /&gt;
&lt;br /&gt;
4) комбинирует частичные результаты.&lt;br /&gt;
&lt;br /&gt;
5) записывает результат на диск.&lt;br /&gt;
&lt;br /&gt;
Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.&lt;br /&gt;
&lt;br /&gt;
Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24834</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24834"/>
		<updated>2017-12-02T16:45:50Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру в основном составляют:&lt;br /&gt;
&lt;br /&gt;
1) двумерные свертки, приведенные в математическом описании;&lt;br /&gt;
&lt;br /&gt;
2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.&lt;br /&gt;
&lt;br /&gt;
Эти элементы алгоритма приведены в разделе с математическим описанием.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Запись на C++-подобном псевдокоде:&lt;br /&gt;
&amp;lt;pre&amp;gt;float *sobel(float *img) {&lt;br /&gt;
    // diff_kernel is [1, 0, -1]; sum_kernel is [1, 2, 1]&lt;br /&gt;
    horiz_der = conv(img, diff_kernel, sum_kernel);&lt;br /&gt;
    vert_der = conv(img, sum_kernel, diff_kernel);&lt;br /&gt;
    return combine_horiz_vert(horiz_der, vert_der);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; n_images; i++) {&lt;br /&gt;
	img = get_input(i);&lt;br /&gt;
	res = sobel(img);&lt;br /&gt;
	write_result(res);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для повышения производительности в последовательной реализации всегда следует использовать сепарабельность свертки и считать двумерную свертку как композицию из одномерных.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;O(M\cdot N \cdot K)&amp;lt;/math&amp;gt; при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Первая группа вершин выполняет операцию чтения изображения с диска. Количество вершин равно количеству изображений K.&lt;br /&gt;
Вторая - выполняет горизонтальную свертку каждого изображения.&lt;br /&gt;
Третья - выполняет вертикальную свертку каждого изображения.&lt;br /&gt;
Четвертая - комбинирует частичные результаты&lt;br /&gt;
Пятая - записывает результат на диск.&lt;br /&gt;
&lt;br /&gt;
Группы вершин в графе соединены последовательно, и каждая вершина соединена только с вершинами соседних групп, соответствующих одному и тому же изображению.&lt;br /&gt;
&lt;br /&gt;
Граф альтернативно можно представить и более детально, например, раскрыв макрооперации сверток изображения по строкам, столбцам, элементам ядер.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24833</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24833"/>
		<updated>2017-12-02T15:23:56Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру в основном составляют:&lt;br /&gt;
&lt;br /&gt;
1) двумерные свертки, приведенные в математическом описании;&lt;br /&gt;
&lt;br /&gt;
2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.&lt;br /&gt;
&lt;br /&gt;
Эти элементы алгоритма приведены в разделе с математическим описанием.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Запись на C++-подобном псевдокоде:&lt;br /&gt;
&amp;lt;pre&amp;gt;float *sobel(float *img) {&lt;br /&gt;
    // diff_kernel is [1, 0, -1]; sum_kernel is [1, 2, 1]&lt;br /&gt;
    horiz_der = conv(img, diff_kernel, sum_kernel);&lt;br /&gt;
    vert_der = conv(img, sum_kernel, diff_kernel);&lt;br /&gt;
    return combine_horiz_vert(horiz_der, vert_der);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; n_images; i++) {&lt;br /&gt;
	img = get_input(i);&lt;br /&gt;
	res = sobel(img);&lt;br /&gt;
	write_result(res);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для повышения производительности в последовательной реализации всегда следует использовать сепарабельность свертки и считать двумерную свертку как композицию из одномерных.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;O(M\cdot N \cdot K)&amp;lt;/math&amp;gt; при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24832</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=24832"/>
		<updated>2017-12-02T15:23:01Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные (а точнее, их аппроксимации) вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Макроструктуру в основном составляют:&lt;br /&gt;
&lt;br /&gt;
1) двумерные свертки, приведенные в математическом описании;&lt;br /&gt;
&lt;br /&gt;
2) операция поэлементного геометрического среднего между промежуточными аппроксимациями.&lt;br /&gt;
&lt;br /&gt;
Эти элементы алгоритма приведены в разделе с математическим описанием.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Запись на C++-подобном псевдокоде:&lt;br /&gt;
&amp;lt;pre&amp;gt;float *sobel(float *img) {&lt;br /&gt;
    // diff_kernel is [1, 0, -1]; sum_kernel is [1, 2, 1]&lt;br /&gt;
    horiz_der = conv(img, diff_kernel, sum_kernel);&lt;br /&gt;
    vert_der = conv(img, sum_kernel, diff_kernel);&lt;br /&gt;
    return combine_horiz_vert(horiz_der, vert_der);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; n_images; i++) {&lt;br /&gt;
	img = get_input(i);&lt;br /&gt;
	res = sobel(img);&lt;br /&gt;
	write_result(res);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для повышения производительности в последовательной реализации всегда следует использовать сепарабельность свертки и считать двумерную свертку, как композицию из одномерных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;O(M\cdot N \cdot K)&amp;lt;/math&amp;gt; при обработке K изображений размером M*N, так как все макроэлементы, составляющие структуру алгоритма, выполняются за константу для одного пикселя.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=23928</id>
		<title>Участник:Nikkou/Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikkou/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=23928"/>
		<updated>2017-11-13T12:04:11Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: Новая страница: «Описание параллельной реализации алгоритма фильтрации Собеля.  Автор: А.Г.Лыжов (401 групп…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Описание параллельной реализации алгоритма фильтрации Собеля.&lt;br /&gt;
&lt;br /&gt;
Автор: А.Г.Лыжов (401 группа).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=23062</id>
		<title>Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=23062"/>
		<updated>2017-10-17T17:44:11Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро совпадает с алгоритмом, так как все описанные операции выполняются за &amp;lt;math&amp;gt;O(M\cdot N)&amp;lt;/math&amp;gt; на одном изображении.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=23061</id>
		<title>Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=23061"/>
		<updated>2017-10-17T17:40:14Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:&lt;br /&gt;
&lt;br /&gt;
* изображение &amp;lt;math&amp;gt;A^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные:&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации модуля градиента &amp;lt;math&amp;gt;G^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* матрица аппроксимации направления градиента &amp;lt;math&amp;gt;\Theta^{N\cdot M}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это матрицы такого же размера, как исходное изображение, так как параметры градиента вычисляются для каждого пикселя изображения.&lt;br /&gt;
&lt;br /&gt;
Промежуточные горизонтальные и вертикальные производные вычисляются с помощью следующих двумерных сверток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{G}_x = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; 0 &amp;amp; -1  \\&lt;br /&gt;
+2 &amp;amp; 0 &amp;amp; -2 \\&lt;br /&gt;
+1 &amp;amp; 0 &amp;amp; -1 &lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
,\ &lt;br /&gt;
\mathbf{G}_y = \begin{bmatrix} &lt;br /&gt;
 +1 &amp;amp; +2 &amp;amp; +1\\&lt;br /&gt;
 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
-1 &amp;amp; -2 &amp;amp; -1&lt;br /&gt;
\end{bmatrix} * \mathbf{A}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аппроксимации для модуля и направления градиента можно получить, скомбинировав эти производные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{\Theta} = \operatorname{atan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=23060</id>
		<title>Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=23060"/>
		<updated>2017-10-17T17:16:19Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Фильтр Собеля - дискретный дифференциальный оператор, который используется для приближения градиента яркости изображения. Он часто используется в алгоритмах выделения границ при обработке изображений. Фильтр Собеля был предложен Ирвином Собелем и Гэри Фелдманом в лаборатории искусственного интеллекта Стэнфорда в 1968.&lt;br /&gt;
&lt;br /&gt;
Фильтр Собеля легко вычислять, так как он основан на свертках изображения с небольшими ядрами. Из-за этого он аппроксимирует градиент со значительной погрешностью, но качество аппроксимации оказывается достаточным для многих практических приложений.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=23059</id>
		<title>Фильтр Собеля</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F&amp;diff=23059"/>
		<updated>2017-10-17T17:06:10Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: Структурный шаблон&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8F_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%B2&amp;diff=23058</id>
		<title>Структура описания свойств алгоритмов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8F_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%B2&amp;diff=23058"/>
		<updated>2017-10-17T17:05:20Z</updated>

		<summary type="html">&lt;p&gt;Nikkou: Статью следует удалить из-за ошибки в названии&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nikkou</name></author>
	</entry>
</feed>