2010-05-28 54 views
1

我想通过使用并行扩展来使我的计算应用程序更快。我是新来的,所以我刚刚用Parallel.ForEach替换了主要的foreach循环。但计算变得更加缓慢。降低并行扩展性能的常见原因是什么?并行扩展缓慢工作的原因

感谢

+1

真的没有足够的信息来回答你的问题。你需要提供一个具体的例子。 – 2013-01-04 23:20:19

回答

1

您只通过在满足若干条件平行得到改善。首先,你为什么会期望速度提高?

您可以预期性能会提高的情况是

  1. 如果您有顺序操作等待资源,使TCP连接到服务器并下载数据,这可能会更快地并行执行。
  2. 如果您有多个处理器/内核,则可以更快地在内核上执行每个任务,而不是使用100%的内核,而不是其他任何内核。

如果您有一个核心和很多小操作,上下文切换和分配管理并行线程所需资源的额外工作可能会超过优势。

如果您描述您的具体情况,我们可以尝试推测为什么它在您的示例中速度较慢。

实际上并行计算的维基百科条目有这方面的一些好的信息,请http://en.wikipedia.org/wiki/Parallel_computing

你要特别注意Amdahl定律。

+0

总之,我有一个对象列表,并尝试计算每个对象的一些属性值。对象是孤立的,没有公共变量可以计算。有一个静态类用于存储常量,但其字段不可变。 英特尔酷睿i7用于计算。所有内核都有90-100%的忙碌。但是它的工作速度比一个内核繁忙时的单线程计算慢。 – darja 2010-05-28 09:10:20

+0

我假设计算是非常基本的。因此,为每个线程分配资源的开销超过了从并行执行中获得的价值。 列表中有多少个物体? 解决此问题的经典方法是减少将大量线程创建为最佳值的开销。你的I7可能会有8个核心,所以你可以自己做分工。 – Cobusve 2010-05-28 11:26:16

+0

试试这个: 1.制作一个方法来计算对象列表中的属性,而不是单个对象。 2.编写一些代码,将您的对象组分成8个列表。 3.现在使用并行扩展启动8个并行进程,每个进程都在列表上执行计算。 如果您对此进行分析,您可以准确衡量将数据集分为8个列表所需的额外工作量以及迭代每个列表的开销。 如果这种开销低于使用所有核心的性能收益,那么这会提高你的性能,否则你只是增加努力(时间) – Cobusve 2010-05-28 11:27:23