5

有一个相对较新的 Linux ABI 称为 x32,其中 x86-64 处理器以 32 位模式运行,因此指针仍然只有 32 位,但仍然使用 64 位架构特定的寄存器。因此,与普通 32 位一样,您的最大内存使用量仍被限制为 4GB,但您的指针使用的缓存空间比 64 位少,您可以有效地执行 64 位算术,并且您可以访问更多寄存器(16) 比普通 32 位 (8) 中的要好。

假设您的工作负载非常适合 4GB,那么 x32 的性能是否会比 x86-64 差?

在我看来,如果您不需要额外的内存空间,则不会丢失任何东西——您应该始终获得相同的性能(当您已经适合缓存时)或更好(当节省的指针空间让您更适合缓存时) . 但如果有分页/TLB/等,我不会感到惊讶。我不知道的细节。

4

2 回答 2

8

当然,如果您有一个多线程程序,x32 上的数据结构较小这一事实可能会导致线程之间的缓存线争用——在 x32 模式下,不同的对象可能会分配到同一缓存线上,而在 x86_64 模式下,可能会在不同的缓存线上分配。如果两个线程独立修改这些对象,缓存乒乓可能会严重减慢 x32 代码。当然,无论指针大小如何,这种缓存效应都可能发生,但是如果代码已经在假设 64 位指针的情况下进行了调整,那么使用 32 位指针可能会导致问题发生。

于 2012-10-15T20:23:54.763 回答
2

在 X32 中,处理器实际上以“长模式”执行,与 x86_64 的模式相同。也就是说,处理器在进行寻址时看到的地址仍然是 64 位,但是 X32 ABI 确保所有地址都足够小以适合 32 位。因此,在某些情况下,当指针必须从 32 位扩展到 64 位时,会产生一些轻微的开销。

此外,在 RAM 中需要 x86/x86-64/x32 库,我想这是一个在实践中最终会得到的结果(除非你在谈论一些嵌入式或其他严格控制的系统而不是通用计算机),可能会吃起来了 X32 的一些好处。

于 2012-10-15T21:08:18.997 回答