为了使用硬件浮点单元,您不需要构建硬浮点模式。只要您为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
构建的)。