Multithreading 如何寻找并行化的可能性?

Multithreading 如何寻找并行化的可能性?,multithreading,parallel-processing,tbb,Multithreading,Parallel Processing,Tbb,我有一些串行代码,我已经开始使用Intel的TBB并行化。我的第一个目标是并行化代码中几乎所有的for循环(我甚至并行化了for-in-for循环)现在我已经做了,我得到了一些加速。我正在寻找更多的地方/想法/选择来并行化…我知道这听起来可能有点模糊,没有太多的问题参考,但我在这里寻找通用的想法,我可以在我的代码中探索 algo概述(以下algo在图像的所有级别上运行,从最短开始,每次增加宽度和高度2,直到达到实际高度和宽度) 愚蠢的答案是任何耗时或重复的事情。我使用Microsoft的.NET

我有一些串行代码,我已经开始使用Intel的TBB并行化。我的第一个目标是并行化代码中几乎所有的for循环(我甚至并行化了for-in-for循环)现在我已经做了,我得到了一些加速。我正在寻找更多的地方/想法/选择来并行化…我知道这听起来可能有点模糊,没有太多的问题参考,但我在这里寻找通用的想法,我可以在我的代码中探索

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


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

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

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

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


思考的食粮…

仅从某个角度来看,将某些事物并行化可能并不总是值得的

仅仅因为您有一个for循环,其中每个迭代都可以独立完成,并不总是意味着您应该这样做

TBB在启动这些并行循环时会有一些开销,所以除非您循环了很多次,否则可能不应该将其并行化

但是,如果每个循环都非常昂贵(如CirrusFlyer的例子),那么可以随意将其并行化

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


另外,对循环执行嵌套并行_时要小心,因为这可能会很昂贵。您可能希望继续并行化外部for循环。

数据流图有助于找到可以独立并行执行的任务。@rwong-添加了概述。如果您不了解某些内容,请告诉我。嵌套的并行for循环可以在TBB中使用。当然会有一些开销,但是TBB的默认设置(特别是auto_partitioner)会尽量减少开销。如果内部循环在两个内核上执行得更快,那么并行化可能是有意义的,特别是当外部循环没有很好的平衡时。@Alexey:我的观点是,如果你的循环非常便宜并且迭代次数不多,那么将其并行化通常是没有意义的。当然,如果外部循环的执行时间可以变化,那么将两个循环并行化可能是值得的,但一般来说,您应该谨慎,并始终衡量它是否有帮助;实际上,你所说的对于任何级别的并行性都是正确的,不仅仅是对于嵌套的东西。我只是想指出,TBB非常好地支持嵌套并行。
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