1
5
请看这篇文章: http://blogs.msdn.com/pfxteam/archive/2008/08/12/8849984.aspx 具体来说,限制并行区域中的内存分配,并仔细检查写操作,以确保它们不会发生在其他线程读或写的内存位置附近。 |
2
5
所以我终于弄明白了问题所在——我认为与SO社区分享它会很有用。
非线性性能的整个问题是
自从
通常,为仅在单个方法范围内使用(且有意义)的变量创建类级成员是反模式。但在本例中,由于我需要尽可能大的可伸缩性,所以我将使用(并记录)这种优化。 后记: 在我做了这个更改之后,并发进程能够实现1220万次计算/秒。 附笔。 伊戈尔·奥斯特罗夫斯基(igor Ostrovsky)因其与msdn博客的日耳曼链接而备受赞誉,这有助于我识别和诊断问题。 |
3
3
由于并行化中存在一些固有的开销,因此与顺序算法相比,并行算法可以实现非线性缩放。(理想情况下,当然,您希望尽可能接近。) 此外,在并行算法中,通常会有一些您不需要在顺序算法中处理的事情。除了同步(这会使您的工作陷入困境),还有其他一些事情可能发生:
据我所知,您当前的显式方法在线程之间使用共享迭代器。如果处理在整个数组中变化很大,这是一个不错的解决方案,但可能会有同步开销,以防止跳过元素(检索当前元素并将内部指针移动到下一个元素需要进行原子操作,以防跳过元素)。 因此,最好对数组进行分区,假设每个元素的处理时间大致相等,而不管元素的位置如何。假设您有1000万条记录,这意味着告诉线程1处理元素0到249999,线程2处理元素2500000到4999999等。您可以为每个线程分配一个ID,并使用该ID计算实际范围。 另一个小的改进是让主线程充当计算线程之一。但是,如果我没记错的话,那就是 非常 小事情。 |
4
0
我当然不会期望线性关系,但我想你会看到一个更大的收益。我假设所有内核的CPU使用率都已达到最大。我脑子里只有几个想法。
编辑: 对不起,我刚注意到你已经解决了我的两个问题。 |
5
0
我在这里问了一个类似的问题,题为“为什么在分配大量内存时,我的线程.NET应用程序不能线性缩放?” Why doesn't my threaded .Net app scale linearly when allocating large amounts of memory? |
Imad · Linq扩展方法没有使用Object类的Equals 1 年前 |
user8512043 · 根据每个元素中的数字对列表进行排序 2 年前 |
Nick Fleetwood · 调度语法的LINQ查询 2 年前 |
Asdrubal Hernandez · Linq查询特定数组索引出错 2 年前 |
Drago · Linq通过比较Id和具有Id的对象列表来查询获取列表 2 年前 |