【问题标题】:SIMD performance degrade on Android FrameworkAndroid 框架上的 SIMD 性能下降
【发布时间】:2014-07-27 09:34:56
【问题描述】:

我正在为 Intel Atom 处理器开发基于 Android x86 的框架。我已经实现了整个框架,但是我的代码的 SIMD 实现遇到了问题。当我运行基本的 C 代码时,它在模拟器和硬件上提供了相当可观的性能,但是,当我为代码启用内在函数选项时,没有实际收益,但性能损失可以忽略不计。我已经在 Intel i7 处理器上运行了我的代码,大约有 200% 的增益。我当然会考虑 PC 和平板电脑使用的核心频率和数量,但当我在 Android 框架上启用 SIMD 代码时仍然应该有一些收益。 目前我分析过的可能问题:

1) 本地 C 标志(任何人都可以为英特尔凌动处理器建议合适的 C 标志)。

2)是否建议使用.so文件而不是框架中的源代码。

3) 适用于 Intel Atom 的 NDK,我使用的是 4.8。

4) 优化级别应设置为 O2 或 O3。

如果有任何其他原因可能会影响性能,请告诉我。 提前谢谢你。

【问题讨论】:

  • 这个问题可能需要更清楚:你能解释一下“启用内在函数选项”是什么意思吗?您可以自己编写内部代码(但这不像“启用”某些东西;它更像是使用汇编编写一些代码),或者您可以使用编译器显式/自动矢量化。

标签: android simd android-framework android-x86 intel-atom


【解决方案1】:

英特尔发布了general optimization tips for Android on Atom,其中列出了一些可能会阻止您的 SIMD 代码按预期运行的因素。这可能是内存对齐问题——x86 需要 16 字节对齐以获得最佳结果。

【讨论】:

    【解决方案2】:

    所有英特尔凌动平台至少支持 SSSE3。

    要了解编译器能够向量化的内容,您可以使用-ftree-vectorizer-verbose 标志。

    1) 您可以使用-mtune=atom -mssse3 -mfpmath=sse 编译代码以充分使用SSSE3,包括用于FP 数学。 (在 32 位编译时,mfpmath 默认设置为 387,这会慢很多。)

    为 x86 ABI 仅提供 SSSE3 代码会更安全。如果只需要支持特定平台,64bits Atom都支持SSE4.2,可以使用-mtune=slm -msse4.2 -mfpmath=sse进行优化

    2) 我不确定我是否理解您的问题 2),但如果您使用的是预编译的 .so 文件,则在编译链接到它的代码时不会进一步优化。

    3) 最新的 NDK 通常是最好的,当前版本是 r9d。 GCC 4.8 相比默认的 GCC 4.6 也带来了很多性能优化,你可以通过在 Application.mk

    中设置NDK_TOOLCHAIN_VERSION:=4.8 来使用它

    4) -O3 相当安全,性能更好,你应该使用它。

    【讨论】:

    • 感谢您的回复。我已经做了一些这些优化。您是否有任何有助于优化英特尔凌动架构代码的特定文档或文章。我目前正在针对 Saltwell 架构进行优化。
    猜你喜欢
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2013-12-24
    • 2011-04-08
    • 1970-01-01
    相关资源
    最近更新 更多