【问题标题】:32 bit operation vs 64 bit operation on a 64bit machine/OS64 位机器/操作系统上的 32 位操作与 64 位操作
【发布时间】:2010-04-06 21:28:22
【问题描述】:

哪种操作,即 32 位操作或 64 位操作(例如屏蔽 32 位标志或 64 位标志)在 64 位机器上会更便宜?

【问题讨论】:

    标签: 32bit-64bit


    【解决方案1】:

    由于您没有指定架构,我只能建议一个一般性的答案,因为它取决于操作和所讨论的处理器架构。一旦您将数据保存到 CPU 寄存器中,那么无论该值最初是 32 位还是 64 位,大多数操作通常会花费相同的时间。

    但是,某些架构在数据如何进入寄存器方面可能存在一些差异。在某些情况下,“本机”值可能比某些硬件上的较小值更快:

    获取数据

    • 获取“原生大小”的值可能比获取较小的值更快。也就是说,处理器可能无论如何都需要获取 64 位,然后屏蔽/移出其中的 32 位以“加载”一个 32 位值。处理 64 位值时不需要此屏蔽/移位,因此可以更快地加载它。 (这违背了一个直观的想法,即两倍大的东西可能需要两倍的时间来加载)。

    • 或者,如果总线可以处理半角取指,则可以在加载 64 位值的同时加载 32 位。

    • 更令人困惑的是,CPU 缓存也可以改变结果。通常,当您从内存中读取一个值时,会将多个内存位置的“行”读入高速缓存,以便可以从快速高速缓存提供后续读取,而不需要从 RAM 中完全读取。在这种情况下,如果您按顺序访问多个值,使用 32 位值会更快,因为其中两倍的值将被缓存,从而减少缓存未命中。

    计算

    • 处理器硬件已针对处理 64 位值进行了优化,因此使用 32 位计算值可能会带来更多麻烦,从而降低处理速度。例如它可能能够“本机”处理双精度(64 位)值,但必须先将浮点(32 位)值转换为双精度值,然后才能对其进行处理,然后再将结果转换回浮点数。

    • 或者,可能有 32 位和 64 位路径通过 CPU,或者 CPU 可能能够以不影响指令整体执行时间的方式进行所需的任何转换,在在这种情况下,它们可以以相同的速度计算。

    • 这可能会影响复杂的操作(浮点),但不太可能是简单的操作(AND、OR 等)的问题

    【讨论】:

      【解决方案2】:

      一般而言,64 位操作或 32 位操作的成本相同。 32 位操作最终可能会采用额外的指令,具体取决于编译器是否需要确保 64 位寄存器的高 32 位被清除(或符号扩展),但该操作通常成本很低。

      指令编码可能存在一些差异,这可能会使一个占用的空间比另一个占用更多,但这(以及优势所在的方式)取决于许多因素。

      【讨论】:

      • 当然,需要注意的是,64 位操作会处理两倍的数据,对吧?
      • @tloflin - 当然,但我想我在想这个问题是在询问等效的操作,例如unsigned long long x |= 0x10ULLunsigned long x |= 0x10UL。一般来说,我认为你不应该担心性能方面的问题,你应该担心数据需求方面的问题。除非已知性能是某种问题。
      【解决方案3】:

      这取决于 - 屏蔽标志通常会使用 AND 指令,一旦数据进入寄存器,该指令将快速执行(约 1 个周期)。从内存中加载 64 位数据通常比加载 32 位数据要慢——但如果您使用超过 32 个标志,则无论如何您都必须加载超过 32 位数据,并一次性处理屏蔽与用两三个指令相比,循环将提高速度。这是否会对整体速度产生影响通常取决于周围的指令——例如,如果数据已经在缓存中,您可能不需要从内存中加载它。

      换句话说,很难一概而论——你只需要查看一个特定的代码序列(不仅仅是一条指令,而是整个序列)就可以说出任何内容——而该序列的结果可能并不意味着很多关于另一个最初看起来几乎相同的序列。

      【讨论】:

        猜你喜欢
        • 2013-08-29
        • 2011-12-18
        • 2011-02-20
        • 2011-07-07
        • 2012-07-26
        • 2011-07-06
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多