【问题标题】:How to count the number of computations in the loop?如何计算循环中的计算次数?
【发布时间】:2021-09-09 13:41:31
【问题描述】:

我正在读这本教科书:

Randal E. Bryant, David R. O'Hallaron - 计算机系统。程序员的视角 [第 3 版](2016 年,Pearson)。

目前我不确定教科书中的问题 5.5。下面,我附上了这本书的链接,以便于查找。

这是他们给出的答案:

有人可以告诉我作者是如何得出这个问题的答案的吗? 我不确定他们如何计算计算次数(n 次加法和 2n 次乘法)。

提前谢谢你,任何帮助表示赞赏:)

View Textbook Online

【问题讨论】:

  • 答案“n加法”忽略了i++的加法,以及i <= degree所需的有效求和(减法)。
  • 像计算机一样思考执行。第 7 行和第 8 行执行 2 次浮点乘法和 1 次加法。循环运行 n 次。第二个问题依赖于文本中您未提供的信息。 @WeatherVane 是正确的;较旧的文本通常会这样做。整数加法比浮点数快得多,因此被忽略。到 2016 年,这不是一个安全的假设,尽管出于其他原因忽略它是合理的。另请注意,这是实现多项式评估的糟糕方法。查找霍纳规则以获得更好的规则。或者也许这是下一个问题:)
  • 不过,文本指出浮点加法只有 3 个时钟周期。每个整数加法至少需要 1 个周期。
  • @WeatherVane:FP add 有 3 个周期 latency,FP mul 有 5 个周期 latency。 Integer add 不是xpwr*=x 关键路径依赖链的一部分,因此它并不重要。你不只是添加循环。 (根据 Megan 之前的问题,他们使用的机器模型类似于 Haswell,因此整体吞吐量也不显着。这是一个延迟瓶颈,我们真的不需要查看前端或后端 -最终吞吐量)。所以是的,添加的总数应该包括i++,因为他们没有说“FP 添加”,但不,这对性能并不重要。
  • @MeganDarcy:CS:APP 第三版的全球版在asm实践问题上有很多严重错误,因为出版商雇佣了一些不称职的人来写不同的问题,没有与教科书作者核对。请参阅 csapp.cs.cmu.edu/3e/errata.html 和 CS:APP example uses idivq with two operands? 。非全局版本没有这些错误,所以“问题”是可用的。

标签: c performance assembly x86 cpu-architecture


【解决方案1】:

结果 += .... 做了n次。

在第 7 行和第 8 行的 rhs 上有 n+n 次乘法。 它清晰可见。有什么好纠结的

【讨论】:

  • 这是 FP 加法和乘法的次数。 (是的,这对我来说也很明显)但是,i++ 中还有一个整数加法。从这个问题中不清楚这是否是唯一的混淆来源。从上下文中可以清楚地看出,我们真正需要担心性能的唯一操作是 FP 操作,特别是它们的延迟。
  • 循环操作是决定性因素。关注它是无关紧要的
  • @PeterCordes 您提到的 i++ 事物是循环的一部分,而不是您想要做的预期数学内容的一部分。如果您想计算汇编中只是“INC %ECX”的 i++ 的开销,您可以这样做。为了观察时间复杂度,我们只需要粗略的概述,而不是并列测量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2021-06-25
  • 2017-06-17
  • 2012-10-27
  • 2016-12-01
相关资源
最近更新 更多