2015-02-08 208 views
0

我想在我的Android应用程序中使用硬件浮点支持,这会大量使用OpenCV库。但是,当我设置硬浮动的gcc标志时(如herehere所述),我收到链接器错误: XXX.o uses VFP register arguments, output does not。然后添加链接器标记-Xlinker --no-warn-mismatch,这些标记使这些错误消失,但应用程序立即崩溃,看起来是与OpenCV库的第一次交互。OpenCV支持Android的硬件支持

究竟发生了什么?我是否编译我的代码的硬浮点版本并将其与软浮点OpenCV链接?

是否有OpenCV4Android版本的预构建二进制文件使用硬浮点架构?如果没有,是否有可能编译这样的版本?如何做到这一点?在使用OpenCV时,是否有更智能的方式来利用硬件浮点支持?

回答

6

为了使用硬件浮点单元,您不需要构建硬浮点模式。只要您为armeabi-v7a ABI构建,它将使用硬件浮点单元(VFPv3)。

为了说明问题,硬 - 浮点选项(通过将-mhard-float参数添加到编译器或构建armeabi-v7a-hard ABI)仅改变参数传递给函数的方式。在内部,Android将所有浮点/双精度函数参数传递到整数寄存器中。这确保了在FPU上的现代设备上运行时,为armeabi(ARMv5不保证浮点单元,需要以这种方式传递这些参数)构建的代码仍然可以工作。也就是说,函数将所有浮点参数存入整数寄存器,并将它们移到FPU寄存器,以完成函数内的所有计算。

当使用硬浮选项构建时,这些参数直接在FPU寄存器中传递,但是随着第二个链接指出,这要求您调用的所有代码都使用相同的选项构建,并且JNI函数条目积分需要用JNICALL正确标记。

所以你从硬鞭毛中获得的实际好处只不过是你为每个函数调用保存了一些指令(并且正如第一个链接中的答案指出的那样,这些都相当便宜)。根据图书馆的功能结构,这可能意味着一个完全不重要的变化,或者可能是显而易见的。不幸的是,我不知道OpenCV内部结构足够好,可以猜测有多大的潜在加速比率。

所以回顾一下,是的,你是对的,你只是建立你的代码的硬浮点版本,但将它连接到一个软浮动ABI版本的OpenCV。为了使事情顺利进行,您还可以在OpenCV的所有函数调用中添加__attribute__((pcs("aapcs")))标记,但这几乎可以排除所有潜在的优势,因为所有繁重的工作(很可能)都是在库中完成的,而不是在调用代码中完成。

所以为了获得硬浮动ABI的潜在好处,你需要用-mhard-float参数重新构建所有的OpenCV(具体怎么做,尽管我不能帮你)。但只要它的目标是armeabi-v7a(与参数-march=armv7-a -mfpu=vfpv3),它应该已经使用硬件FPU,它只是使用向后兼容的ABI。 softfp ABI的开销比完整softfloat版本的开销小(不是由-mfpu=vfpv3构建的)。