64位和内存带宽

时间:2009-06-07 00:39:02

标签: performance memory 64-bit bandwidth

Mason询问了the advantages of a 64-bit processor

嗯,一个明显的缺点是你必须移动更多的位。鉴于内存访问现在是一个严重的问题[1],为相当数量的操作移动两倍的内存并不是一件好事。

但这种效果有多糟糕,真的吗?是什么弥补了它?或者我应该在32位计算机上运行所有小应用程序吗?

我应该提一下,我正在考虑,特别是在同一台机器上可以选择运行32位或64位的情况,因此在任一模式下,主存储器的带宽都是相同的。

[1]:甚至十五年前,就此而言。我记得很早就谈到了良好的缓存行为,特别是那些赢得所有基准测试的Alpha CPU当时拥有8 MB的L2缓存。

3 个答案:

答案 0 :(得分:9)

你的应用程序是否应该是64位取决于它做什么样的计算。如果需要处理非常大的数据集,显然需要64位指针。如果没有,您需要知道您的应用程序是否花费相对更多的时间进行算术或内存访问。在x86-64上,通用寄存器不仅宽两倍,而且是两倍多,它们更“通用”。这意味着64位代码可以具有更好的整数运算性能。但是,如果您的代码不需要额外的寄存器空间,由于提高了缓存效率,您可能会通过使用较小的指针和数据来获得更好的性能。如果您的应用程序由浮点运算控制,那么将其设置为32位可能没什么意义,因为大多数存储器访问都是针对宽向量的,并且具有额外的SSE寄存器将有所帮助。

答案 1 :(得分:3)

大多数64位编程环境使用“LP64”模型,这意味着只有指针和long int变量(如果您是C / C ++程序员)是64位。整数(int s)保持32位,除非你在“ILP64”模型中,这是相当不常见的。

我之所以提起它是因为大多数int变量没有用于size_t - 就像目的一样 - 也就是说,它们保持在32位的舒适范围内。对于那种性质的变量,你永远无法区分它们。

如果您使用>进行数字或数据繁重的工作4GB的数据,无论如何你都需要64位。如果你不是,你就不会注意到这种差异,除非你习惯使用long s,而大多数人会使用int

答案 2 :(得分:2)

我认为你在这里开始的假设很糟糕。你说:

  

移动两倍的内存   对于相当数量的操作不能   是一件好事

问的第一个问题是“为什么不”?在真正的64位机器中,数据路径是64位宽,因此移动64位与32位机器上移动32位的周期完全相同(第一次近似)。因此,如果你需要移动128个字节,它需要的周期是32位机器上的一半。