背景技术
Phong光照计算模型是一种能够产生真实感很强的颜色计算方法,该计算模型与物理事实足够接近,对各种光照条件和材质属性都能获得很好的绘制效果,但是该算法计算量大,运算复杂,特别是,其中的高光计算部分还应用了幂指数运算cosxθ,是Phong光照计算模型中最耗时的部分。随着3D图形应用对图像真实感的要求越来越高,Phong模型也越来越多得应用到光照计算中。而对于嵌入式系统,其处理器能力有限。将Phong光照模型应用到嵌入式系统当中,需要快速准确的计算出cosxθ的结果,并且在集成电路设计时还要满足嵌入式系统面积和功耗的要求。
目前,计算幂指数的方法主要有查找表法和分段直线近似法。查找表(Look UpTable,LUT)将预先计算好的值存进Ram中,然后根据输入x在表中查找出最接近的结果。这种方法采样点越多,结果的精度就越高,但是同时所需的存储空间就越大。而且这种方法只能用于单输入,对cosxθ的查找需要三步。图形硬件中的特殊功能单元(Special FunctionUnit,SFU)是一种基于查找表的方法,能够计算除倒数,倒数的平方根,以2为底的对数,以2为底的指数以及求小数部分五种功能。利用SFU查找出cosxθ的结果的步骤为:
1)根据输入cosθ在LUT中找出对应的系数c0,c1,c2;
2)计算c0+c1gcosθ+c2gcos2θ,得到log2cosθ的近似结果;
3)计算mul_result=xlog2cosθ;
4)根据输入mul_result在LUT中查找出对应的系数c3,c4,c5;
5)计算c3+c4gmul_result_c5gmul_result2,即得到cosxθ的近似值。
用SFU计算cosxθ所花费的资源太多。需要用到两块LUT,七次乘法,四次加法,计算所需的cycle数也比较长。并且精度越高,LUT就会越大。因此,这种方法不适合应用于嵌入式系统中。
分段直线近似法分别将区间[0,1]的log2(1+f)曲线和2f曲线用分段直线去近似。分的段数越多,结果就越精确,但同时硬件的开销也会增大。目前主要有三段和8段两种分段方法。三段(记做3u-3u)将区间[0,1]分为[0,1/4]、[1/4,3/4]、[3/4,1]三个区间;八段(记做8-8)将区间[0,1]按1/8的间隔平均分成8段。以上两种分段直线近似的方法与查找表法相比,硬件的开销会小一些,误差会比查找表法大,把这种方法应用到图形算法中,生成图形像素的RGB颜色值的误差会比较大(最大为3)。但是,可以对分段方法做一些优化,以提高精度,减小误差。
有上述现有技术的分析可知,查找表法所占用的硬件资源比较多,计算也比较耗时。传统的分段直线近似法虽然占用的硬件资源比较少,但是误差比较大。
发明内容
基于上述现有技术,本发明提出一种应用于GPU中的幂指数运算装置和运算方法,基于分段直线近似的方法实现了Phong模型中的高光计算中的幂指数运算。
本发明提出了一种应用于GPU中的幂指数运算方法,该方法包括以下步骤:
第一步,计算log2cosθ,数学表达式为:
Ci表示各个分段区间表达式中的常数项;Ci和ai的定点表示值查表获得;e、f表示IEEE754单精度浮点数的指数部分、尾数部分;
第二步,计算xlog2cosθ,x表示高光系数,θ表示反射光线和观察方向之间的夹角,x是一个32位定点数,高8bit表示整数部分,其余位表示小数部分,计算采用CSA乘法器,得到结果mul_result,如果mul_result大于127,则表示结果溢出,最终cosxθ的结果为0;
第三步,计算2mul_result,包括以下步骤:
将mul_result在小数点处拆分成整数部分和小数部分,分别记做int_part和fra_part,如式(1)所示:
2mul_result=2int_part+fra_part=2int_part-121+fra_part (1)
式(1)中,21+fra_part用分段直线去近似,令frac=1+fra_part,则有
将式(2)的计算结果保留小数点后面的23位,记做exp_fra_result;
其中,计算2frac,数学表达式为:
第四步,得到exp_fra_result之后,用IEEE754单精度浮点数表示cosxθ的近似值。
本发明还提出了一种应用于GPU中的幂指数运算装置,该运算装置包括log2cosθ运算单元和2frac运算单元,所述log2cosθ运算单元包括第一、第二多路选择器,二进制23位乘以16位的CSA乘法器和第一、第二加法器;第一多路选择器包括a0~a7共8路输入,s[7:0]为选通信号,且s[7:0]为八位2进制数,第二多路选择器包括c0~c7共8路输入,s[7:0]为选通信号,且s[7:0]为八位2进制数;所述二进制23位乘以16位的CSA乘法器用于实现log2cosθ运算,数学表达式为:
Ci为各个分段区间表达式中的常数项,Ci和ai的定点表示值查表获得;e、f表示IEEE754单精度浮点数的指数部分、尾数部分;
第一多路选择器的输入为B0~B7表示反对数表达式中的各个常数项,由frac的高三位直接选通;第二多路选择器的输入为frac>>7、0,选通信号是s1[1:0];第三多路选择器的输入为frac>>5、frac>>4、0,选通信号是s1[3:2];第四多路选择器的输入为frac>>3、frac>>2、0,选通信号是s1[6:4];以及一个22位CSA加法器、一个23位CSA加法器、一个31位CSA加法器和一个31位CPA加法器,所述一个22位CSA加法器、一个23位CSA加法器、一个31位CSA加法器和一个31位CPA加法器实现的运算,其数学表达式为:
其中,0≤frac<1,上述数学式的计算结果是一个不小于1的定点数,只保留小数点后面的23bit。
与现有技术相比,本发明能够在满足嵌入式系统因为空间大小和功耗而受限制的计算能力的同时,快速而又比较准确的图形处理单元完成Phong模型中的高光计算,为集成电路的设计提供了具有更好的图形处理能力的嵌入式系统设计。
具体实施方式
为了满足嵌入式系统对面积和功耗的要求,同时能让应用于嵌入式系统的图形处理单元快速而又比较准确的完成Phong模型中的高光计算,在本发明中,使图形处理单元生成的图形的RGB的颜色误差控制在[-1,1]之间。
而本发明(记做8u-8)所采用的分段方法资源的开销小于查找表法,速度也比查找表法快,精度比传统的分段方法要高,误差小。
下面结合附图和具体实施例对本发明的技术方案作进一步说明。本发明是基于分段直线近似的。
Phong模型的高光计算公式如式(1):
Is=ksLscosxθ (1)
式(1)中,ks表示在入射的镜面反射光中有多少被反射;Ls表示入射光颜色;x表示高光系数,x一般大于0;θ是反射光线和观察方向之间的夹角。由式(1)可得到式(2):
本发明中,输入是cosθ和x。cosθ用IEEE754单精度浮点数表示,x用32bit的无符号定点数表示,其中,高8bit表示整数部分,其余表示小数部分。
由式(2)可知,如图1所示,对cosxθ的计算基本上可以分为三步:
第一步,先计算log2cosθ。
第二步,计算xlog2cosθ,结果记为mul_result。
第三步,计算2mul_result。
如图2所示,IEEE754单精度浮点数中,最高位表示符号位,次高8bit表示指数部分,低23bit表示尾数部分。
进而,cosθ可以表示成式(3):
cosθ=(-1)s(1+f)2e-127 (3)
如图3所示,把图2中的指数部分e和尾数部分f分别用小数点位于第23bit和24bit之间的31位定点数表示。
1、log2cosθ的计算过程
暂不考虑cosθ的符号位,根据式(3),可以得到log2cosθ的计算表达式,如式(4):
log2cosθ=(127-e)-log2(1+f) (4)
在本发明中,log2(1+f)的计算采用8段不等间距直线近似,如式(5):
这样,就可以得到log2(1+f)的近似结果,进而可以得到log2cosθ的近似结果,并且结果是一个小数点位于第23bit和24bit之间的定点数。
2、xlog2cosθ的计算过程
x是一个32位定点数,高8bit表示整数部分,其余位表示小数部分。为了加快计算速度,xlog2cosθ的计算采用的是CSA乘法器,得到结果mul_result。如果mul_result大于127,则表示结果溢出,最终cosxθ的结果为0。
3、2mul_result的计算过程
将mul_result在小数点处拆分成整数部分和小数部分,分别记做int_part和fra_part,如式(6)所示:
2mul_result=2int_part+fra_part=2int_part-121+fra_part (6)
式(6)中,21+fra_part用分段直线去近似,令frac=1+fra_part,则有
由于0≤frac<1,所以式(7)的结果是一个不小于1的定点数,只需保留小数点后面的23bit即可,记做exp_fra_result。
4、最终结果表示
得到exp_fra_result之后,就可以用IEEE754单精度浮点数表示cosxθ的近似值,如图4所示。
本发明的具体实施例:
对数部分分段的间距及各个段的参数如表1所示:
表1 log2(1+f)近似直线参数对应表
f |
a |
b |
f |
a |
b |
0~8/32 |
1.2856 |
0.0062 |
26/32~28/32 |
0.7825 |
0.2223 |
8/32~16/32 |
1.0510 |
0.0633 |
28/32~30/32 |
0.7569 |
0.2448 |
16/32~22/32 |
0.9058 |
0.1337 |
30/32~31/32 |
0.7387 |
0.2617 |
22/32~26/32 |
0.8246 |
0.1886 |
31/32~32/32 |
0.7270 |
0.2730 |
对数曲线的误差公式可以表示为式(8):
1og_error=log2(1+f)-aif-bi,i=0,1,2,…7,(0≤f<1) (8)
误差曲线如图11所示。
图示只是理论上的误差,在实际用硬件实现时,还要有舍入误差。
a用一个16bit的定点数表示,最高位表示整数部分,将所有的a都乘以2^15,就可以得到定点表示的a。然后再让a和f相乘,这里需要用一个23*16bit的CSA乘法器。b用23bit定点数表示,并且23bit均表示小数。
式(9)中,Ci为各个分段区间表达式中的常数项。Ci和ai的定点表示值如表2所示:
表2 Ci和ai的定点表示值
i |
C |
a |
i |
C |
a |
0 |
1065300803 |
42127 |
4 |
1063488264 |
25641 |
1 |
1064822011 |
34439 |
5 |
1063299983 |
24802 |
2 |
1064231279 |
29681 |
6 |
1063157710 |
24206 |
3 |
1063771188 |
27020 |
7 |
1063063182 |
23822 |
对于ai和bi的选择,需要用的f的高5位,对应关系如表2所示。
表2 f,a,b关系对照表
f[22:18] |
a |
b |
f[22:18] |
a |
b |
f[22:18] |
a |
b |
f[22:18] |
a |
b |
00000 |
a0 |
b0 |
01000 |
a1 |
b1 |
10000 |
a2 |
b2 |
11000 |
a3 |
b3 |
00001 |
a0 |
b0 |
01001 |
a1 |
b1 |
10001 |
a2 |
b2 |
11001 |
a3 |
b3 |
00010 |
a0 |
b0 |
01010 |
a1 |
b1 |
10010 |
a2 |
b2 |
11010 |
a4 |
b4 |
00011 |
a0 |
b0 |
01011 |
a1 |
b1 |
10011 |
a2 |
b2 |
11011 |
a4 |
b4 |
00100 |
a0 |
b0 |
01100 |
a1 |
b1 |
10100 |
a2 |
b2 |
11100 |
a5 |
b5 |
00101 |
a0 |
b0 |
01101 |
a1 |
b1 |
10101 |
a2 |
b2 |
11101 |
a5 |
b5 |
00110 |
a0 |
b0 |
01110 |
a1 |
b1 |
10110 |
a3 |
b3 |
11110 |
a6 |
b6 |
00111 |
a0 |
b0 |
01111 |
a1 |
b1 |
10111 |
a3 |
b3 |
11111 |
a7 |
b7 |
从表可以得出,ai和bi与f[22:18]的关系如下,其中ABCDE分别表示f[22],f[21],f[20],f[19],f[18]。由表2可以得到:
同理可得:
s7=ABCDE
这样,用s[7:0]=[s0,s1,s2,s3,s4,s5,s6,s7]组成多路选择器的选择信号。用Verilog描述s[7:0]对Ci和ai的选择:
如图12所示的log2cosθ运算单元框图,是对下面公式的硬件实现:
该运算单元包括第一、第二多路选择器,乘法器(本发明中选用23位乘以16位(均是二进制)的CSA乘法器)和第一、第二加法器。
因为不同的cosθ值对应的是不同的i,即8段直线中的某一段,所以给一个cosθ,就有与其对应的ai,Ci,e和f。计算log2cosθ,首先需要确定cosθ对应的ai和Ci(e和f直接根据cosθ就能得到),这样才能进行式(10)中的计算。第一多路器包括a0~a7共8路输入,s[7:0]为选通信号。s[7:0]是八位2进制数,具体选通方法如下:
若s[7:0]=10000000输出=a0
若s[7:0]=01000000输出=a1
若s[7:0]=00100000输出=a2
若s[7:0]=00010000输出=a3
若s[7:0]=00001000输出=a4
若s[7:0]=00000100输出=a5
若s[7:0]=00000010输出=a6
若s[7:0]=00000001输出=a7
其余情况,输出为0。
同理,第二多路选择器也是这个道理。
所谓的CPA,就是CarryPropagateAdder,进位传播加法器,实际上就是传统的加法器。
乘法的本质是加法,比如3*4,就是4个3相加,3+3+3+3。换算成二进制亦是如此,如下:
13*6=78
同理,如果是一个23位二进制数乘以一个16位二进制数,那么就会有16个二进制数相加。如果采用传统的加法,运算的速度肯定会很慢;如果采用CSA,最大限度的开发其中的并行性,则速度就会相对快一些。这也是本发明之所以选用CSA来实现硬件的原因。
综上,图12就是log2cosθ=(Ci+(-e))+(-(ai×f)),这里省略了减法转加法的那一步。
反对数部分采用8段等间距直线近似。对应的参数如表3所示:
表3 2frac近似直线参数表
frac |
k |
l |
frac |
k |
l |
0~1/8 |
92/128 |
1024/1024 |
4/8~5/8 |
131/128 |
924/1024 |
1/8~2/8 |
101/128 |
1015/1024 |
5/8~6/8 |
143/128 |
864/1024 |
2/8~3/8 |
111/128 |
995/1024 |
6/8~7/8 |
155/128 |
792/1024 |
3/8~4/8 |
121/128 |
964/1024 |
7/8~8/8 |
169/128 |
695/1024 |
反对数部分的误差可表示为式(11):
exp_error=2fra-kfrac-li,i=0,1,2,…7(0≤frac<1) (11)
误差曲线如图13所示。
图14是对下式的实现,
这时,采用移位加法代替乘法。l用24bit定点数表示,最高位表示整数,其余部分表示小数。
同样,图14中通过多路选择器来表示,s1[6:0]是选通信号,s1[6:0]是由frac的高三位译码得到的。第一多路选择器的输入为B0~B7表示上式中的各个常数项,由frac的高三位直接选通;第二多路选择器的输入为frac>>7、0,选通信号是s1[1:0];第三多路选择器的输入为frac>>5、frac>>4、0,选通信号是s1[3:2];第四多路选择器的输入为frac>>3、frac>>2、0,选通信号是s1[6:4];还包括一个22位CSA加法器、一个23位CSA加法器、一个31位CSA加法器和一个31位CPA加法器。
例如,frac=3/16,frac的高三位为001,选通B1=8314881,frac∈[1/8,1/4),由表4可得,s1[6:0]=0111111,即s1[6:4]=011,选通s1[3:2]=11,选通frac>>5;s1[1:0]=11,选通frac>>7。
其中,B0~B7表示各个段表达式中的常数项,s1[6:0]是由frac的高3位进行译码得到的,译码器如表4所示:
表4译码对照表
frac[22:20] |
000 |
001 |
010 |
011 |
100 |
101 |
110 |
111 |
s[6:0] |
0111000 |
0111111 |
1010010 |
1110011 |
0001110 |
1100010 |
1001010 |
1000111 |