Концепция параллельной обработки на C #

#c#-4.0 #parallel-processing

#c #-4.0 #параллельная обработка

Вопрос:

Я работаю над обработкой изображений с помощью C # и реализую интегральную гистограмму. Я не вдаюсь в подробности, но предположим, что у меня есть матрица MxN, и значение каждой ячейки является суммой самой себя и ее левого и верхнего соседей, минус соседний левый верхний угол. Это работает быстро, но я хочу ускорить его для больших изображений или для повышения производительности обработки изображений в реальном времени.

 matrix[i,j]  = matrix[i-1,j]   matrix[i,j-1] - matrix[i-1,j-1];
  

Фактическая реализация:

 for (int i = 0; i < width; i  )
            for (int j = 0; j < height; j  )
            {
                int left = 0, upper = 0, u_l_corner = 0;
                if (j - 1 >= 0)
                {
                    left = matrix[i, j - 1];
                }
                if (i - 1 >= 0)
                {
                    upper = matrix[i - 1, j];
                }
                if (j - 1 >= 0 amp;amp; i - 1 >= 0)
                    u_l_corner = matrix[i - 1, j - 1];

                matrix[i, j]  = left   upper - u_l_corner;
            }
  

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

Может ли этот алгоритм быть реализован параллельно с использованием Parallel.For или любой другой метод в C #? Если да, то я высоко ценю простой пример, но если нет, мне лучше поработать над поиском «алгоритма параллельной гистограммы изображения», если таковой существует.

Заранее благодарю.

Комментарии:

1. Не уверен на 100% в вашем вопросе (хотя я подозреваю, что ваш текущий алгоритм не поддается параллелизации), но одна быстрая оптимизация, которую вы могли бы реализовать, — это сначала заполнить первую строку и столбец матрицы, а затем запустить ваш текущий код. Это избавит вас от кучи ненужных проверок границ во внутреннем цикле. (Примечание: на самом деле это может не иметь значения, поскольку a) компилятор, возможно , уже проводит оптимизацию аналогичным образом и b) если матрица не такая большая, ускорение (если таковое имеется) будет минимальным.)

2. @dlev: Мой вопрос в том, можно ли распараллелить алгоритм или нет. Как я уже сказал, для меня это очень похоже на непараллеливаемый алгоритм. Оптимизация, о которой вы упоминаете, реализована в моей реальной программе, но я поместил ее здесь не для того, чтобы сделать алгоритм понятным и простым. Спасибо.

Ответ №1:

Насколько я понимаю, возможно сделать этот алгоритм параллельным, но я не нахожу в этом смысла, если ваша матрица относительно мала (время обработки составляет менее нескольких миллисекунд).

Если вы очень заинтересованы в том, чтобы сделать этот алгоритм параллельным, вы могли бы разбить эту задачу ровно на «j» задач (количество элементов по оси «y»).

Ключом к этому является запуск первого потока для вычисления точек в первой строке этой матрицы ( [i, 0] ), затем запуск второго потока откладывается — второй поток должен преследовать первый поток — никогда не должен обгонять предыдущий поток.