一些硬件优化技巧

                                              一些硬件优化技巧

        我们知道,在处理器中最耗时的基本运算是乘除运算和小数计算,尤其是除法运算和小数计算可能还要涉及到浮点运算,这大大增加了设计的难度和运算时间。而对于ASIC设计来说乘除运算和小数运算是需要避免的,因为这些运算不仅消耗资源还会增加功耗。尤其是在ASIC设计中可以适当的降低数据的精度,从而换取资源和时I旬。下面就介绍一下我们的设计中这方面的经验。

1 乘法计算
对于乘运算来说,可以将其变换成加运算和移位的组合,这个很容易理解,
例如24×12,这个运算就可以拆分如下:
24×12=24×(8+4)=24×(1<<3+1<<2)=24<<3+24<<2
如上式推导,24X 12变换为了24先做两次移位再进行加运算的结果。这样就去除了乘运算,只需要进行加运算和移位运算。

2.小数运算
       小数计算也是图像处理中常常会用到的,小数计算可以分为小数乘法和小数加法(小数除法可以转化为小数乘法,小数减法可以看作是小数加法)。

     小数乘法其实可以看成是乘法和除法的结合,也就是说可以看作是乘以一个数之后再除以一个数。上面已经对乘法和除法硬件实现进行了讲解,那么就很容易想到将上面的优化方法相结合来实现小数乘法的运算。这并不是不可以,但是
对于精度要求不高的场合还有更加简单的方法,那就是将小数乘法转化为整数乘法和移位的组合,乘法进一步可以变换为左移运算和加法的组合。举例说明,例如随便给定一个数0.123,我们将它与2^n相乘,按照n从小到
大依次列出O.123×2^n的结果:0.123,0.246,0.492,0.984,1.968,3.936,7.872,
15.744,31.488,62.976⋯⋯。从观察我们可以看出,3.936和62.976非常接近整数,3.936≈4,62.976≈63,那么根据n的值,0.123就可以表示为4/2^5或是63/2^9。这种近似是否有意义呢,我们可以计算出近似值与原数据的差来衡量:
4/^{2^{5}}一0.123=0.125—0.123=0.002.0.002/0.123=1.6%
63/^{2^{9}}—0.123=0.000046875.0.000046875/0.123=0.038%
         从上面的计算可以看出,近似值与原数据的差值很小,尤其是使用63/2^9进行近似所产生的误差可以忽略不计。如果进行K×0.123的计算,就可以近似为(K×63)>>9,如果精度要求不高,也可以近似为(K×4)>>5=K>>3,这样更加节省寄存器资源。所以使用这种近似方法就可以将小数乘法表示为整数乘法和移位的组合。从上面两个近似方案中也可以得出另一个结论,对于精度要求不高的计算可以使用误差较大而节省计算资源的方案,但如果精度要求较高,就必须使用更精确的方案,精度越高的近似值所消耗的寄存器位数越多。有了小数乘法的近似基础,对于小数加法也很容易找到解决方法。例如
K+0.123,按照上面的方法就可以近似为K+63>>9=(K<<9+63)>>9。这样小数加法就变成了整数加法和移位的组合。
         另外,在除法运算中,当除数是常数时,我们可以将其看作是小数乘法,也就可以按照小数计算的近似方法来做处理。但是如果除数是变量,或者对除法的精度要求很高,那么就无法使用小数计算的近似方法了。在ISP系统设计的过程中我们发现,所有的小数计算都可以使用上面的近似方法,对最终输出结果的影响很小。经过我们的精巧设计,乘法运算、除法运算和小数运算都可以转化为整数的加法和移位运算的组合。这样的处理无疑大大降低了图像算法在进行硬件实现的难度。

你可能感兴趣的:(一些硬件优化技巧)