64位和内存带宽

4

Mason 问到了64位处理器的优势

显然,一个明显的缺点是需要移动更多的比特。而且考虑到内存访问现在是一个严重的问题[1],对于相当数量的操作来说,移动两倍的内存肯定不是一件好事。

但这个影响到底有多严重?什么可以弥补它?或者我应该在32位机器上运行所有的小应用程序吗?

值得一提的是,我特别考虑了在同一台机器上选择运行32位或64位的情况,所以无论是哪种模式,与主内存的带宽都是相同的。

[1]: 即使在15年前也是如此。我记得那时候就谈论过良好的缓存行为,尤其是赢得所有基准测试的Alpha CPU拥有巨大的8 MB L2缓存。

3个回答

9

你的应用程序是否需要使用64位取决于它所处理的计算类型。如果需要处理非常大的数据集,则显然需要64位指针。如果不需要,则需要知道您的应用程序相对更多地花费时间进行算术运算还是内存访问。在x86-64上,通用寄存器不仅宽度加倍,数量也加倍,并且它们更“通用”。这意味着64位代码可以拥有更好的整数操作性能。但是,如果您的代码不需要额外的寄存器空间,由于增加了缓存效果,使用较小的指针和数据可能会看到更好的性能。如果您的应用程序以浮点运算为主导,那么将其制作成32位可能没有太大意义,因为大多数内存访问都是用于广泛向量的,而具有额外SSE寄存器的帮助。


3
大多数64位编程环境使用“LP64”模型,这意味着只有指针和long int变量(如果您是C/C++程序员)是64位的。整数(int)保持32位,除非您在“ILP64”模型中,这种情况相当少见。
我提到这一点是因为大多数int变量并不用于类似size_t的目的——也就是说,它们保持在32位轻松容纳的范围内。对于那种性质的变量,您永远无法分辨出差异。
如果您正在处理大于4GB的数字或数据密集型工作,则无论如何都需要64位。如果没有,则不会注意到差异,除非您习惯使用long而大多数人会使用int

2
我认为你的前提假设是错误的。你说:
将数据移动两倍的内存量 对于相当数量的操作来说不可能是一件好事
那么我们首先需要问的问题是“为什么不呢”?在真正的 64 位机器上,数据通路宽度为 64 位,因此移动 64 位数据恰好需要(在第一近似下)与在 32 位机器上移动 32 位数据所花费的时间相同。因此,如果你需要移动 128 字节,则需要的周期数是在 32 位机器上所需时间的一半。

6
记忆总线比处理器的64位寄存器和地址空间存在的时间要长得多。让应用程序变成64位的真正惩罚是由于所有指针及其所需内存大小都需要增加一倍,有效地减半了缓存大小。 - user57368
2
是的,那么接下来会发生什么?您必须多次锁定CPU才能利用总线。64位芯片中的缓存往往更大;我想看到一些经验数据来验证这个观点是否存在真正的问题。 - Charlie Martin
我已经编辑了问题。考虑到相同的硬件情况,你可以选择32位或64位模式。内存带宽是相同的。只是,在32位模式下,每个缓存行加载的整数数量是两倍。 - cjs
好的,现在像一个好的性能专家一样,我问:“好的,你的工作量是怎样的?” 如果你的工作量使得高比例的缓存命中率是好的,并且你没有做很多浮点运算或者频繁地移动到内存中,那么你会得到一些好处。我经常对此进行抱怨,但我会在这里再说一次:你有什么实证证据表明现实工作负载受到64位操作的负面影响,以及在什么条件下会发生? - Charlie Martin
这不公平,要求我查看我的工作负载!接下来你会要求我进行分析!:-)更严肃地说,我想知道在这个领域是否有任何经验法则,虽然显然没有那么重要,但我们可以像使用大O符号一样使用它们。而我认为现在毫无疑问的是,鉴于现代CPU中的延迟差异,缓存性能总是至关重要的。但我觉得你甚至可能比我更好地提出我的问题;你能这么做并给我留言吗? - cjs
顺便说一句,我认为现在64位芯片中的缓存并没有变得更大(“现在”是指自Alpha和其他高端CPU死亡以来)。我的五年前的32位Pentium M拥有比当前的I7更多的L2缓存,并且表现相当不错——对于许多应用程序来说,它比同一时代更快的Core 2表现更好。 - cjs

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