- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想在我的 Android 应用程序中使用硬件浮点支持,它大量使用了 OpenCV 库。但是,当我为 hard-float 设置 gcc 标志时(如 here 和 here 所述),我收到链接器错误消息:XXX.o 使用 VFP 寄存器参数,输出不使用
。然后我添加链接器标志 -Xlinker --no-warn-mismatch
使这些错误消失但应用程序立即崩溃似乎是与 OpenCV 库的第一次交互。
到底是怎么回事?我是否正在编译代码的硬浮点版本并将其与软浮点 OpenCV 链接?
是否有一个版本的 OpenCV4Android 带有使用硬 float 架构的预构建二进制文件?如果没有,是否可以编译这样的版本?一个人会怎么做?在使用 OpenCV 的同时,是否有更智能的方法来利用硬件浮点支持?
最佳答案
您不需要在 hard-float 模式下构建即可使用硬件浮点单元。只要您为 armeabi-v7a
ABI 构建,它就会使用硬件浮点单元 (VFPv3
)。
澄清一下,hard-float 选项(通过将 -mhard-float
参数添加到编译器,或为 armeabi-v7a-hard
ABI 构建)改变参数传递给函数的方式。在内部,Android 在整数寄存器中传递所有 float/double 函数参数。这确保了为 armeabi
(ARMv5 不保证浮点单元,需要以这种方式传递这些参数)构建的代码在 FPU 上的现代设备上运行时仍然有效。即,函数获取整数寄存器中的所有浮点参数并将它们移至 FPU 寄存器以在函数内进行所有计算。
使用 hard-float 选项构建时,此类参数直接在 FPU 寄存器中传递,但正如您的第二个链接所指出的,这要求您调用的所有代码都使用相同的选项构建,并且 JNI 函数入口点需要用 JNICALL
正确标记。
因此,您从 hardfloat 中获得的实际好处只是您在每次函数调用中节省了一些指令(正如第一个链接中的答案所指出的,这些非常便宜)。根据库的功能结构,这可能是一个完全无关紧要的更改,也可能很明显。不幸的是,我不太了解 OpenCV 的内部结构,无法猜测有多大的潜在加速(如果有的话)。
所以回顾一下,是的,您是对的,您只是构建了代码的硬浮点版本,但将其链接到 OpenCV 的软浮点 ABI 版本。为了使事情正常进行,您还可以在 OpenCV 的所有函数调用上添加 __attribute__((pcs("aapcs")))
标记,但这几乎会丢掉所有潜在的优势,因为所有繁重的工作(很可能)是在库中完成的,而不是在您的调用代码中完成的。
因此,为了获得 hard-float ABI 的潜在好处,您需要使用 -mhard-float
参数重建所有 OpenCV(具体怎么做,我不能帮助你)。但只要它是针对 armeabi-v7a
(使用 -march=armv7-a -mfpu=vfpv3
参数)构建的,它就应该已经在使用硬件 FPU ,它只是使用向后兼容的 ABI。 softfp ABI 的开销比完整的 softfloat 版本(不是使用 -mfpu=vfpv3
构建)的开销小几个数量级。
关于android - 支持 Android 的硬 float 的 OpenCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28391685/
算力时代,视频云需要怎样的 CPU? 在数据爆发式增长及算法日益精进的大背景下,属于「算力」的时代俨然到来。随着视频成为互联网流量的主角,日趋饱和的音视频场景渗透率、人类对“感官之限”的追
我正在使用 keras 开发深度网络。有一个激活“硬 sigmoid”。它的数学定义是什么? 我知道什么是 Sigmoid。有人在Quora上问了类似的问题:https://www.quora.com
我有一个不寻常的 SQL 问题,我不太确定如何最好地解释,所以请耐心等待。我有三张表,一张是志愿者组织的表,一张是用户的表,一张是用户详细信息的表。 #Table 1# ## Name Preside
我正在尝试使用名为 bigText 的 jquery 插件。一个很棒的用于创建 block 头的插件。如果您想将其与自定义字体一起使用,它会声明您需要 google webfont loader,这样
假设我有一张 table date,personid 1/1/2001 1 1/2/2001 3 1/3/2001 2 1/4/2001 2 1/5/2001 5 1/6/2001 5 1/7/200
下面是我要执行的 SQL。我想避免为此执行多个请求,我很确定这是可能的…… First table : products_categories (category_id, category_infos
我在 android studio 中重新设置了一些提交,并选择了硬重置类型。我失去了一个星期的工作。是否有希望撤销此操作?我正在使用 android studio,它有内置的 GUI 选项来执行所有
当我使用我的交叉工具链编译 C 代码时,链接器会打印出警告页面,说明我的可执行文件使用了硬 float ,但我的 libc 使用了软 float 。有什么区别? 最佳答案 硬浮点使用片上浮点单元。软
linux系统有arm64,arm架构armv8-a。如何知道 debian 是运行硬浮点还是软浮点? 最佳答案 符合 AAPCS64, GNU GCC for armv8 仅提供硬浮点 aarch6
我正在开发 cortex-m3 的微内核。我创建了一个故意导致错误的小型测试应用程序。 现在我不确定如何从故障中返回。我知道堆栈可能需要使用不同函数的地址进行更新。我也知道在某些情况下从错误返回可能是
硬/软 限制是什么意思? 核心文件大小的差异例如: ulimit -Sc 1024 与 ulimit -Hc 1024 我通常在运行二进制文件之前将脚本放入 ulimit -c unlimited。
我想在 Java 中加载一个 MSCAPI keystore 并检查 MY 存储中的可用证书。但是,这些证书的一些 key 驻留在硬件 token 上,并且弹出窗口会在加载期间询问 token 。 有
是的,这是一个有点棘手的问题; 一个数组(没有副本),而不是任何奇数数组。让我解释一下,让我们从这里开始; $a = array ( 'one' => 1, 'two' => 2, 'three' =
我需要在运行 Ubuntu 12.04 的 BeagleBoard xM rev C 上运行一个使用 ftd2xx 的程序。我正在尝试使用提供的 ARM 库 libftd2xx.so here . l
我是一名优秀的程序员,十分优秀!