5.15
A.关键路径是%xmm1更新路径上的加法。
B.CPE下界是浮点加法的延迟。
C. 两个load操作的吞吐量界限。
D.乘法不在关键路径上,是通过流水线实现的,两个版本的CPE都为3.00,其限制因素都是浮点数加法的延迟。
5.17
void inner4(vec_ptr u, vec_ptr v, data_t *dest)
{
long int i;
int length = vec_length(u);
data_t *udata = get_vec_start(u);
data_t *vdata = get_vec_start(v);
int limit = length - 2;
data_t sum1 = (data_t) 0;
data_t sum2 = (data_t) 0;
data_t sum3 = (data_t) 0;
for (i = 0; i < limit; i+=3) {
sum1 = sum1 + udata[i] * vdata[i];
sum2 = sum2 + udata[i+1] * vdata[i+1];
sum3 = sum3 + udata[i+2] * vdata[i+2];
}
for(; i<length;i++)
sum1 = sum1 + udata[i] * vdata[i];
*dest = sum1+sum2+sum3;
}
A. load执行单元的吞吐量
B. 因为程序在执行中需要7个寄存器来保存变量i、sum1、sum2、sum3、limit、udata、vdata,而IA32只有6个通用寄存器,多于的变量只能存到内存中,这会涉及到内存的读写,导致了速度慢,而只做4路循环展开只需要5个寄存器来保存变量i、sum、limit、udata、vdata,,使得变量值更新不会再去访问内存。因而该版本的CPE比只做4路循环展开时的CPE还要差。