【问题标题】:Are the fast integer types faster when stored in the CPU registers?当存储在 CPU 寄存器中时,快速整数类型是否更快?
【发布时间】:2020-04-24 05:18:23
【问题描述】:

我一直在考虑快速整数类型:

int_fast8_tint_fast16_tint_fast32_tint_fast64_tuint_fast8_tuint_fast16_tuint_fast32_tuint_fast64_t

在过去的几天里,我问了一个关于为什么(如果是的话)这些类型比其他整数类型更快的问题:

Why are the fast integer types faster than the other integer types?


我现在进一步思考的是,如果

  1. 更快的类型 在特定环境(依赖于实现/架构)上更快,因此该环境反映了该问题的理想环境,
  2. register 类的对象 存储在 CPU 的寄存器中(但通常在使用 register 类声明时并不总是需要存储在那里),它们是在相同的环境下速度更快,并且
  3. CPU 的一个寄存器能够保存所需的整数值,


    • 如果使用register 存储类声明,快速整数类型是否会更快?

喜欢:

register int_fastY_t i;

*(暗示上述前提。)

或者它们会相互干扰并降低性能?

【问题讨论】:

  • 请注意 register 在 C++ 中不可用。如果您询问这些类型的变量,则应删除 C++。
  • @NathanOliver C++ 中是否有等效的东西来声明对象应存储在 CPU 的寄存器中?
  • 请注意,register 说明符在 C++11 中被弃用,在 C++17 中被移除不要使用它。
  • "在 C++ 中是否有等效的东西来声明对象应存储在 CPU 的寄存器中?" - 不。您应该将寄存器分配留给您的编译器。在任何情况下,它都会比你做得更好(很可能)。
  • C 2018 6.7.1 6 表示“使用存储类说明符 register 为对象声明标识符建议尽可能快地访问该对象。这些建议的有效程度是由实施定义的。”仅此而已,一个建议。它不需要实现将值存储在寄存器中,而且它对好的现代编译器的用处是有限的——它们已经很好地优化了。

标签: c performance integer cpu-registers


【解决方案1】:

恐怕这里的答案是顾问最喜欢的:“视情况而定”。使用 new 关键字不会使底层 CPU 更快——这是对编译器使用最快类型的提示。在许多架构中,将数字保存在寄存器中确实会使算术更快,但这并不意味着它在任何架构中都会更快,并且无论如何,register 关键字是对编译器的另一个提示——它不保证任何对生成代码的约束,尤其是在优化之后。

【讨论】:

    【解决方案2】:

    存储在 CPU 寄存器中会更快。

    register 不会导致编译器将值存储在寄存器中。 register 绝对什么都不做。只有极旧的编译器使用register 来知道哪些变量要存储在寄存器中。新的编译器会自动完成。即使是 20 岁的编译器也会自动完成。

    听起来您正在尝试使程序更快,但您不了解程序实际在做什么,因此您正在询问您听说过的所有与速度相关的事情。

    我提醒您,例如,如果您使用 GCC 在 x86-64 上,那么 int_fast16_tint64_t 相同,这与 int 相同,register 绝对什么都不做,所以register int_fast16_tint 相同。这不是一个神奇的加速命令。

    如果您想使用这些技巧使您的程序更快,您应该从阅读编译器生成的汇编代码开始。 Information for GCCVisual C++。然后你可以寻找低效的汇编代码,当你找到一些时,你可以找出如何加速它。现在,你是tilting at windmills

    【讨论】:

    • 较新的编译器确实会考虑register`。
    • 即使在旧编译器中, register` 也是对优化器的提示,就像 volatile 一样。
    • 为什么int64_t 比 32 位访问快?切片不应占用额外的机器周期或微指令,并且 32 位操作数会缩短一个字节,从而减少 I-cache 和指令获取的压力。
    • @ReinstateMonica-ζ-- 我认为访问 32 位值需要一个额外的指令字节。
    • @user253751 不,指令编码默认为 32 位寄存器。要访问完整的 64 位,需要 REX 前缀。 inc eax; 占用两个字节:ff c0,而inc rax 占用三个字节:48 ff c0
    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 2013-06-24
    • 2013-09-13
    • 1970-01-01
    • 2021-09-06
    • 2013-01-08
    • 1970-01-01
    • 2013-06-25
    相关资源
    最近更新 更多