首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在给定展开因子k>C*L的情况下,程序实现吞吐量限制?

为什么在给定展开因子k>C*L的情况下,程序实现吞吐量限制?
EN

Stack Overflow用户
提问于 2019-08-22 12:23:53
回答 1查看 86关注 0票数 0

我正在阅读计算机系统:程序员的观点,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循环展开*/

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-24 14:25:02

随着向量长度的增长,所有这些说法都越来越接近事实。理论上,当管道启动和关闭时间除以总处理时间为零时,可以得到无限长向量的界。为了简单起见,作者假设这些时间与测试中的整个处理时间相比是微不足道的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57609281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档