【发布时间】:2013-03-28 09:55:19
【问题描述】:
编辑:刚刚发现(感谢 Ben Voigt 迅速指出)这个提议甚至是不可能的。对于后人来说,这是一个基本问题,而不是我之前对 AMD 扩展的误解:
我一直想知道 32 位构建(尤其是 Windows)软件检测 64 位处理器的存在并利用 64 位操作数和更大的寄存器文件(如果存在)是否很常见。这是假设 32 位进程实际上可以使用 64 位指令,其方式与 i386 上的 16 位进程在物理上存在这样的 CPU 时可以使用 32 位指令的方式大致相同,通过编码覆盖前缀。但是,正如下面的答案所指出的那样,这是不可能的。
为什么要使用 64 位指令而不是 32 位寻址?
好吧,假设您知道您正在处理的数据集足够小以适合该地址空间。例如,您使用了 64 位版本的程序,而对于您使用它的目的,性能监控会告诉您该进程正在使用 2GB 或更少。 (实际上,根据this,设置了 IMAGE_FILE_LARGE_ADDRESS_AWARE 标志的 32 位进程将在 64 位 Windows 中获得 4GB 用户空间。)
有些人认为这无关紧要,但实际上可能。在 64 位构建中,如果我没记错的话,程序存储的每个指针都会消耗它需要的物理 RAM 的两倍!如果程序使用大量指针(例如,由于链表或哈希表),这可能会累加并降低缓存效率等。
不幸的是,正如下面 Ben Voigt 的回答所指出的,这在 Windows 中根本不可能,而专门用于此目的的模式已在 Linux 中完成。
【问题讨论】:
-
32 位构建的全部意义在于使其能够在 32 位机器上运行。在 32b 机器上,您可以处理 4GB RAM,比目前市场上可用的内存要少得多,即使对于笔记本电脑来说,4GB 也不再多。所以你的指针示例完全没有意义(双关语)
-
为什么在没有 cmets 的情况下,这被否决了?我也可能是错的,但我觉得这是一个很好的问题,即使 OP 认为这是一个有效的问题是错误的,不是吗?
-
@Sten 是的,RAM 很便宜,但是如果一个进程使用大量的 64 位指针,而 32 位指针可以做到这一点,那么这仍然是低效的,并且可能会通过增加缓存未命中来影响性能。这对于计算密集型进程(如光线追踪器)可能很重要,因为 CPU 缓存大小仍然是一个重大限制。 (@adam 谢谢!)
-
@Kevin 如果代码如此重要,为什么不把它写成汇编并编译 64 位 - 这样你就可以有一个 8 位指针,如果你愿意
标签: windows 64-bit 32bit-64bit