【问题标题】:Android convert/compile C++ as NeonAndroid 将 C++ 转换/编译为 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。不过我还没用过。
  • 谢谢。我去看看。

标签: android c++ opencv neon


【解决方案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(也不要在工作中这样做!)
猜你喜欢
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多