3

我有一些串行代码已经开始使用英特尔的 TBB 进行并行化。我的第一个目标是并行化代码中几乎所有的 for 循环(我什至在 for 循环内并行化了 for 循环)并且现在已经完成了一些加速。我正在寻找更多的地方/想法/选项来并行化......我知道这可能听起来有点模糊,没有太多参考问题,但我在这里寻找可以在我的代码中探索的通用想法。

算法概述(以下算法在图像的所有级别上运行,从最短开始,每次将宽度和高度增加 2,直到达到实际高度和宽度)。

For all image pairs starting with the smallest pair
    For height = 2 to image_height - 2
        Create a 5 by image_width ROI of both left and right images.
        For width = 2 to image_width - 2
            Create a 5 by 5 window of the left ROI centered around width and find best match in the right ROI using NCC
            Create a 5 by 5 window of the right ROI centered around width and find best match in the left ROI using NCC
            Disparity = current_width - best match
    The edge pixels that did not receive a disparity gets the disparity of its neighbors
    For height = 0 to image_height
        For width = 0 to image_width
            Check smoothness, uniqueness and order constraints*(parallelized separately)
    For height = 0 to image_height
        For width = 0 to image_width
            For disparity that failed constraints, use the average disparity of
            neighbors that passed the constraints
    Normalize all disparity and output to screen
4

2 回答 2

0

愚蠢的答案是任何耗时或迭代的事情。我使用 Microsoft 的 .NET v4.0 任务并行库,关于他们的设置的一个有趣的事情是它的“表达并行性”。一个有趣的术语来描述“尝试的并行性”。但是,如果主机平台没有必要的内核,您的编码语句可能会说“在此处使用 TPL”,它只会在其位置调用旧式串行代码。

我已经开始在我的所有项目中使用 TPL。特别是任何有循环的地方(这要求我设计我的类和方法,以便循环迭代之间没有依赖关系)。但是任何可能只是好的老式多线程代码的地方,我都会看看它是否可以放在不同的内核上。

到目前为止,我最喜欢的是一个应用程序,它下载了大约 7,800 个不同的 URL 来分析页面的内容,如果它找到了它正在寻找的信息,它会进行一些额外的处理……这过去需要 26 到 29 分钟去完成。我的戴尔 T7500 工作站配备双四核 Xeon 3GHz 处理器、24GB RAM 和 Windows 7 Ultimate 64 位版本,现在只需大约 5 分钟即可完成整个操作。对我来说有很大的不同。

我还有一个发布/订阅通信引擎,我一直在重构它以利用 TPL(尤其是在将数据从服务器“推送”到客户端时……您可能有 10,000 台客户端计算机表示对特定事物感兴趣,即一旦发生该事件,我需要将数据推送给所有这些)。我还没有完成这个,但我真的很期待看到这个结果。

深思熟虑...

于 2011-04-08T02:43:25.940 回答
0

仅从某种角度来看,并行化某些东西可能并不总是值得的。

仅仅因为你有一个 for 循环,每次迭代都可以相互独立地完成,并不总是意味着你应该这样做。

TBB 对启动这些 parallel_for 循环有一些开销,所以除非你循环很多次,否则你可能不应该并行化它。

但是,如果每个循环都非常昂贵(就像在 CirrusFlyer 的示例中一样),那么可以随意并行化它。

更具体地说,寻找并行计算的开销相对于并行化成本较小的时间。

另外,在执行嵌套的 parallel_for 循环时要小心,因为这会变得很昂贵。您可能只想坚持并行化外部 for 循环。

于 2011-04-09T02:36:42.133 回答