Knuth 最近反对 64位系统,他说,方案符合在4音乐会的记忆,"它们有效地扔掉一半的高速缓冲存储器",因为指针是两倍大,因为在一个32位系统。

我的问题是:可这个问题以避免通过安装一个32位的操作系统上的64位的机器?及是否有任何带宽密集的基准,它们证明的优势,在这种情况下?

有帮助吗?

解决方案

答案是:是的,它可以在一定程度上,虽然性能差异不太可能很大。

任何测试它的基准都必须进行大量的指针分辨,这很难从噪声中分离出来。设计一个不会优化的基准是很困难的。 这篇关于有缺陷的java基准测试的文章由某人发布回复另一个问题,但其中描述的许多原则将适用于此。

其他提示

带宽在这里并不是正确的术语。 Knuth真正谈论的是数据密度,因为它与缓存占用量有关。想象一下,你有一个16KB的L1数据缓存:如果你纯粹存储指针,你可以存储2 ^ 14/2 ^ 2 = 2 ^ 12 = 4096个32位指针,但只能存储2048个64位指针。如果应用程序的性能取决于能够跟踪超过2K的不同缓冲区,您可能会从32位地址空间中看到真正的性能优势。但是,大多数真正的代码都不是这种方式,缓存系统的真正性能优势通常来自于能够缓存常见的整数和浮点数据结构,而不是大量的指针。如果你的工作集不是指针重,那么64位的下行变得可以忽略不计,如果你执行大量的64位整数运算,那么上行就会变得更加明显。

我不认为Knuth反对64位系统。他只是说在一个低于4GB ram的系统上使用64位指针是愚蠢的(至少如果你有很多像双链表中那样的指针)。我不能说我同意他,这里有三种不同的方式可以采取。假设你有一个支持64位的CPU,它也可以像32位英特尔酷睿双核处理器那样在32位模式下运行。

1 - 一切都是32位,操作系统,APPZ,所有这些。所以你有32位指针,但你不能使用64位模式下可用的额外寄存器/指令。

2 - 一切都是64位,操作系统,APPZ,所有这些。所以你有64位指针,你可以使用64位模式下可用的额外寄存器/指令。但由于你的内存不足4GB,使用64位指针似乎是愚蠢的。但是,是吗?

3 - 操作系统是64位操作系统,操作系统有趣地确保所有代码/数据指针都在0x00000000 - 0xFFFFFFFF范围内(虚拟内存!!!)。 ABI以一种非常奇怪的方式运行,保存在内存/文件中的所有代码/数据指针都是32位宽,但它们作为零扩展加载到64位寄存器中。如果有一个要跳转的代码位置,编译器/ ABI会进行必要的修复并执行实际的64位跳转。这样,指针是32位,但APPZ可以是64位,这意味着它们可以使用64位寄存器和指令。我认为这个过程类似于thunking ;-P

我的结论是::

第三种选择似乎对我来说可行,但这不是一个容易的问题。理论上它可以工作,但我不认为这是可行的。我还认为他的引用“当这样的指针值出现在结构体内时,它们不仅浪费了一半的内存,而且还有效地丢弃了一半的缓存。”被夸大了......

我已经看到的地方,最好的混合(在x86Cpu)是使用了64位的操作系统和32-位应用程序。

有64位的操作系统获得:

  • 能力来处理更多4G的地址空间
  • 更多、更大的寄存器的帮助,在数据复制的行动

与32-位应用程序获得:

  • 较小的指针
  • 小,较小的寄存器的存在背景下开关

缺点:

  • 所有的图书馆必须重复。小通过硬盘空间的标准。
  • 所有装入库中重复RAM。没有那么微小的...

令人惊讶的是,目前似乎不是任何开销时交换的模式。我猜,打破从用户为核心费用相同,不论位数的用户空间。

当然,有一些应用中受益,从大的地址空间。但对于一切,你可以得到额外的5%的业绩由住在32位。

不,我不关心这个小小的加速比。但它不能"得罪"我要运行的32位FireFox在64位KUbuntu机(如我已经看到在一些论坛)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top