parallel_for - 要并行化的循环?

时间:2014-03-27 22:19:47

标签: c++ loops parallel-processing

我有3次嵌套循环,而两个外循环只循环很少次而不是最内循环。像这样:

for (int i = 0; i < I; i++) {
        for (int j = 0; j < J; j++) {
            for (int k = 0; k < K; k++) {

                //Do stuff
            }
        }
    }

I~ = J&lt;&lt; K,即我大致等于J,但K非常大(几千倍)

由于所有数据都是相互独立的,我想使用ppl.h库的parallel_for并行化它们。现在出现的问题是,我将并行化哪个循环?我倾向于最内层循环,因为它是最大的循环,但我假设每次外循环循环时,整个线程开销再次开始。那么什么更有效?

1 个答案:

答案 0 :(得分:4)

  

现在出现的问题是,我将并行化哪个循环?

通常,您希望并行化最有意义的最外层循环。如果并行化内部循环,则会引入额外的开销。通过使“循环体”尽可能大,您将获得更好的整体吞吐量。这实际上归结为Amdahl's law - 在这种情况下,调度并行工作项所涉及的开销不可并行化,因此您所做的工作越多,整体的潜在效率就越低。

风险在于,如果外部循环中的项目太少,您可能最终会无法并行运行工作项目,因为在您的项目中处理核心的项目数量会少于系统

如果您的外环足以保持核心繁忙,那么这是最好的去处 - 特别是如果每​​个循环体中完成的工作量相对一致。