Arm Neon Intrinsics vs手装配

Geo*_*ost 12 arm intrinsics neon

https://web.archive.org/web/20170227190422/http://hilbert-space.de/?p=22

在这个过时的网站上,它表明手写的asm会比内在的更好.我想知道这是不是现在的真相,即使是现在2012年.

那么使用gnu交叉编译器为内在函数改进了编译优化?

Rob*_*ier 13

我的经验是内在的并不值得这么麻烦.编译器在内在函数之间注入额外的寄存器卸载/加载步骤太容易了.让它停止这样做的努力比在原始NEON中编写东西更复杂.我在最近的编译器中看到过这种东西(包括clang 3.1).

在这个级别,我发现你真的需要控制到底发生了什么.如果你做的事情几乎没有错,你就可以拥有各种各样的摊位.在内在函数中进行操作就像戴上焊工手套的手术一样.如果代码对性能至关重要,我根本不需要内在函数,那么内在函数就不够好了.也许其他人在这里有不同的经历

  • 我完全同意.内在不值得努力.如果你非常清楚Neon是如何工作的,那么你可以强制改进内在函数的代码生成,但是,你根本就不需要内在函数. (3认同)
  • 这符合我对ARM/Neon的体验.对于x86/SSE和PowerPC/AltiVec,编译器足够好,用内在函数编写的SIMD代码很难用汇编程序来打败,但是Neon代码生成(至少使用gcc)似乎并不是那么好,而且它是如果你准备手工编写汇编程序,不难以击败Neon内在函数SIMD代码2倍. (2认同)
  • 一种方法可能是最初在内在函数中编码,测量性能,然后为任何仍需要进一步提速的例程转到汇编程序. (2认同)

Bit*_*ank 9

我不得不在几个项目中使用NEON内在函数来实现可移植性.事实是,GCC没有从NEON内在函数生成良好的代码.这不是使用内在函数的弱点,而是GCC工具的弱点.Microsoft的ARM编译器从NEON内在函数生成了很好的代码,在这种情况下不需要使用汇编语言.便携性和实用性将决定您应该使用哪些.如果你可以处理编写汇编语言,那么写asm.对于我的个人项目,我更喜欢在ASM中编写时间关键代码,这样我就不必担心错误/劣等编译器会弄乱我的代码.

更新: Apple LLVM编译器介于GCC(最差)和Microsoft(最佳)之间.它对指令交错和最佳寄存器使用不起作用,但至少它会生成合理的代码(在某些情况下与GCC不同).

Update2: ARMv8的Apple LLVM编译器得到了显着改进.它现在可以很好地从C和内在函数生成ARMv8代码.

  • 另一家公司是微软.他们的ARM编译器是一流的.GNU的人不喜欢听MS工具如何优越,但这是事实. (3认同)