【问题标题】:how the execution time drops sharply (more than expected) as the number of processors increase?随着处理器数量的增加,执行时间如何急剧下降(超过预期)?
【发布时间】:2015-07-23 11:17:43
【问题描述】:

我正在使用 F# 中的“Parallel.For”并行执行我的程序 5000000 次。 每个任务的平均执行时间如下所示。

活动核心数:执行时间(微秒)

2 : 866

4 : 424

8 : 210

12 : 140

16 : 106

24 : 76

32 : 60

提供事实,

通过将核心数量增加一倍,我们可以获得的最大加速应该小于 2(理想情况下可以是 2)。

这种急剧加速的原因可能是什么。

【问题讨论】:

  • 比率非常接近最佳值,我会将任何差异视为测量错误,
  • 从 32 到 16 最大可能是一半,但小于一半。我反复进行了测量,提供的值是所有这些测量的平均值。
  • 60*2 > 106 这是次优的。最佳值是 53
  • 我所期待的,对于 2 个核心,它是 866,所以对于 4 个核心,它会超过 433,因为也会有一些同步开销。
  • 投票结束,这个问题源于对一小部分数字的直接误解。

标签: parallel-processing f# multicore


【解决方案1】:
  • 2 * 866 = 1732
  • 4 * 424 = 1696
  • 8 * 210 = 1680
  • 12 * 140 = 1680
  • 16 * 106 = 1696
  • 24 * 76 = 1824
  • 32 * 60 = 1920

因此,当您增加并行度时,相对性能会提高,然后开始下降。这种改进可能是由于分摊了间接成本,例如 JIT 编译或管理并行化的算法。

随着并行度的增加,性能下降通常是由于某种资源争用、过度的上下文切换等造成的。

【讨论】:

  • 我唯一的疑问是......当我的核心数量增加一倍时,性能提升应该少于两倍,因为会有一些开销。这种行为在内核数量较多的情况下是合理的,但对于较少数量的内核,它比双倍要好,这可能是什么原因?
  • @anushri 详细的答案取决于您如何安排性能。你在评论中说你正在使用秒表,但我的意思是找出你开始和停止秒表的具体点。如果您可以编辑问题以包含一些示例代码,则可能会看到。或者,您可以使用分析器,它可以让您直接测量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 2021-07-19
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多