在Computer Systems: A Programmer's Perspective一书中,练习 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
和最终的 CPE 为 5。result
result
xpwr
但我认为数据流应该是这样的:
xpwr result
| |
+-----+ +--[load] |
| | | |
[mul] [mul] |
| | |
| +---+ +-----+
| | |
| [add]
| |
| +------+
| |
xpwr result
所以最长的路径是从 的前一个值xpwr
到 的新值result
,经过执行单元[mul]
和[add]
。因此最长的时间应该是8个周期。
我想问一下
- 关键路径的确切含义是什么?以及如何确定?
- 哪个答案(我的和书)更合理?
任何关于 CPU、架构、执行单元、流水线、浮点单元的解释都将不胜感激。