【问题标题】:Can I emulate ARM NEON in an x86 C program?我可以在 x86 C 程序中模拟 ARM NEON 吗?
【发布时间】:2015-03-25 04:40:56
【问题描述】:

我正在开发一些数值软件,其性能很大程度上取决于数值精度(即浮点数、双精度等)。 我注意到 ARM NEON 并不完全符合 IEEE754 浮点标准。有没有办法在 x86 CPU 上模拟 NEON 的浮点精度?例如模拟 NEON SIMD 浮点运算的库。

【问题讨论】:

  • 请注意,NEON 算术 应该是单精度 754 - “不合规”主要来自在 754 指定多种模式(舍入、异常)的某些方面具有固定值陷印、异常处理等)如果精度比速度更重要,请考虑针对 VFP 而不是 NEON。
  • NEON 没有将非规范化视为零吗?如果是这样,我相信 x86 中有一个设置可以做同样的事情。
  • 确实,我认为(基于对 ARM ARM 的快速浏览,不能保证)重要的位是刷新为零,舍入到最近(除了整数转换)和默认 NaN - 由于 NEON 本质上是 IEEE-754 的子集,如果设置得当,任何完全兼容的实现都应该产生相同的行为。
  • 您真的依赖精度吗?如果是这样,您将需要改用 VFP——它是完全符合单/双设置的。还是您只是在追求可重复性?

标签: android iphone c arm neon


【解决方案1】:

大概吧。

我对 SSE 不太熟悉,但您可以强制许多 SSE 模式表现得像 NEON。这将取决于您的编译器和可用的库,但请参阅Visual Studio FP unit control functions。这可能足以满足您的要求。

此外,您可以使用arm_neon.h 标头来确保您使用类似的内在函数来完成类似的事情。

最后,如果您确实需要在这些边界条件下达到这种精度,您将需要一个好的测试套件来验证您是否按预期实现了结果。

最后,即使使用纯“C”代码,通常符合 IEEE-754,并使用 ARM 上的 VFP,正如其他评论者所提到的,你会得到不同的结果,因为浮点是一个非常...不规则的过程,受制于优化和操作顺序的突发奇想。让结果在不同的编译器之间匹配是一项挑战,更不用说硬件架构了。例如,如果您想在 CL/MSVS 上与 /fp:precise 进行比较,通常需要使用 -ffloat-store 标志在 Intel 上使用 gcc 获得非常令人满意的结果。

最后,您可能需要接受某种非零容错。试图达到零可能很困难,但如果你到达那里,听到你的结果会很棒。这似乎有可能……但很难。

【讨论】:

    【解决方案2】:

    感谢您的回答。

    最后,我用的是安卓手机连接桌面,手机上运行了一些功能。

    【讨论】:

      猜你喜欢
      • 2012-08-29
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 2015-07-08
      相关资源
      最近更新 更多