我正在阅读计算机系统:程序员的观点,3/E (CS:APP3e) Randal E.布莱恩特和David R. O‘’Hallaron。
作者说:
“一般情况下,只有当程序能够为所有能够执行该操作的功能单元填充管道时,程序才能实现对操作的吞吐量限制。对于具有延迟L和容量C的操作,这需要一个展开因子k≥C·L。例如,浮点乘法的C=2和L= 5,需要k≥10的展开因子。浮点加法的C=1和L= 3,达到k≥3的最大吞吐量。”
为什么会起作用?尽管吞吐量为1.00,但它只表明每一个周期都开始一个新的操作。(延迟3.00,第1.00期)
我试图勾勒出一个全流水线单元的图表,例如,浮点加法器包含三个阶段(因此是三个周期的延迟),因此它可以在每个时钟周期开始一个新的操作。
3循环-1加法,但每循环一个新的操作开始,经过3个循环后,只有第一个加法完成,4个循环后,第二个,后5个循环,第三个。因此,我们得到了3个操作,5个周期的全流水线,而不是3个操作,9个周期(不完全流水线)。我对全流水线单元的理解是错误的吗?
k=10的原因是什么?即使有两个单元,每次迭代也必须等到最后两个运算被计算出来(即10个乘法,但迭代必须等到最后两个操作完成),因此没有理由展开。
也许程序没有按顺序执行(这里我的意思是,由于分支预测,处理器不会等待每次迭代的结束?)
/* 2x2循环展开*/
void combine6(vec_ptr v, data_t *dest)
{
long i;
long length = vec_length(v);
long limit = length-1;
data_t *data = get_vec_start(v);
data_t acc0 = IDENT;
data_t acc1 = IDENT;
/* Combine 2 elements at a time */
for (i = 0; i < limit; i+=2) {
acc0 = acc0 OP data[i];
acc1 = acc1 OP data[i+1];
}
/* Finish any remaining elements */
for (;i < length; i++) {
acc0 = acc0 OP data[i];
}
*dest = acc0 OP acc1;
}发布于 2019-08-24 14:25:02
随着向量长度的增长,所有这些说法都越来越接近事实。理论上,当管道启动和关闭时间除以总处理时间为零时,可以得到无限长向量的界。为了简单起见,作者假设这些时间与测试中的整个处理时间相比是微不足道的。
https://stackoverflow.com/questions/57609281
复制相似问题