我有一些串行代码,我已经开始使用英特尔的TBB进行并行化。我的第一个目标是并行化代码中的几乎所有for循环(我甚至在for循环中并行化),现在我已经完成了一些加速。我正在寻找更多的地方/想法/选项来并行化......我知道这可能听起来有点模糊而没有太多参考问题,但我在这里寻找通用的想法,我可以在我的代码中探索。
algo概述(以下算法在图像的所有级别上运行,从最短且逐渐增加的宽度和高度每次增加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
答案 0 :(得分:0)
愚蠢的答案是任何耗时或迭代的答案。我使用的是Microsoft的.NET v4.0任务并行库,其设置的一个有趣的事情是它的“表达并行性”。一个有趣的术语来描述“尝试并行”。虽然,如果主机平台没有必要的核心,你的编码语句可能会说“在这里使用TPL”,它只会调用旧的时尚串行代码。
我已经开始在我的所有项目中使用TPL。任何地方都有特别的循环(这要求我设计我的类和方法,使得循环迭代之间没有依赖关系)。但是,任何可能只是旧时尚多线程代码的地方我都希望看看它是否可以放在不同的内核上。
到目前为止,我最喜欢的是一个应用程序,我可以下载〜7,800个不同的URL来分析页面的内容,如果它找到它正在寻找的信息做了一些额外的处理....这曾经需要26个 - 29分钟完成。我的戴尔T7500工作站配备双四核Xeon 3GHz处理器,24GB内存和Windows 7旗舰版64位版本,现在可以在大约5分钟内完成整个过程。对我来说有很大的不同。
我还有一个发布/订阅通信引擎,我一直在重构以利用TPL(特别是从服务器到客户端的“推送”数据......你可能有10,000台客户端计算机已表明他们对特定的兴趣事情,一旦发生这种事件,我需要将数据推送到所有这些事件)。我还没有这样做,但我真的很期待看到这个结果。
思考的食物......
答案 1 :(得分:0)
仅仅从某种角度来看,并行化某些东西并不总是值得的。
仅仅因为你有一个for循环,每次迭代可以彼此独立完成,并不总是意味着你应该。
TBB有一些启动那些parallel_for循环的开销,所以除非你循环很多次,否则你可能不应该并行化它。
但是,如果每个循环都非常昂贵(就像在CirrusFlyer的例子中那样),那么可以自由地并行化它。
更具体地说,查看并行计算的开销相对于并行计算的成本较小的时间。
另外,请注意执行嵌套的parallel_for循环,因为这会花费很多。你可能只想坚持使用外圈for paralell化。