Rah*_*han 3 .net c# parallel-processing task-parallel-library
我知道为短期运行任务提供细粒度控制的任务,但我有一种情况是使用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];
Run Code Online (Sandbox Code Playgroud)
问题是,是否有可能告诉Parallel.For期望短时间运行并使用尽可能多的线程来最大化CPU?
是的,您可以通过Partitioner<T>自己进行分区处理来完成此操作.有关详细信息,请参见如何:加速小环体.
但是,在您的情况下,最好只是并行化外部循环,并将内部循环顺序保留在每个外部Parallel.For循环体内.这将为每个工作项提供足够的指令,使其可能充分使用处理器.
话虽如此,这种情况下.NET可能不会做得很好Parallel.For- 至少没有一些额外的工作.通过并行地将值分配给同一个数组,由于隐式数组边界检查,您将引入错误共享,该检查从同一位置读取(在数组开始之前).
有各种方法可以解决这个问题 - 例如,一个选项可能是从多维数组转换为锯齿状数组.通过正确的索引和循环,这可以减少对"共享"数组的写入次数.另一个选择是使用不安全的代码和指针而不是直接数组访问,因为这避免了边界检查,但需要非常仔细的编码.
| 归档时间: |
|
| 查看次数: |
1049 次 |
| 最近记录: |