Android 将 C++ 转换/编译为 Neon
Posted
技术标签:
【中文标题】Android 将 C++ 转换/编译为 Neon【英文标题】:Android convert/compile C++ as Neon 【发布时间】:2014-04-23 06:51:58 【问题描述】:我目前正在使用 C++ 在 JNI 和 OpenCV 的帮助下编写一个简单的 android 程序。 输入是存储为 Mat 的图像。 我不想使用 OpenCV 的 normalize 函数,而是希望用 C++ 编写我自己的 normalize 函数。 据我所知,NEON 是有支持的。 但是,查看 NDK 文件夹中的 HelloNeon 示例,我意识到代码是用 NEON instrinsics 编写的。
问题: 有没有办法直接将我的 C++ 代码编译成 NEON 代码? 即我希望避免在 NEON 内在函数中编写我的函数。
谢谢。
【问题讨论】:
查看 Marat Dukhan 的 yeppp.info。不过我还没用过。 谢谢。我去看看。 【参考方案1】:很大程度上取决于编译器。在最近的版本中,gcc 和 clang 都支持“自动矢量化”,但是生成代码的质量非常多变——主要取决于实际的源代码。与往常一样,编译器首先负责生成正确的代码,其次是生成快速/高效的代码。如果有疑问,请选择“安全”选项。
不过,它应该可以使用-mfpu=neon -ftree-vectorize
。
我确实希望您需要“按摩”代码以使其能够很好地矢量化 - 至少这是我在 x86 上的经验,其中编译器将在矢量化时尝试构建 SSE 指令。它在相当简单的情况下成功,但在代码更复杂时回退到“常规代码”。通常,后来的编译器确实比旧版本的编译器工作得更好。
如果您真的需要获得良好的矢量化结果,您可能最终需要使用 Neon 内在函数。
【讨论】:
公平地说:如果他想要好的结果,他必须在汇编程序中编写霓虹灯循环。从内在函数生成的代码仍然很糟糕。 我不确定 NDK 将什么用于其编译器。我目前的工作流程如下:编写 C++ -> 运行 ndk-build -> 运行 ant -> 安装 apk。我需要在哪里插入 NEON 选项?提到我使用 ubuntu 12.04 来执行此操作可能会有所帮助。 您使用的主机系统应该没有任何区别。 NDK 使用一个版本的 gcc - 取决于哪个版本的 NDK。您可能不得不摆弄 makefile 来构建代码以使其使用这些标志,因为我怀疑默认情况下会启用 Neon 代码和矢量化。但我看不到任何其他选择。 我目前正在使用 android-ndk-r9d-linux-x86_64。我不太确定如何摆弄 makefile 以启用从 C++ 到 NEON 的编译,因为给出的示例是用 instrinsics 编码的。你能指出我正确的方向吗?我知道有两个makefile。一个名为 Android.mk,另一个名为 Application.mk。我不知道要更改哪个以及如何更改。 抱歉,不确定,因为我的家用机器上没有 NDK(也不要在工作中这样做!)以上是关于Android 将 C++ 转换/编译为 Neon的主要内容,如果未能解决你的问题,请参考以下文章