关于C#:parallel_for-要并行化哪个循环?

parallel_for - Which loop to parallelize?

我有3次嵌套循环,而与最内部的循环相反,两个外部循环只循环了几次。像这样的东西:

1
2
3
4
5
6
7
8
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 << K,即我大约等于J,但是K非常大(几千倍)

由于所有数据都是彼此独立的,因此我想使用ppl.h库的parallel_for将它们并行化。现在出现了问题,我应该并行处理哪个循环?我倾向于最里面的循环,因为它是最大的循环,但是我假设每次外部循环循环时,整个线程开销都会再次开始。那么更有效的是什么呢?


The question now arises, which loop do I parallelize?

通常,您希望并行处理最有意义的最外层循环。如果并行化内部循环,则会引入额外的开销。通过使"回路主体"尽可能大,您将获得更好的总体吞吐量。这实际上归结为阿姆达尔定律-在这种情况下,安排并行工作项所涉及的开销是不可并行的,因此您所做的工作越多,总体潜在效率就越低。

风险在于,如果外循环中的项目太少,您可能最终无法并行运行工作项目,因为在某些情况下,您的项目比处理核心要少系统。

提供了您的外部循环足以使内核忙碌的地方,这是最好的选择-特别是如果每??个循环主体中完成的工作量相对一致的话。