我目前正在JNI和OpenCV的帮助下使用C++编写一个简单的Android程序。输入是存储为Mat的图像。我希望用C++编写自己的normalize函数,而不是使用OpenCV的normalize功能。据我所知,有人支持近地天体。然而,通过查看NDK文件夹中的HelloNeon示例,我意识到代码是用NEONinstrinsic编写的。
问题:有没有办法直接把我的C++代码编译成NEON代码?即,我希望避免用NEON内部函数编写函数。
谢谢。
很大程度上取决于编译器。在最近的版本中,gcc和clang都支持"自动向量化",但生成的代码的质量变化很大,主要取决于实际的源代码。一如既往,编译器首先负责生成正确的代码,其次负责生成快速/高效的代码。如果有疑问,请选择"安全"选项。
但是,使用-mfpu=neon -ftree-vectorize
应该是可行的。
不过,我确实希望您需要对代码进行"按摩",使其能够很好地向量化——至少这是我在x86上的经验,编译器在向量化时会尝试构建SSE指令。它在相当简单的情况下成功,但当代码更复杂时,它又回到了"常规代码"。一般来说,较新版本的编译器比旧版本的编译器工作得更好。
如果你真的需要获得良好的矢量化结果,你可能最终需要使用霓虹灯内部函数。