gpt4 book ai didi

gcc - 为 g++ 构建禁用所有 AVX-512 指令

转载 作者:行者123 更新时间:2023-12-05 08:38:16 37 4
gpt4 key购买 nike

您好,我正在尝试使用这些标志在没有任何 avx512 指令的情况下进行构建:-march=native -mno-avx512f。但是我仍然得到一个二进制文件生成了 AVX512 (vmovss) 指令(我正在使用 elfx86exts 进行检查)。知道如何禁用它们吗?

最佳答案

-march=native -mno-avx512f 是正确的选项,vmovss只需要 AVX1。

vmovss 的 AVX512F EVEX 编码,但 GAS 不会使用它,除非涉及的寄存器是 xmm16..31。当您使用 -mno-avx512f 禁用 AVX512F 时,GCC 不会使用这些寄存器发出 asm,或者首先不使用 -march=skylake 之类的东西启用它或 -march=znver2

如果您仍然不确定,请检查实际的反汇编+机器代码以查看指令以什么前缀开头:

  • C5C4 字节:2 或 3 字节 VEX 前缀的开始,AVX1 编码。
  • 62 字节:EVEX 前缀的开始,AVX512F 编码

示例:

.intel_syntax noprefix
vmovss xmm15, [rdi]
vmovss xmm15, [r11]
vmovss xmm16, [rdi]

gcc -c avx.s 汇编,用objdump -drwC -Mintel avx.o 反汇编:

0000000000000000 <.text>:
0: c5 7a 10 3f vmovss xmm15,DWORD PTR [rdi] # AVX1
4: c4 41 7a 10 3b vmovss xmm15,DWORD PTR [r11] # AVX1
9: 62 e1 7e 08 10 07 vmovss xmm16,DWORD PTR [rdi] # AVX512F

2 和 3 字节 VEX,以及 10 操作码之前的 4 字节 EVEX 前缀。 (ModRM 字节也不同;xmm0 和 xmm16 的区别仅在于前缀的额外寄存器位,而不是 modrm)。

GAS 在可能的情况下使用 vmovss 和其他指令的 AVX1 VEX 编码。因此,您可以指望具有非 AVX512F 形式的指令使用非尽可能使用 AVX512F 形式。这就是 GNU 工具链(由 GCC 使用)如何使 -mno-avx512f 工作。

即使 EVEX 编码较短,这也适用。例如当 [reg + constant] 可以使用 AVX512 缩放 disp8(按元素宽度缩放)但 AVX1 编码需要以字节计数的 32 位位移。

   f:   c5 7a 10 bf 00 01 00 00         vmovss xmm15,DWORD PTR [rdi+0x100]   # AVX1 [reg+disp32]
17: 62 e1 7e 08 10 47 40 vmovss xmm16,DWORD PTR [rdi+0x100] # AVX512 [reg + disp8*4]
1e: c5 78 28 bf 00 01 00 00 vmovaps xmm15,XMMWORD PTR [rdi+0x100] # AVX1 [reg+disp32]
26: 62 e1 7c 08 28 47 10 vmovaps xmm16,XMMWORD PTR [rdi+0x100] # AVX512 [reg + disp8*16]

请注意机器代码编码的最后一个字节或最后 4 个字节:对于 AVX1 编码,它是一个 32 位小尾数法 0x100 字节位移,但对于 AVX512,它是一个 0x40 双字或 0x10 双字的 8 位位移编码。

但是使用 {evex} vmovaps xmm0, [rdi+256] 的 asm-source 覆盖,我们甚至可以为“低”寄存器获得紧凑编码:

62 f1 7c 08 28 47 10    vmovaps xmm0,XMMWORD PTR [rdi+0x100]

GCC 当然不会用 -mno-avx512f 来做。

不幸的是,当您启用 AVX512F 时,GCC 和 clang 也会错过该优化,例如编译时 __m128 load(__m128 *p){ return p[16]; }-O3 -march=skylake-avx512 ( Godbolt )。使用二进制模式,或者简单地注意编译器输出的 asm 源代码行中缺少 {evex} 标记。

关于gcc - 为 g++ 构建禁用所有 AVX-512 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63622900/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com