【问题标题】:C# Parallel processing conceptC#并行处理概念
【发布时间】:2011-05-25 02:56:57
【问题描述】:

我正在使用 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# 中的任何其他方法并行实现此算法?如果是这样一个简单的例子是高度赞赏,但如果不是,我最好努力找到一个“平行图像直方图算法”,如果有的话。

提前致谢。

【问题讨论】:

  • 不是 100% 确定您的问题(尽管我怀疑您当前的算法是 not 可并行化的),但您可以实施的一个快速优化是填充第一行和第一列最初的矩阵,然后运行您当前的代码。这将为您节省一堆不必要的边界检查在内循环。 (注意:这实际上可能没有什么不同,因为 a)编译器可能已经在以类似的方式进行优化,并且 b)如果矩阵不是那么大,加速(如果有的话)将是最小的。)
  • @dlev:我的问题是算法是否可以并行化。正如我所说,对我来说,它看起来非常像一个不可并行化的算法。你提到的优化是在我的实际程序中实现的,但我没有放在这里是为了让算法清晰简单。谢谢。

标签: c#-4.0 parallel-processing


【解决方案1】:

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

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

这样做的关键是启动第一个线程以计算该矩阵第一行中的点 ([i, 0] ),然后延迟启动第二个线程 - 第二个线程应该追逐第一个线程 - 绝不能超过前一个线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多