我可以在 x86 C 程序中模拟 ARM NEON 吗?

Posted

技术标签:

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

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

【问题讨论】:

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

感谢您的回答。

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

【讨论】:

以上是关于我可以在 x86 C 程序中模拟 ARM NEON 吗?的主要内容,如果未能解决你的问题,请参考以下文章

arm搭建x86运行时

在 ARM Neon 程序集中使用 C 变量

ARM NEON指令集总结

如何在 iOS 设备上编译 ARM 程序集文件和在 iOS 模拟器上使用常规 C 之间进行选择

使用NEON优化ARM的卷积运算

使用 NEON/ARM 加载 8 位值