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

o2g1uqev  于 2023-01-26  发布在  Apache
关注(0)|答案(2)|浏览(174)

我已经用瘦客户机(Celeron J4105,10 W TDP,1.5/2.5GHz Turbo,SSE4.2)替换了我的旧家用服务器(i3-6100,51 W TDP,3.7GHz,SSE4.1,SSE4.2,AVX 2)。
Apache可以使用CPU AVX指令吗?

qvk1mo1f

qvk1mo1f1#

Glibc会自动使用AVX/AVX 2来处理memcpy,memcmp,strlen之类的东西,这对于L1 d或L2缓存中的小到中等长度的字符串来说是很好的(例如,对于100 B到128 KiB的字符串,速度可能是前者的两倍)。对于较短的字符串,启动和清理开销是一个很大的部分。希望apache不会花很多时间在字符串上循环。
如果你用-O3 -march=native编译的话,apache内部可能会有一些自动矢量化的循环,但这是不太可能的。
我怀疑Apache中是否有值得基于CPUID手动调度的东西(libc函数除外),所以如果您使用反汇编程序检查i3服务器上的apache二进制文件,可能找不到任何AVX指令,除非它是专门为该机器或支持AVX的机器编译的。即使是标量FP数学也会使用vmovsd/vucomisd这样的指令,而不是movsd/ucomisd,因此如果您看到任何movsd,它就不是以这种方式编译的。
请参见How to check if compiled code uses SSE and AVX instructions?并注意SIMD(压缩)与标量。
AVX与多线程程序相关的一个有趣特性是:Intel最近记录了AVX特性标志,表明16字节对齐的加载/存储保证是原子的。(我认为AMD正在计划这样做,如果他们还没有这样做的话,因为在他们的CPU上实践也是如此。)以前,对16字节无锁原子的唯一支持是通过lock cmpxchg16b,这意味着纯加载成本与RMW. GCC编译的代码一样多,可以通过libatomic利用这一点,包括通过更新共享libatomic,该共享libatomic分派给具有AVX的CPU上更高效的加载/存储功能。
所以不管怎样,便宜的无锁原子技术适用于64位模式下两个指针大小的对象,对于不花大量时间在线程间通信的代码来说不是游戏规则的改变者,而且它对内核没有帮助,因为你不能在-mgeneral-regs-only中利用它;16字节的加载/存储需要一个XMM reg,除非没有lock前缀的cmpxchg16b计数。但是,如果比较成功,这可能会执行非原子RMW,所以这是不可用的。
可能更相关的是,AVX 2支持在内核内部为read系统调用提供了更快的memcpy(来自pagecache)。rep movsb可以在微码内部的32字节块中工作,而在加载/存储数据路径只有16字节宽的CPU上,copy_to_user可以在16字节块中工作。
(AVX* 可以 * 在Zen 1和Ivy Bridge等具有16字节加载/存储路径的CPU上实现,但您的i3(采用AVX 2)在执行单元和L1 d缓存之间具有32字节数据路径。https://www.realworldtech.com/haswell-cpu/5/
AVX 2可以帮助一些OpenSSL的东西,但可能没有什么重要的网络服务。
通常你会使用AES进行加密,两个CPU都有AES-NI。AVX+AES确实允许每条指令处理32字节而不是16字节,但是IIRC必须在两个独立的块上并行,而不是在一个AES流上以两倍的速度工作。
如果我没记错的话,使用AVX 2的MD5或SHA 512也有可能加速。
对于SHA1和SHA 256,新CPU具有SHA-NI(Goldmont和Ice Lake中的新功能。J 4105是Goldmont+,但旧CPU是Skylake,因此没有SHA-NI,必须使用SIMD手动执行。)SHA1RNDS4 xmm或SHA 256加速指令没有VEX编码,更不用说使用256位矢量来提高速度了。如果你使用sha 512来做任何事情,那么avx 2会比sse 4. 2快一些,其他都是一样的。
(And当然,Skylake的运行速度也一样快(时钟对时钟),前端更宽,能够更好地应对瓶颈,后端吞吐量更大。https://agner.org/optimize/https://uops.info/-将您的旧Skylake与“新”Goldmont+进行比较。我将“新”放在引号中,因为它是在2017年底推出的,比您的Skylake晚了几年。)
英特尔还没有在他们的低功耗核心支持AVX,直到Gracemont,E核心在桤木湖。IDK如果/当他们计划一个独立的低功耗芯片只有Gracemont核心,以取代特雷蒙,如果他们可能包括AVX。

vxqlmq5t

vxqlmq5t2#

出于好奇,并且由于我有一个Gentoo Linux系统,可以简单地用-O3 -march=native编译Apache,所以我尝试查看反汇编,看看是否生成了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

因此,这肯定是有一些用处的。但是,这并不能证明这些指令被执行了,或者与SSE 2中的相同指令相比,它们在提高性能方面是有效的,或者与没有自动矢量化的情况相比,它们在编译时是有效的。
我发现使用vpgatherdd这样的指令有点奇怪。我不希望编译器自己使用这些指令。我还应该注意到,这是i7- 11800 H(Tiger Lake)上的GCC-11.3.1,所以它使用AVX-512,而不仅仅是AVX-1或2。
正如Peter所指出的,更有可能有效使用的候选对象是libc。我可能会补充说,OpenSSL也将使用AVX(如果可用)。

相关问题