下面是一个练习题。这张表实际上填了所有的答案。然而,我需要澄清为什么这些解决方案就是它们。(阅读水平线下的问题)。
例如,我非常想了解A2和A3的解决方案行。
在我看来,A2的情况如下:
x*y轴
xy*r型
xyr*z型
现在,让我们看看这将是如何在管道:

|1|2|3|4|5|6|7|8 |9|10|11|12|13|14|15|16|17|18|19|20|21|
| | | | | | | |  | |  |  |  |  |  |  |  |  |  |  |  |  |
{ x * y } | | |  | |  |  |  |  |  |  |  |  |  |  |  |  |
        { xy * r } |  |  |  |  |  |  |  |  |  |  |  |  |
                 { xyr * z  }  |  |  |  |  |  |  |  |  |
//next iteration, which means different x, y and z's|  |
                   {x2 * y2    }  |  |  |  |  |  |  |  |
                               {x2y2 * r   } // this is dependent on both previous r and x2y2
                                           {x2y2r * z  }

所以我们可以重叠xyr*z和x2*y2,因为没有依赖冲突。然而,这只是摆脱了3个周期,对吗?
所以它仍然是(12-3)/3=9/3=3个周期,每个元素(三个元素)。那么他们如何获得A2的8/3 CPE呢?
任何帮助理解这一概念将非常感谢!不必着急,因为考试要到下周。如果你还需要什么信息,请告诉我!
(以下是完整的试题文本,以及完整填写答案的表格)
考虑下面的函数来计算n个整数数组的乘积。
我们把这个循环展开了三倍。
int prod(int a[], int n) {

int i, x, y, z;
int r = 1;

for(i = 0; i < n-2; i += 3) {
    x = a[i]; y = a[i+1]; z = a[i+2];
    r = r * x * y * z; // Product computation
}
for (; i < n; i++)
    r *= a[i];

return r;
}

对于标记为“产品计算”的行,我们可以使用括号创建五个不同的
计算关联如下:
r = ((r * x) * y) * z; // A1
r = (r * (x * y)) * z; // A2
r = r * ((x * y) * z); // A3
r = r * (x * (y * z)); // A4
r = (r * x) * (y * z); // A5

我们用每个元素的循环数来表示函数的性能
(CPE)。如书中所述,该度量假定运行时间以时钟为单位
周期,对于长度n的数组是形式Cn+K的函数,其中C是CPE。
我们在英特尔奔腾III上测量了该函数的五个版本。回想一下,这台机器上的整数乘法操作有4个周期的延迟和1个周期的发出时间。
下表显示了CPE的一些值,以及缺少的其他值。被测量的
CPE值是实际观察到的值。“理论CPE”是指
如果唯一的限制因素是
整数乘法器。
填写缺少的条目。对于测量的CPE的缺失值,可以使用
其他版本中具有相同计算行为的值。为了价值观
在理论CPE中,您可以确定
只考虑乘法器的延迟和发出时间,然后除以3的迭代。

最佳答案

在不知道CPU架构的情况下,我们只能猜测。
我的解释是,时序图只显示部分管道,从收集操作数到写入结果,因为这与依赖项解析相关。
现在,最大的if:如果依赖解析程序和执行单元之间存在缓冲阶段,则可能在偏移量8处开始第一组(3)的第三次乘法和第二组(4)的第一次乘法。
由于3依赖于2,在这里使用不同的单元是没有意义的,因此3在2之后就被排队到1单元。下面的指令4不依赖于先前的结果,因此它可以排队到单元2,并并行启动。
理论上,这种情况最早可能发生在第6个周期,CPE为6/3。实际上,这取决于CPU的设计。

10-07 12:17