【发布时间】:2012-09-20 15:37:53
【问题描述】:
我知道一些任务可以为短期运行的任务提供细粒度的控制,但我有一种情况,使用 foreach 循环更自然。问题是,是否可以告诉 Parallel.For 期待短期运行的操作并使用尽可能多的线程来最大限度地利用 CPU?
如果不是,那么您建议使用什么方法进行并行化:
bool [,] grid = new bool [1000, 1000];
for (int y=0; y<1000; y++)
for (int x=0; x<1000; x++)
// Ignore the bounds error. This is just to illustrate a very short operation.
grid[x, y] |= grid[x-1, y+1];
【问题讨论】:
-
你的 CPU 容量只有这么多。并行做事并不会神奇地从某个未知来源获得额外的处理能力。如果以串行方式运行它会使处理器最大化,那么并行运行它不会获得任何好处,实际上由于线程和上下文切换的开销,可能会减慢操作。您真正可以获得的唯一方法是,如果您的短操作是某种不受 CPU 限制的 high IO-wait 操作。所以你能告诉我们更多关于你的实际操作吗?
-
例如,您可以将矩阵分成 4 块并运行 4 个线程。 (当然边界应该分开处理)
-
如果有一堆短时间运行的线程,
Parallel.For将有效地进行优化。您可以使用ParallelOptions覆盖它:Parallel.For(1, 10, new ParallelOptions {MaxDegreeOfParallelism = Environment.ProcessorCount*2}, i => { /* TODO something with i */ });但这可能会对性能产生负面影响,而不是正面影响。 -
@PeterRitchie:是的,超过
ProcessorCount几乎肯定会对非 I/O 操作产生负面影响。您的ProcessorCount*2示例在某些情况下可能会证明是有益的,因为它启用了超线程和小型、不可并行化的操作。
标签: c# .net parallel-processing task-parallel-library