Parallel.For用于生成迭代和缓存行共享的值

时间:2012-08-31 11:48:06

标签: c# .net multithreading task-parallel-library

我在阅读this article

时找到Parallel Patterns的链接

但我现在有点困惑。

如果Parallel.For的每次迭代产生结果并将其存储为数组的项,该怎么办? 没有竞争条件,也不需要同步。但是缓存行必须与所有线程同步,这会降低性能。 (如果我没弄错的话)。

所以我对是否存在性能改进方法感兴趣。

1 个答案:

答案 0 :(得分:2)

  

如果Parallel.For的每次迭代产生结果并存储它,该怎么办?   作为数组的项目。

为了进行错误共享,您需要使用不同的线程来访问彼此靠近的数组项。

实际上,你有少量线程(我们称之为C)处理一个大小为N的大数组,其中N>> C.这意味着每个线程都需要处理相当多的项目。假设它们可以独立处理,理想的方法是通过连续分割,因此每个线程在数组中获得连续的位置。这可以很好地避免错误共享。

例如,处理交错的数组元素是没有意义的,因为这确实会导致错误共享。然而,可能并不总是可以使用连续策略,因为有时负载平衡会发挥作用。在这种情况下,您必须查看哪个更有害:偶尔的错误共享或错误的负载平衡。讨论很长。我确信基础TPL调度程序的设计足以获得最佳权衡。