在《计算机系统:程序员的视角》一书中,练习5.5显示了一段计算多项式值的代码
double poly(double a[], double x, int degree)
{
long int i;
double result = a[0];
double xpwr = x;
for (i = 1; i <= degree; i++) {
result += a[i] * xpwr;
xpwr = x * xpwr;
}
return result;
}
本练习假设双精度浮点加法和乘法所需的时钟周期分别为3和5。读者被要求解释为什么测量的CPE(每元素周期)值为5。
根据练习答案,在每次迭代中,我们需要更新变量xpwr和result,我们需要的操作是浮点加法(对于结果)和浮点乘法(对于xpwr),因此后者控制延迟,导致最终CPE为5。
但我认为数据流应该是这样的:
xpwr result
| |
+-----+ +--[load] |
| | | |
[mul] [mul] |
| | |
| +---+ +-----+
| | |
| [add]
| |
| +------+
| |
xpwr result
所以最长的路径是从xpwr
的前一个值到结果
的新值,经过执行单元[mul]
和[add]
。因此最长的时间应该是8个周期。
我想问问
任何关于CPU、架构、执行单元、管道、浮点单元的解释都将受到赞赏。
A1:根据这本书,关键路径是数据流图中最长的路径,它必须在一条直线上,并且对单个寄存器有影响,而不是将“mul”和“add”相加,其结果只是下一个操作的中间操作数。
关于这个问题,如果继续阅读其余的内容,你就可以完成所有的事情。特别是,比较组合7的数据流图和组合5的数据流图会很有帮助。
A2:如果理解了A1,问题2就清楚了,书中的答案是合理的。
关键路径确实是8个周期,但问题要求CPE,它就像输出循环的一个周期的时间平均时间。
除了第一个周期和最后一个周期之外,处理器还可以同时执行上一次循环迭代的加法和当前乘法,因为操作数彼此不依赖。循环的第一次迭代需要完整的8个周期,但所有迭代之后,循环只需要5个周期来运行,使实际的CPE为5个周期。
P、 我同意这本书描述关键路径的方式令人困惑。他们对关键路径的定义不仅仅是采用最长路径的路径,而且该路径还必须具有操作数依赖于以前的操作的操作,因此必须是有序的。这一定义使得寻找关键路径非常不直观。
我知道我来晚了一点,但这本书绝对正确。正如您可以通过对代码计时来验证的那样,CPE实际上是5,因此第二个答案是错误的。
但第一个也是错误的。它说MUL必须同时执行,这在Nehalem体系结构(我怀疑是大多数现代处理器)中根本不可能实现。请记住,只有一个FP MUL单元和一个不同的FP ADD单元(如2011版及以后版本的书籍所示)
取而代之的是:
(假设负载始终存在,如果在缓存中仅1个周期)
首先,我们在MUL中输入xpwr*=x。紧接着,我们给xpwr*a[i](记住管道!)
...5个周期后,我们将得到xpwr
的新值,6个周期后,我们将得到xpwr*a[i]
的结果。那时,xpwr*=x
的新计算将在MUL的第1阶段进行。所以如果我们不想受到它们的限制,我们只有4个周期来完成其余的操作。
当然,这很容易,因为我们只需要FP ADD的3个周期即可获得新的结果
。
因此,很明显,限制因素是xpwr的计算。这意味着在寻找关键路径(无论是什么)时,我们必须特别关注从旧价值观到新价值观的路径。在这种情况下,结果的路径只包含一个FP ADD!(这也是一开始让我失望的原因)
主要内容:什么是AOE网,AOE网求关键路径实现过程在学习 拓扑排序一节时讲到拓扑排序只适用于 AOV 网,本节所介绍的求关键路径针对的是和 AOV 网相近的 AOE 网。 什么是AOE网 AOE 网是在 AOV 网的基础上,其中每一个边都具有各自的权值,是一个有向无环网。其中权值表示活动持续的时间。 图 1 AOE网 如图 1 所示就是一个 AOE 网,例如 a1=6 表示完成 a1 活动完成需要 6 天;AOE 网中每个顶点表示在它之前的活
问题内容: 如标题中所述,我需要确定路径是相对路径还是绝对路径,何时运行程序: 这是我的测试用例。我到底该如何在Shell程序中执行此操作? 或更笼统地说,在这种情况下,如何检查路径是相对的还是绝对的? 问题答案:
在生产者-消费者web应用程序中,为kinesis流碎片创建分区键的思路应该是什么。假设,我有一个带有16个碎片的kinesis流,我应该创建多少个分区键?真的取决于碎片的数量吗?
问题内容: 我正在尝试重定向我的响应,但是我被困在链接路径上。 以下命令将我带到tomcat的localhost并在此处搜索页面,但是按预期找不到任何内容。 为了解决此问题,我必须将我的根文件夹名称(来自webaps的名称)放在链接路径中,但是我认为这不是一个好主意。 为什么会这样呢?除了getRequestURL()或类似的方法,还有其他解决方法吗? 问题答案: 相对重定向URL相对于当前请求U
我有一个类项目,它使用一个字符作为标识符。 我希望能够检索由类表示的路径,它包含的简单有序列表: 为了存储和管理我的项目和路径,我使用了一个专用类。它包含两个,其中包含每种类型。我可以使用任务的标识符检索任务。 null 更新/注意:我正在寻找通过项目集构建路径
在数据流任务下,不是将源数据库的SQL查询放入查询窗口:我看到了OLE DB数据源-1的数据访问模式下的四个选项。表或视图2。视图名称变量3的表。SQL命令4。来自变量的SQL命令 我知道我可以使用一个变量,将查询存储在变量中,并在“执行SQL任务”中引用它,但我正在寻找一种方法,将所有查询存储在SQL文件中,并将其存储在数据流组件中以及“执行SQL脚本任务”中。我似乎找不到一种方法使它在数据流任