OpenCV支持Android的硬浮动

OpenCV with hard-float support for Android

本文关键字:支持 Android OpenCV      更新时间:2023-10-16

我想在我的Android应用程序中使用硬件浮点支持,该应用程序大量使用OpenCV库。然而,当我为硬浮点设置gcc标志时(如这里和这里所描述的),我会收到链接器错误:CCD_ 1。然后,我添加了链接器标志-Xlinker --no-warn-mismatch,使这些错误消失,但应用程序在与OpenCV库的第一次交互时立即崩溃。

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

有没有一个版本的OpenCV4Android,带有使用硬浮动架构的预构建二进制文件?如果没有,是否可以编译这样的版本?一个人会怎么做?在使用OpenCV时,有没有更聪明的方法可以利用硬件浮点支持?

您不需要在硬浮点模式下构建即可使用硬件浮点单元。只要您为armeabi-v7a ABI构建,它就会使用硬件浮点单元(VFPv3)。

为了澄清,硬浮点选项(通过向编译器添加-mhard-float参数,或为armeabi-v7a-hard ABI构建)只会更改参数传递给函数的方式。在内部,Android在整数寄存器中传递所有浮点/双函数参数。这确保了为armeabi(ARMv5,不保证浮点单元,需要以这种方式传递这些参数)构建的代码在FPU上的现代设备上运行时仍然有效。也就是说,函数获取整数寄存器中的所有浮点参数,并将它们移到FPU寄存器中,以便在函数中进行所有计算。

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

因此,从hardfloat中获得的实际好处只是,每次函数调用可以节省一些指令(正如第一个链接中的答案所指出的,这些指令非常便宜)。根据库的功能结构,这可能是一个完全不重要的变化,也可能是显而易见的。不幸的是,我对OpenCV的内部结构还不够了解,无法猜测加速的潜力有多大(如果有的话)。

因此,概括一下,是的,你是对的,你只构建了代码的硬浮动版本,但将其链接到OpenCV的软浮动ABI版本。为了使工作正常进行,您还可以在OpenCV中的所有函数调用上添加__attribute__((pcs("aapcs")))标记,但这几乎会浪费所有潜在的优势,因为所有繁重的工作(很可能)都是在库中完成的,而不是在调用代码中。

因此,为了获得硬浮动ABI的潜在好处,您需要使用XXX.o uses VFP register arguments, output does not0参数重建所有OpenCV(具体如何做到这一点,我无法帮助您)。但是,只要它是针对armeabi-v7a(带有-march=armv7-a -mfpu=vfpv3参数)构建的,它就应该已经在使用硬件FPU,它只是使用向后兼容的ABI。softfp-ABI的开销比完整的softfloat版本(未使用-mfpu=vfpv3构建)的开销小几个数量级。