【问题标题】:gcc intrinsic vs inline assembly : which is better?gcc 内在与内联汇编:哪个更好?
【发布时间】:2014-10-29 20:37:22
【问题描述】:

如果我想向程序员公开一条特定于机器的指令,有两种方法可以做到:

  1. 定义一个新的内置/内在
  2. 暴露与内联汇编 asm() 相同[作为单一算术类型指令,我认为不需要 asm volatile()]

我已经读过内置函数允许编译器处理类型检查、寄存器分配和“其他优化”等。但是即使在 asm() 的情况下编译器也需要这样做,对吗?那么对于单个指令使用intrinsic over asm() 的性能优势究竟是什么?

如果涉及多条机器指令,等式如何变化?

支持内在的“可移植性”论点是可以理解的,但我很想了解一个相对于另一个的性能优势(如果有的话)。

【问题讨论】:

  • 对于单个指令,我怀疑会有明显的差异。
  • 内置。 GCC 将您的内联汇编逐字粘贴到代码流中,它对内联汇编所做的唯一分析是您放置的寄存器约束的可行性。这意味着如果指令在给定情况下更优化,则没有机会将指令转换为其他内容,或者如果可以证明指令无用,则将其删除。
  • 内联汇编适用于当您比编译器更了解并希望它不碍事的情况下,以便您可以按照您想要的顺序在寄存器上准确执行您想要的指令你要。这通常是个坏主意。

标签: c gcc assembly compiler-construction inline-assembly


【解决方案1】:

我认为这很大程度上取决于你在做什么。修改 GCC 并要求修改后的 GCC 来构建您的程序,除非/直到您的 GCC 补丁使其成为上游,这比仅使用内联 asm 更令人头疼。

如果您要使用的指令具有不依赖于特定指令集架构的抽象含义,请添加内置/内在指令,以便使用它的相同代码可以自动在所有目标上运行(回退到更复杂的实现在没有指令的目标上有多个指令)可能是“正确”的选择,但可能仍然不实用。

如果指令是非常特定于 ISA、晦涩难懂、对性能不重要等(我正在考虑加载一个特殊的硬件寄存器、cpu 模式寄存器、获取模型信息等,但我确定您可以考虑其他示例)然后只使用内联 asm 几乎可以肯定是正确的解决方案。

即使您确实认为内置函数是解决问题的“正确”解决方案,但出于实际原因需要采用内联 asm 方法,您仍然可以使用宏或静态内联函数将其抽象为以后很容易用内在函数替换所有使用(或在没有指令的目标上使用后备实现)。

【讨论】:

    猜你喜欢
    • 2012-10-20
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多