内在编码和汇编编码哪个更好? [关闭]

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 吗? [关闭]

编码类型,如何确定[关闭]

算法 - 我可以使用内置实用程序函数进行在线编码访谈和挑战吗? [关闭]

jqGrid 和 dataTable,哪个更好? [关闭]

fsockopen 和 curl 之间哪个更好? [关闭]