代码之家  ›  专栏  ›  技术社区  ›  Kamil

Apache web服务器可以使用CPU AVX指令吗?

  •  0
  • Kamil  · 技术社区  · 2 年前

    我已经更换了旧的家庭服务器( i3-6100 ,51W TDP,3.7GHz,SSE4.1,SSE4.2,AVX2),带瘦客户端( Celeron J4105 ,10W TDP,1.5/2.5GHz涡轮,SSE4.2)。

    Apache可以使用CPU AVX指令吗?

    0 回复  |  直到 2 年前
        1
  •  3
  •   Peter Cordes    2 年前

    如果memcpy、memcmp、strlen和类似的东西可用,Glibc会自动使用AVX/AVX2,这对于L1d或L2缓存中的中小长度字符串来说很好。(例如,对于100B到128KiB的字符串,可能是其速度的两倍)。对于较短的字符串,启动和清理开销是相当大的一部分。希望apache不会花太多时间在字符串上循环。

    如果您使用 -O3 -march=native ,但可能性不大。

    我怀疑Apache中是否有任何东西值得基于CPUID手动调度(libc函数除外),所以如果您使用反汇编程序进行检查,您可能不会在i3服务器上的Apache二进制文件中找到任何AVX指令,除非它是专门为该机器或支持AVX的机器编译的。如果整个二进制文件是在启用AVX的情况下编译的,那么即使是标量FP数学也会使用以下指令 vmovsd / vucomisd 而不是 movsd / ucomisd ,所以如果你看到 传送双字 它不是那样编译的。

    看见 How to check if compiled code uses SSE and AVX instructions? 并注意SIMD(压缩)与标量的关系。


    AVX的一个有趣的功能与多线程程序相关:英特尔最近记录了AVX功能标志意味着16字节对齐的加载/存储保证是原子的。(我认为AMD计划在他们还没有这样做的情况下这样做,因为在他们的CPU上实践也是如此。)以前,对16字节无锁原子的唯一支持是通过 lock cmpxchg16b ,这意味着纯负载的成本与RMW一样高。GCC编译的代码可以通过libatomic利用这一点,包括通过对共享libatomics的更新,该更新将使用AVX在CPU上调度到更高效的加载/存储函数。

    无论如何,对于64位模式下两个指针大小的对象,可以使用更便宜的无锁原子。对于不花大量时间在线程之间通信的代码来说,这并不是一个游戏规则的改变者。它对内核没有帮助,因为你不能利用它 -mgeneral-regs-only ;16字节加载/存储需要XMM reg,除非 cmpxchg16b 没有 lock 前缀计数。但如果比较成功,这可能会产生非原子RMW,因此无法使用。


    可能更相关的是,AVX2支持在内核中提供了更快的memcpy,例如 copy_to_user (来自页面缓存) read 系统调用。 rep movsb 与加载/存储数据路径仅为16字节宽的CPU上的16字节块相比,可以在微码内部以32字节块工作。

    (平均值) 可以 可以在具有16字节加载/存储路径的CPU上实现,如Zen 1和Ivy Bridge,但带有AVX2的i3在执行单元和L1d缓存之间具有32字节数据路径。 https://www.realworldtech.com/haswell-cpu/5/ )


    AVX2可以帮助一些OpenSSL的东西,但可能对网络服务没有什么重要的。

    通常,您将使用AES进行加密,并且两个CPU都具有AES-NI。AVX+AES确实允许每个指令处理32个字节,而不是16个字节,但IIRC必须并行处理两个单独的块,而不是在一个AES流上工作的两倍快。尽管如此,Apache+OpenSSL可能会设法利用这一点。

    如果我没有记错的话,使用AVX2的MD5或SHA512也可能加速。

    对于SHA1和SHA256,新的CPU具有SHA-NI(Goldmont和Ice Lake中的新CPU。J4105是 Goldmont+ ,但旧的CPU是Skylake,所以它没有SHA-NI,必须使用SIMD手动完成。)没有的VEX编码 SHA1RNDS4 xmm 或者SHA256加速指令,更不用说使用256位矢量来更快地执行的指令了。如果你使用SHA512做任何事情,那么AVX2会比SSE4.2更快,其他都一样。

    (当然,Skylake会以更快的时钟运行相同的asm,具有更宽的前端,更能抵御瓶颈,后端的吞吐量也更高。 https://agner.org/optimize/ https://uops.info/ -将您的旧Skylake与您的“新”Goldmont+进行比较。我引用了“new”,因为它是在2017年底推出的,距离你的Skylake只有几年的时间。)

    英特尔的低功耗核心一直没有AVX支持,直到奥尔德湖的E核心Gracemont。IDK,如果/当他们计划用一个只有Gracemont内核的独立低功耗芯片来取代Tremont,以及他们是否可能在其中包括AVX。

        2
  •  2
  •   Homer512    2 年前

    出于好奇,而且我有一个Gentoo Linux系统,在那里我可以简单地用 -O3 -march=native ,我试着查看反汇编,看看是否生成了AVX矢量指令。

    objdump -d --no-show-raw-insn --no-addresses \
          /usr/sbin/apache2 /usr/lib64/apache2/modules/*.so | 
        grep -oE '^\s+([[:alpha:]][[:alnum:]]*)+' |
        LC_ALL=C sort | uniq -c
    

    这提供了以下统计数据:

          3         vaddsd
          1         vcomisd
         23         vcomiss
          3         vcvtsd2ss
          9         vcvtsi2sd
          1         vcvtsi2sdq
         25         vcvtsi2ss
          2         vcvtsi2ssl
         11         vcvtsi2ssq
         51         vcvtss2sd
          5         vcvttsd2si
          2         vcvttss2si
          2         vcvttss2usi
          4         vcvtusi2sd
          1         vcvtusi2sdl
          1         vcvtusi2ss
          4         vcvtusi2ssl
          3         vcvtusi2ssq
          8         vdivsd
         28         vdivss
         19         vextracti128
          2         vextracti64x2
         15         vinserti128
        185         vmovaps
         74         vmovd
        585         vmovdqa
         28         vmovdqa64
       1510         vmovdqu
         55         vmovdqu8
        323         vmovq
         15         vmovsd
        113         vmovss
          8         vmulsd
         30         vmulss
         22         vpackuswb
         27         vpaddd
         16         vpaddq
          3         vpalignr
         29         vpand
         17         vpblendmq
          2         vpblendvb
          1         vpbroadcastd
         14         vpbroadcastq
          2         vpbroadcastw
          8         vpcmpeqb
          3         vpcmpeqd
         16         vpcmpeqq
         16         vpcmpneqq
          1         vpermi2w
         20         vpermq
          1         vpermt2d
          1         vpermt2q
          7         vpermt2w
          1         vpextrb
          5         vpextrq
         32         vpgatherdd
          8         vpinsrb
         44         vpinsrd
        249         vpinsrq
          3         vpmaxsd
          3         vpmaxsq
          3         vpminsd
          1         vpmovqd
          8         vpmovsxdq
         18         vpmovzxbw
         36         vpmovzxwd
          2         vpmuldq
         17         vpor
         28         vpshufb
          8         vpshufd
         24         vpslld
          8         vpsrld
         13         vpsrldq
          1         vpsrlq
         20         vpsrlw
          4         vpsubq
          1         vpternlogd
          1         vpunpcklbw
          2         vpunpckldq
          4         vpunpcklqdq
          4         vpunpcklwd
        317         vpxor
          1         vshufpd
          1         vshufps
         12         vucomiss
         12         vxorpd
         41         vxorps
        126         vzeroupper
    

    所以肯定有一些用处。然而,这并不能证明这些指令是执行的,也不能证明与SSE2中的指令相比,它们在提高性能方面是有效的,或者在没有自动向量化的情况下编译。

    我发现看到诸如 vpgatherdd 使用中。这不是我期望编译器单独使用的东西。我还应该注意到,这是i7-11800H(老虎湖)上的GCC-11.3.1,所以它使用的是AVX-512,而不仅仅是AVX-1或2。

    正如Peter所指出的,更可能有效使用的候选者是libc。我可以补充一点,如果可用的话,OpenSSL也将使用AVX。