我可以在 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章