优化程序性能(2)

延迟:表示完成运算所需的总时间
发射时间:表示两个连续的同类型运算之间需要的最小时钟周期数
容量:表示能够执行该运算的功能单元的数量
在这里插入图片描述
我们看到,从整数运算到浮点运算,延迟是增加的。还可以看到加法和乘法运算的发射时间都为1,意思是说在每个时钟周期,处理器都可以开始一条新的这样的运算。这种很短的发射时间都是通过使用***流水线***实现的。发射时间为1的功能单元被称为***完全流水线化的***:每个时钟周期可以开始一个新的运算。表示发射时间的一种更常见的方法是指明这个功能单元的最大吞吐量,定义为发射时间的倒数。
延迟界限给出了任何必须按照严格顺序完成合并运算的函数所需要的最小CPE值。吞吐量界限给出了CPE的最小界限。
我们可以将访问到的寄存器分为四类:
只读:这些寄存器只用做源值,可以作为数据,也可以用来计算内存地址,但是在循环中他们是不会被修改的。
只写:这些寄存器作为数据传送操作的目的。
局部:这些寄存器在循环内部被修改和使用,迭代与迭代之间不相关。
循环:对于循环来说,这些寄存器既作为源值,又作为目的,一次迭代中产生的值会在另一次迭代中用到。(***循环寄存器之间的操作链决定了限制性能的数据相关!***)
一个原则:数据流表示中的关键路径提供的只是程序需要周期数的下界。还有其他一些因素会限制性能,包括可用的功能单元的数量和任何一步中功能单元之间能够传递数据值的数量。

一个常用的优化程序的方法是循环展开,循环展开是一种程序变换,通过增加每次迭代计算的元素的数量,减少循环的迭代次数。循环展开能够从两个方面改进程序的性能。首先,他减少了不直接有助于程序结果的操作的数量,例如循环索引计算和条件分支。第二,它提供了一些方法,可以进一步变化代码,减少整个计算中关键路径上的操作数量。

/* 2 x 1 loop unrolling */
void combine5(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 acc = IDENT;
    /* Combine 2 elements at a time */
    for(i = 0; i < limit; i +=2) {
    acc = (acc OP data[i]) OP data[i+1];
    }
    /* Finish any remaining elements */
    for(; i < length ;i++){
    acc = acc OP data[i];
    }
    *dest = acc;
}

上面的代码是合并代码的使用“2x1循环展开”的版本。第一个循环每次处理数组的两个元素,也就是每次迭代,循环索引i+2,在一次迭代中,对数组元素i和i+1使用合并运算。
在这里插入图片描述
我们可以看到,2x1循环展开对整数加法实现了优化,虽然循环体内的语句延迟依旧存在着顺序依赖,但是这个循环展开的循环索引i每次增加2,减少了循环索引计算和条件比较,因此实现了优化。思考一下,对于整数乘法、浮点数加法和乘法,这个循环展开并没有优化这是为什么?(提示:观察这三种运算的延迟界限)

一般来说,向量长度不一定是2的倍数。想要使我们的代码对任意向量长度都能正确工作,可以从两个方面来解释这个需求。首先,要确保第一次循环不会超出数组的界限。对于长度为n的向量,我们将循环界限设为n-1。然后,保证只有当循环索引i满足i<n-1时才会执行这个循环,因此数组最大索引i+1满足i+1<(n-1)+1=n。
把这个思想归纳为对一个循环按任意因子k进行展开,由此产生kx1循环展开。为此,上限设为n-k+1,在循环内对元素i到i+k-1应用合并运算。每次迭代,循环索引i+k。那么最大循环索引i+k-1会小于n。要使用第二个循环,以每次处理一个元素的方式处理向量的最后几个元素。这个循环体将会执行0~k-1次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值