我正在使用包含i.MX6 ARM处理器的Wandboard-Quad。这个处理器有一个我想要使用的FPU。在我做之前,我想测试我会得到多少改善。我有一个基准算法,并尝试过没有优化,并与-mfpu = vfp,似乎没有改善 - 我得到改进优化= 3.在ARM处理器上测试FPU
我使用arm-linux-gnueabi库 - 关于什么是不正确的,以及如何判断我是否在使用FPU?
谢谢, 亚当
我正在使用包含i.MX6 ARM处理器的Wandboard-Quad。这个处理器有一个我想要使用的FPU。在我做之前,我想测试我会得到多少改善。我有一个基准算法,并尝试过没有优化,并与-mfpu = vfp,似乎没有改善 - 我得到改进优化= 3.在ARM处理器上测试FPU
我使用arm-linux-gnueabi库 - 关于什么是不正确的,以及如何判断我是否在使用FPU?
谢谢, 亚当
看具有-S标志汇编输出和查看是否有被生成的任何FPU的指令。这可能是最简单的事情。
除此之外,您的算法有可能使用的浮点很少,以至于通过加载和卸载FPU寄存器来屏蔽任何用途。在这种情况下,在代码的其他部分进行O3优化会显示您获得单独的FPU使用情况。
-mfpu
选项仅在GCC执行矢量化时有效。向量化本身需要合理的优化级别(最低为-O2
,-ftree-vectorize
选项开启)。因此,请尝试-O3 -ftree-vectorize -mfpu=vfp
以利用FPU并根据简单的-O3
级别测量差异。
另请参阅ARM GCC docs适用于可能需要-funsafe-math-optimizations
的情况。
没有任何优化,GCC的输出效率太低,以至于您实际上可能无法测量软件和硬件浮点之间的差异。
要查看FPU添加的好处,您需要使用一致的优化级别进行测试,然后使用-msoft-float
或-mhard-float
。
这将强制编译器针对不同的库进行链接,并对浮点操作进行函数调用,而不是使用本机指令。底层库仍然有可能使用硬件浮点,但我不会担心太多。
您可以使用-mfpu=
来选择不同的FP指令集。对于i.MX6,我认为你需要-mfpu=neon
,因为它应该启用所有适用的浮点指令(不仅仅是NEON指令)。
可能是默认情况下采用vfp支持。检查工具链构建选项'gcc -v'。关于优化写的东西也是如此,但可能只是您的基准很差。 – auselen