内在编码和汇编编码哪个更好? [关闭]
Posted
技术标签:
【中文标题】内在编码和汇编编码哪个更好? [关闭]【英文标题】:Which is better Intrinsics or assembly coding? [closed] 【发布时间】:2018-02-02 10:16:07 【问题描述】:我很困惑哪个更好。 我知道在两者中都编写代码,但我没有得到对于任何处理器来说通常更好的代码。请告诉我同样的原因。
【问题讨论】:
一般从内在函数开始,然后只有在需要进一步优化时才使用 asm。对于 x86、PowerPC 等,这很少需要,但 ARM/Neon 的编译器不是很好,如果您的代码对性能非常关键,您可能不得不求助于汇编。 问题没有提到具体情况。在一些相对罕见的情况下,汇编代码更快,例如这 400+ 行 assembly code 用于使用 X86 pclmulqdq 指令(无进位乘法)的快速 crc16 或 crc32。 【参考方案1】:正如保罗在 cmets 中所说,您的需求和期望将表明:
通常从内在函数开始,然后仅在需要时才使用 asm 进一步优化。对于 x86、PowerPC 等,这很少见 有必要,但是 ARM/Neon 的编译器不是很好,你可以 如果您的代码足够,则必须求助于汇编 性能关键
内部函数是大多数编译器的一部分,您可以使用它们来满足您的性能要求。内在函数比内联汇编或纯汇编更简单。如果你打算使用 C 或 C++ 等高级语言,我建议不要使用内联汇编。根据我的经验,ICC、GCC 和 Clang 无法优化内联汇编,或者如果优化它会很小。当您想为特定架构(如 x86)编写代码并为不同的微架构重新编译时,内在函数非常有用。正如彼得在 cmets 中所说:
能够使用不同的
-mtune=haswell
重新编译您的代码或-mtune=znver1
选项
内在函数对优化器来说也是一个挑战,但不像内联汇编。例如,如果您编译用 C 和 Intrinsics 编写的代码,您的性能可能不会有所不同,但是,您启用了编译器优化。在我的测试中,大多数O3
、禁用自动向量和O2
在 Intrinsics 中获得了相同的性能,而标量代码中的相同方法显示了完全不同的性能(不是自动向量化,而是其他优化)。在this paper 中,您可以看到内联汇编的评估和矩阵-矩阵乘法的内在函数。此外,Intrinsic 函数不可移植,需要将来维护等。我发现一个new interface 声称它与 Intrinsics 相比不会损失性能。
【讨论】:
当你想为特定的微架构编写代码时,内在是很好的你有倒退。如果您希望能够使用不同的-mtune=haswell
或 -mtune=znver1
选项重新编译您的代码,则内在函数非常有用。如果您要针对特定的 uarch 进行调整而不是尝试通用,那么手写 asm 会更有优势。以上是关于内在编码和汇编编码哪个更好? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
哪个更容易编码:Android 应用程序与 iOS 应用程序? [关闭]
你能推荐一个更好的用于 Unity C# 编码的 IDE 吗? [关闭]