64位机器/操作系统上的32位操作与64位操作

5
在64位机器上,使用32位操作或64位操作(例如屏蔽32位标志或64位标志)哪个更便宜?
3个回答

4
由于您没有指定体系结构,我只能提供一般性答案,因为这取决于操作和所涉及的处理器体系结构。一旦您将数据存储在CPU寄存器中,大多数操作通常需要相同的时间,而不管原始值是32位还是64位。
然而,在某些体系结构中,数据进入寄存器的方式可能会有所不同。以下是一些情况,其中“本机大小”值可能比较小的值更快:
获取数据
- 获取“本机大小”的值可能比获取较小的值更快。也就是说,处理器可能需要获取64位,然后屏蔽/移位掉其中的32位以“加载”32位值。当处理64位值时,不需要进行这种掩码/移位,因此可能加载得更快。(这与直觉相反,即两倍大小的东西可能需要两倍长的加载时间)。 - 或者,如果总线可以处理半宽度获取,则可以在与64位值相同的时间内加载32位。 - 更让人困惑的是,CPU缓存也可能改变结果。通常,当您从内存中读取一个值时,会读取几个内存位置的“行”到缓存中,以便后续读取可以从快速缓存内存中提供,而不需要从RAM中进行完整的获取。在这种情况下,如果您按顺序访问多个值,则使用32位值将运行得更快,因为其中有两倍的值将被缓存,从而减少了缓存未命中的次数。
计算
- 处理器硬件经过优化,可以处理64位值,因此使用32位计算值可能会导致其更加困难,从而可能使速度变慢。例如,它可能能够“本地”处理双精度(64位)值,但必须将浮点(32位)值转换为双精度后才能处理它,然后在处理完后将结果转换回浮点。 - 或者,CPU可能具有32位和64位路径,或者CPU可能能够以不影响指令整体执行时间的方式执行所需的任何转换,在这种情况下,它们可能以相同的速度计算。 - 这可能会影响复杂操作(浮点),但不太可能是简单操作(AND、OR等)的问题。

2

一般来说,64位操作和32位操作的成本相同。如果编译器需要确保64位寄存器的高32位被清除(或符号扩展),则32位操作可能会多出一个指令,但这个操作一般代价较小。

可能存在一些指令编码上的差异,使得其中一个比另一个占用更多的空间,但这取决于许多因素,无法确定哪种方式更优。


2
当然,前提是64位操作会在两倍的数据上运行,对吗? - tloflin
@tloflin - 当然可以,但我想这个问题是在问类似于 unsigned long long x |= 0x10ULLunsigned long x |= 0x10UL 这样等效的操作。总体来说,我认为这不是你应该关心性能方面的问题,而是数据要求方面的问题。除非存在某种性能问题,否则不必担心它。 - Michael Burr

2
这取决于具体情况——掩码标志通常使用AND指令,一旦数据在寄存器中,执行速度很快(约1个周期)。从内存加载64位数据通常比加载32位数据要慢——但如果您使用超过32个标志,则必须加载超过32位的数据,并且在一个周期内处理掩码将比在两个或三个指令中进行提高速度。总体速度是否会受到影响通常取决于周围的指令——例如,如果数据已经在缓存中,您可能不需要从内存中加载它。
换句话说,很难做出概括——您几乎必须查看特定的代码序列(不仅仅是一个指令,而是整个序列)才能说出任何内容——而该序列的结果可能对于最初看起来几乎相同的另一个序列并没有太大意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接