在评估和比较ARM处理器中的浮点性能时,我应该为mfpu指定哪个[neon/vfp/vfp3]?

5

我想评估一些不同的ARM处理器浮点性能。我使用了lmbenchpi_css5,但在浮点测试方面有些困惑。

从下面的cat /proc/cpuinfo中可以看出,我猜测有三种类型的浮点特性:neon,vfp,vfpv3?根据这个问题&答案,似乎这取决于编译器。 我仍然不知道我应该在编译参数中指定哪一个(-mfpu=neon/vfp/vfpv3),或者我应该分别用每个参数编译程序,还是只需不指定-mfpu

cat /proc/cpuinfo               
Processor       : ARMv7 Processor rev 4 (v7l)
BogoMIPS    : 532.00
Features    : swp half thumb fastmult vfp edsp neon vfpv3 tls 
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x2
CPU part    : 0xc09
CPU revision    : 4

就性能而言,“软”与“硬”的区别将产生重大影响;这通常是编译器和libc中固有的,不能通过“-mfpu”选项进行更改。请参见Debian硬浮点wiki。这与特定操作码无关,而与例程之间使用接口的方式有关。这也会影响性能。 - artless noise
2个回答

8
这可能比你预想的要复杂一些。GCC arm options page 没有解释 fpu 版本,但 ARM's manual for their compiler 做了。你还应该注意到Linux doesn't provide whole story about fpu features,只提到 vfpvfpv3vfpv3d16vfpv4
回到你的问题,你应该选择它们之间的最大公因数,将代码编译为它,并比较结果。另一方面,如果一个 CPU 有 vfpv4,而另一个 CPU 有 vfpv3,你认为哪个更好?
如果您的问题只是在选择neonvfpvfpv3之间,请选择neon(source)
-mfpu=neon selects VFPv3 with NEON coprocessor extensions.

来自gcc手册:

如果所选的浮点硬件包括NEON扩展(例如-mfpu=neon),请注意,除非还指定了-funsafe-math-optimizations,否则GCC的自动向量化不会使用浮点运算。这是因为NEON硬件没有完全实现IEEE 754浮点算术标准(特别是非规范值被视为零),因此使用NEON指令可能会导致精度损失。

有关此主题的更多信息,请参见Subnormal IEEE-754 floating point numbers support on ios...


我有两个ARM设备和两个由制造商提供的工具链。一个CFLAGS变量是-mfpu=vfpv3-d16,另一个是-mfpu=vfpv3。这两者之间的最大公因数是什么?vfpv3浮点指令集和32个双精度寄存器是否总是“包含”vfpv3-d16浮点指令集和16个双精度寄存器? - undefined

0

我已经尝试了它们中的每一个,似乎使用 -mfpu=neon 并指定 -march=armv7-a-mfloat-abi=softfp 是正确的配置。

此外,参考资料(ARM Cortex-A8 vs. Intel Atom)对于 ARM 基准测试非常有用。 另一篇有帮助的文章是关于 ARM Cortex-A 处理器和 gcc 命令行,这清除了 SIMD 协处理器的配置。


-mfloat-abi=softfp 是编译器的一个功能,而不是 CPU 的功能。 - artless noise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接