OpenCV支持Android的硬浮动
OpenCV with hard-float support for Android
我想在我的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 not
0参数重建所有OpenCV(具体如何做到这一点,我无法帮助您)。但是,只要它是针对armeabi-v7a
(带有-march=armv7-a -mfpu=vfpv3
参数)构建的,它就应该已经在使用硬件FPU,它只是使用向后兼容的ABI。softfp-ABI的开销比完整的softfloat版本(未使用-mfpu=vfpv3
构建)的开销小几个数量级。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 编译时未启用intel oneApi CUDA支持
- 如何使用ndk-build.cmd构建Android.so文件
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用CMake检测支持的C++标准
- 不再支持Android NDK APP_STL gnustl_shared
- 如何在 Android 原生版本中正确支持不同C++ STL
- Android NDK:LIBC 支持硬质量
- 是在32位系统上为Android Studio安装CMAKE的任何方法,以允许C 支持
- 使用C 支持创建Android项目的正确方法
- 如何在支持PSql的情况下将Qt C++应用程序部署到Android
- OpenCV支持Android的硬浮动
- QTcpServer语言 - Android上不支持的Socket操作
- Android NDK无疑是支持wchar的最佳途径
- log4cplus库是否支持Android的c++共享运行库
- Android OpenGL ES 2.0使用扩展支持顶点数组对象吗?
- android NDK编译器支持内联汇编吗?(例如asm或__asm关键字?)
- Android上启用c++ 11支持
- Android c++支持to_string, stof等字符串
- 如何使用cmake和Android NDK在C++中加载线程支持