乱序执行下每元素周期数(CPE)计算疑问:与教材结论冲突求解
关于《深入理解计算机系统》问题5.9的CPE计算疑问
问题背景
现有一台乘法运算耗时5周期的机器,运行如下代码:
double aprod(double a[], int n) { int i; double x, y, z; double 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)); } }
需计算仅受数据依赖限制的理论每元素周期数(CPE)。该问题出自Bryant等人所著《Computer Systems: A Programmer's Perspective》(《深入理解计算机系统》)第589页的问题5.9。
我的分析
每次迭代包含三次乘法:
dummy1 := (y * z)dummy2 := x*(dummy1)r*(dummy2)
其中dummy1和dummy2是为明确乘法步骤引入的临时变量。某次迭代的第3次乘法与下一次迭代的第1、2次乘法无数据依赖,可乱序执行(适用指令级并行)。但第1、2次乘法存在数据依赖,需顺序执行。因此机器可并行计算某次迭代的第3次乘法与下一次迭代的第1次乘法,随后计算下一次迭代的第2次乘法,整体每3个元素需2*5=10周期,理论CPE为10/3≈3.33。
疑问
但教材第604页给出的理论CPE为5/3≈1.67,认为第1、2次乘法可与第3次乘法并行执行,即三次乘法均可并行。请问教材是否忽略了第1、2次乘法间的数据依赖,导致结论错误?
内容的提问来源于stack exchange,提问作者user148865
相关产品推荐
相关产品推荐

