zynq整型与浮点乘法运算加速

2016-01-28 22:20 阅读 730 次 评论 0 条

去年想通过zynq arm neon进行加速运算,实际证明在运算较复杂需要多步进行时,并不能加速,有时在为了适应neon函数的运行,反而会降低效率。然而浮点运行加速的需求是存在,绕不过去,所以又来折腾了,这次采用的将浮点数转换为定点数进行乘法运算,然后通过移位将结果转换为实际运算的结果,这么做会损失运算精度,但从实际测试来看,可以提高些运算速度。

在无优化的情况下,运算速度比较。浮点运算比较慢,大概8万次浮点运算(运算的内容见arm neon相对复杂运算优化),需要的时间在14ms。而转换为整型进行乘法运算,然后再移位操作运算时间大约为12ms。快了约2ms时间。

clip_image002

通过编译器O2优化后的运算结果对比,浮点运算的时间由4.6m降到2.4ms,降低的幅度还算比较大。

clip_image004

应用起来还是有一些优势的,至少是比neon的效果要好些。将浮点转换为整型运算需要确定浮点的数的范围,然后通过选择整型的长度,确定浮点结果的精度与取值范围

下面是经典的定标小数的精度与表示范围

Q表示、S表示及数值范围
Q表示    S表示    十进制数表示范围
Q15    S0.15    -1≤x≤0.9999695
Q14    S1.14    -2≤x≤1.9999390
Q13    S2.13    -4≤x≤3.9998779
Q12    S3.12    -8≤x≤7.9997559
Q11    S4.11    -16≤x≤15.9995117
Q10    S5.10    -32≤x≤31.9990234
Q9    S6.9    -64≤x≤63.9980469
Q8    S7.8    -128≤x≤127.9960938
Q7    S8.7    -256≤x≤255.9921875
Q6    S9.6    -512≤x≤511.9804375
Q5    S10.5    -1024≤x≤1023.96875
Q4    S11.4    -2048≤x≤2047.9375
Q3    S12.3    -4096≤x≤4095.875
Q2    S13.2    -8192≤x≤8191.75
Q1    S14.1    -16384≤x≤16383.5
Q0    S15.0    -32768≤x≤32767

需要根据使用过程中浮点数的值域来选择定点的位置,即表示范围与精度。也可以选择32bit整型表示,32bit运算是否会影响运算速度未知.

浮点数(x)转换为定点数(xq):xq=(int)(x* 2^Q)

通过整型运算后,通过移位操作(xq*xq)>>Q,得到真实的运算结果。

注:本人测试时,整型x浮点数,浮点数的取值范围较小,所以最终的积取整后损失的精度不大。如果是浮点数x浮点数,或许是不很适用。

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:zynq整型与浮点乘法运算加速 | 起点博客
分类:应用笔记 标签:, ,

发表评论


表情