【问题标题】:ARM softfp vs hardfp performanceARM softfp 与 hardfp 性能对比
【发布时间】:2020-02-11 19:27:21
【问题描述】:

我有一个带有 Linux 操作系统的基于 ARM 的平台。尽管其基于 gcc 的工具链同时支持 hardfp 和 softfp,但供应商建议使用 softfp,并且该平台附带了一组标准和平台相关的库,这些库只有 softfp 版本。

我正在制作基于 OpenCV 和 tensorflow lite 的计算密集型 (NEON) AI 代码。按照供应商指南,我使用 softfp 选项构建了这些。但是,我感觉我的代码与其他有点相似的 hardfp 平台相比表现不佳。

代码性能是否取决于 softfp/hardfp 设置?我是否正确理解编译器为构建我的程序而生成的所有 .o 和 .a 文件也使用 softfp 约定,这不太有效?如果是这样,是否有任何棘手的方法可以在内部使用 hardfp 调用约定,而对外部库使用 softfp?

【问题讨论】:

  • softfp 显然会慢很多。但具有便携性优势。慢多少具体取决于您在特定平台上的软件,您必须执行该基准测试,这里没有什么可以做的。
  • softfp vs hardfp 不仅仅是参数传递,它是关于使用硬件 vs 软件,硬件(hardfp)会明显更快,多快取决于应用程序。 10倍? 100 次?快1000倍?取决于应用程序。
  • 参数传递只会影响你在构建项目时你需要的一切都是一种方式或另一种方式,不能混合。这与性能是分开的。

标签: performance gcc arm tensorflow-lite eabi


【解决方案1】:

通常,链接在一起的所有对象都需要具有相同的浮动 ABI。所以如果你需要使用这个softfp唯一的库,恐怕你也必须在softfp中编译你自己的软件。

关于混合 ABI,我也有同样的问题。见here

关于性能:与 hardfp 相比,softfp 的性能损失在于您将通过通常的寄存器而不是使用 FPU 寄存器传递(浮点)函数参数。这需要在寄存器之间进行一些额外的复制。正如 old_timer 所说,无法评估性能损失。如果您有一个包含许多浮点操作的巨大函数,则性能将是相同的。如果你有很多带有很多浮动变量和很少操作的小函数调用,性能会大大降低。

【讨论】:

  • Herearesomeexamples。对我来说,当人们忘记将-mfpu 与softfp 一起使用时,似乎唯一的大区别就发生了。否则性能影响几乎看不到。还要注意,正如谷歌在他们的justification 中提到的那样,删除hardfp,内联很重要。
【解决方案2】:

softfp 选项只影响参数传递。

换句话说,除非您在调用函数时传递大量float 类型参数,否则与hardfp 相比,不会有任何可衡量的性能损失。

由于设计良好的项目严重依赖于传递指向结构的指针而不是许多单个值,我会坚持使用softfp

【讨论】:

    猜你喜欢
    • 2021-04-10
    • 2011-09-22
    • 2012-02-07
    • 2018-06-29
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多