FPGA Notes

FPU

0
阅读(2153)

[FPU种类]
MicroBlaze FPU - MB内置,单精度,加减乘除开方比较转换
V4 PPC APU_FPU - PPC APU接口,单精度,加减乘除开方比较转换
V5 PPC APU_FPU_VIRTEX5 - PPC APU接口,单/双精度,加减乘除开方移位绝对值比较转换

[问题]
1. 怎样使用FPU
2. C语言的标准函数库都是为双精度小数写的,用了sqrt()函数还是没有用到FPU
3. 怎么检查编译出来的结果有没有使用FPU?
4. 为什么我看到dump中使用了fsqrt但是也包含了的软件函数,整个函数大概有7K长?
5. 如果是加减乘除,需要用特别的函数吗?

[Solution]
1. 怎样使用FPU
- 在硬件加入了FPU之后,EDK会给Compiler添加一些用于FPU的开关。这些开关不用用户手动添加,但是如果发现工具没有自动添加,用户也可以手动指定

一些可能用到的开关有:
-mno-xl-soft-mul
-mxl-multiply-high
-mhard-float
-mxl-float-sqrt
-mxl-float-convert

参考AR31770


2. C语言的标准函数库都是为双精度小数写的,用了sqrt()函数还是没有用到FPU
- 如果要使用单精度的FPU,需要使用单精度的函数
- sqrtf()函数就是sqrt()的单精度版,fabsf()是fabs()的单精度版,但是不是标准C
- #include
参考apu_fpu_virtex5 datasheet --> Runtime library functions

3. 怎么检查编译出来的结果有没有使用FPU?
- mb-objdump -S executable.elf > dump
- 在dump文件中查找相应的指令,比如fsqrt。其他指令参考datasheet

4. 为什么我看到dump中使用了fsqrt但是也包含了的软件函数,整个函数大概有7K长?
- 当输入了硬件FPU不能处理的输入数据,比如负数之后,软件的sqrtf函数会继续运算和报错。
- 如果确定所有的输入都是合法的,可以用-ffast-math开关把这些代码去掉

5. 如果是加减乘除,需要用特别的函数吗?
- 对于加减乘除来说不需要使用特殊的函数,应该是由于这些符号都是可重入的。
- 注意给的参数一定要使用单精度的,如果是常数比如定义 a = 16.0f; b = a/4.1f; 或 b = a/(float)4.1;


[Reference]
Xilinx Answer Records
CR478364

[后续问题]
如果V4或Microblaze要使用双精度FPU该怎么办?
- 一个可行的办法:因为CoreGen中有一个Free的IP - Floating Point 4.0,可以提供单/双精度的加减乘除开方等运算。因此可以将它封装在一个FSL Custom IP中。但是由于不能获得编译器的支持,因此这种做法还需要自己封装加减乘除开方等所需的函数,使之使用FSL接口传递数据。

Baidu
map