标签: linux-x32-abi

什么<4GB工作负载在Linux x32 ABI中的性能会比x64差?

有一个相对较新的Linux ABI称为x32,其中x86-64处理器以32位模式运行,因此指针仍然只有32位,但仍使用64位架构特定的寄存器.所以你仍然限制在4GB的最大内存使用量,就像普通的32位一样,但你的指针占用的缓存空间比在64位时少,你可以有效地进行64位运算,并且可以访问更多的寄存器(16)比你在香草32位(8).

假设你的工作负载很好地适应4GB,那么x32的性能是否会比x86-64更差?

在我看来,如果你不需要额外的内存空间什么都不会丢失 - 你应该总是获得相同的性能(当你已经适应缓存时)或更好(当指针空间节省让你更适合缓存) .但如果有分页/ TLB /等,我不会感到惊讶.我不知道的细节.

linux performance x86 x86-64 linux-x32-abi

5
推荐指数
1
解决办法
627
查看次数

必须重新编译什么才能运行x32 ABI应用程序?

我可以使用新的x32 ABI编译应用程序,然后在普通内核中运行它吗?那么运行时C库呢?与预编译的x86 / x86_64库是否存在任何形式的互操作性?

linux abi 32bit-64bit linux-x32-abi

5
推荐指数
1
解决办法
471
查看次数

[u]int_fastN_t 类型应该如何为 x86_64 定义,有或没有 x32 ABI?

X32 ABI指定,除其他事项外,对于x86_64体系生成的代码32位指针。它结合了 x86_64 架构(包括 64 位 CPU 寄存器)的优点和 32 位指针减少的开销。

<stdint.h>报头定义的typedef int_fast8_tint_fast16_tint_fast32_t,和int_fast64_t(和相应的无符号类型uint_fast8_t等人)中,其中的每一个是:

在所有至少具有指定宽度的整数类型中,通常操作最快的整数类型

附注:

不能保证指定的类型在所有用途中都是最快的;如果实现没有明确的理由选择一种类型而不是另一种,它只会选择一些满足符号和宽度要求的整数类型。

(引自N1570 C11 草案。)

问题是,无论有没有 x32 ABI ,应该如何为 x86_64 架构定义[u]int_fast16_t[u]int_fast32_t类型?是否有指定这些类型的 x32 文档?它们是否应该与 32 位 x86 定义(均为 32 位)兼容,或者,由于 x32 可以访问 64 位 CPU 寄存器,它们在使用或不使用 x32 ABI 的情况下是否应该具有相同的大小?(请注意,无论是否使用 x32 ABI,x86_64 都有 64 位寄存器。)

这是一个测试程序(取决于特定于 gcc 的__x86_64__宏):

#include <stdio.h>
#include <stdint.h>
#include <limits.h>

int main(void) {
#if …
Run Code Online (Sandbox Code Playgroud)

c x86-64 stdint linux-x32-abi

5
推荐指数
1
解决办法
545
查看次数

如何在预处理器中检测X32 ABI或环境?

X32是使用 32 位指针的amd64/ CPU的 ABI 。x86_64这个想法是将 x86_64 的较大寄存器集与 32 位指针产生的较小内存和缓存占用空间结合起来。它可提供高达约 40% 的加速。有关详细信息以及将其设置为 chroot 环境,请参阅Stack Overflow 上的x86、x32 和 x64 架构之间的差异以及 Debian X32 Ports wiki 页面。

我们收到了 Debian 维护者在该环境下的错误报告。该报告adcq是非法指令。内联汇编是根据预处理器宏激活的,因此我们没有正确检测到 X32(或者更正确地说,到目前为止根本没有检测到)。

对于预处理器宏来说,最明显的选择(对我来说)是类似的__X32__,但没有提供。根据Clang的补丁Debian的建议,看起来__ILP32__可以使用。但我想要一个更规范的答案,_ILP32而且__code_model_small__看起来也很有趣。(我知道 SSE2 存在问题,编译器支持它,但操作系统不支持)。

使用 Clang 和 GCC 时,可以使用哪些预处理器宏来可靠地检测 X32 ABI 和环境?

需要明确的是,我此时并不想修复代码。我只是想知道可以用于完整修复的宏。


# cpp -dM < /dev/null | sort
#define __amd64 1
#define __amd64__ 1
#define __ATOMIC_ACQ_REL 4
#define __ATOMIC_ACQUIRE 2 …
Run Code Online (Sandbox Code Playgroud)

c gcc clang c-preprocessor linux-x32-abi

3
推荐指数
1
解决办法
1078
查看次数

如何在Windows上检测X32?

X32允许用户使用在x86_64处理器上运行的32位整数,长整数和指针来编写程序.在某些使用案例中,使用X32有许多好处.(X32与X86或X64 不同 ; 有关详细信息,请参阅x86,x32和x64体系结构之间的差异).

一些Windows Enterprise Server似乎支持X32,但我无法找到更多信息.这是基于一些英特尔PDF,如基于英特尔®至强®处理器E5-2400系列的智能系统平台:

在此输入图像描述

微软关于预定义宏的文档列出了常见的嫌疑,比如_M_X64_M_AMD64.但它似乎没有讨论X32的架构选项.

如果Microsoft支持X32,那么我怀疑它将是一个类似于大地址空间感知或终端服务感知的选项.

Microsoft 实际上是否支持X32(而不是X86和X64)?

如果是这样,我如何确定何时在Windows下选择X32?

如果没有,那么为什么英特尔专门为Windows推出X32平台呢?

windows abi 32bit-64bit c-preprocessor linux-x32-abi

1
推荐指数
1
解决办法
349
查看次数