C#并行处理概念

时间:2011-05-24 18:43:47

标签: c#-4.0 parallel-processing

我正在使用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 && i - 1 >= 0)
                    u_l_corner = matrix[i - 1, j - 1];

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

因此,计算取决于先前的单元格值。因此,它看起来并不像是可以并行实现(至少对我而言)。但是,只是想在继续之前确定..

可以使用Parallel.For或C#中的任何其他方法并行实现此算法吗?如果是这样,一个简单的例子被高度赞赏,但如果没有,我最好找到一个“并行图像直方图算法”,如果有的话。

提前致谢。

1 个答案:

答案 0 :(得分:0)

就我而言,可以使这个算法并行,但如果您的矩阵相对较小(处理时间少于几毫秒),我发现没有这样做。

如果您对使此算法并行非常感兴趣,可以将此任务拆分为“j”任务(“y”轴中的项目数)。

执行此操作的关键是启动第一个线程来计算此矩阵的第一行中的点([i,0]),然后开始第二个线程延迟 - 第二个线程应该追逐第一个线程 - 必须永远不要超过前一个线程。