Pot*_*ter 10 performance 64-bit operating-system x86-64 32bit-64bit
x86-64指令集添加了更多寄存器和其他改进,以帮助简化可执行代码.但是,在许多应用中,增加的指针大小是一种负担.每个指针中额外的未使用字节会阻塞缓存,甚至可能溢出RAM.例如,GCC使用-m32标志构建,我认为这就是原因.
可以加载32位值并将其视为指针.这不需要额外的指令,只需加载/计算32位并从结果地址加载.但是,这个技巧不可移植,因为平台有不同的内存映射.在Mac OS X上,保留了整个低4 GiB的地址空间.尽管如此,对于我编写的一个程序,0x100000000L在使用改进的性能大大优于真正的64位地址或编译之前,仍坚持添加32位"地址" -m32.
使用32位x86-64平台有任何根本障碍吗?我认为支持这样的嵌合体会增加任何操作系统的复杂性,任何想要最后20%的人应该只是Make it Work™,但似乎这仍然是最适合各种计算密集型程序的.
Gun*_*iez 10
在开发中有一个名为"x32"的ABI用于Linux.它是x86_64和ia32之间的混合,类似于你所描述的 - 32位地址空间,同时使用完整的64位寄存器集.它需要一个自定义内核,binutils和gcc.
一些SPEC运行表明在某些基准测试中性能提高了约30%.有关详细信息,请访问https://sites.google.com/site/x32abi/
正如Mysticial上面评论的,ICC 有-auto-ilp32//Qauto-ilp32选项在 64 位模式下使用 32 位指针:
指示编译器分析程序以确定是否有 64 位指针可以安全地收缩为 32 位指针,以及是否有 64 位
long(在 Linux* 系统上)可以安全地收缩为 32 位long指针。
在 Windows 上,没有像 Linux 上那样的x32abi/LARGEADDRESSAWARE ,但您仍然可以通过禁用默认为 64 位二进制文件启用的标志来使用 32 位指针
默认情况下,基于 64 位 Microsoft Windows 的应用程序具有数 TB 的用户模式地址空间。有关精确值,请参阅Windows 和 Windows Server 版本的内存限制。但是,应用程序可以指定系统应为应用程序分配低于 2 GB 的所有内存。如果满足以下条件,则此功能对于 64 位应用程序是有益的:
- 2 GB 地址空间就足够了。
- 该代码有许多指针截断警告。
- 指针和整数可以自由混合。
- 该代码具有使用 32 位数据类型的多态性。
所有指针仍然是 64 位指针,但系统确保每次内存分配都低于 2 GB 限制,因此,如果应用程序截断指针,则不会丢失重要数据。指针可以被截断为 32 位值,然后通过符号扩展或零扩展扩展为 64 位值。
当然,没有像-mx32GCC 中的选项那样的直接编译器支持,因此每次存储指向内存的指针或取消引用它时,您可能需要手动处理指针。最简单的解决方案是编写一个包装 32 位指针的类来处理该问题。幸运的是,MS 在同一架构中也有混合 32 位和 64 位指针的经验,因此他们有很多支持关键字/宏:
POINTER_32/__ptr32POINTER_64/__ptr64POINTER_SIGNED/__sptrPOINTER_UNSIGNED/__uptrGoogle 的 V8 引擎采用不同的方式,将指针压缩为 32 位,以节省内存并提高性能。请参阅此处内存和性能改进的比较
另请参见V8 中的压缩指针实现与 JVM 的压缩 Oops 有何不同?
阅读更多
| 归档时间: |
|
| 查看次数: |
1012 次 |
| 最近记录: |