![]() |
1
3
如果memcpy、memcmp、strlen和类似的东西可用,Glibc会自动使用AVX/AVX2,这对于L1d或L2缓存中的中小长度字符串来说很好。(例如,对于100B到128KiB的字符串,可能是其速度的两倍)。对于较短的字符串,启动和清理开销是相当大的一部分。希望apache不会花太多时间在字符串上循环。
如果您使用
我怀疑Apache中是否有任何东西值得基于CPUID手动调度(libc函数除外),所以如果您使用反汇编程序进行检查,您可能不会在i3服务器上的Apache二进制文件中找到任何AVX指令,除非它是专门为该机器或支持AVX的机器编译的。如果整个二进制文件是在启用AVX的情况下编译的,那么即使是标量FP数学也会使用以下指令
看见 How to check if compiled code uses SSE and AVX instructions? 并注意SIMD(压缩)与标量的关系。
AVX的一个有趣的功能与多线程程序相关:英特尔最近记录了AVX功能标志意味着16字节对齐的加载/存储保证是原子的。(我认为AMD计划在他们还没有这样做的情况下这样做,因为在他们的CPU上实践也是如此。)以前,对16字节无锁原子的唯一支持是通过
无论如何,对于64位模式下两个指针大小的对象,可以使用更便宜的无锁原子。对于不花大量时间在线程之间通信的代码来说,这并不是一个游戏规则的改变者。它对内核没有帮助,因为你不能利用它
可能更相关的是,AVX2支持在内核中提供了更快的memcpy,例如
(平均值) 可以 可以在具有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编码
(当然,Skylake会以更快的时钟运行相同的asm,具有更宽的前端,更能抵御瓶颈,后端的吞吐量也更高。 https://agner.org/optimize/ 和 https://uops.info/ -将您的旧Skylake与您的“新”Goldmont+进行比较。我引用了“new”,因为它是在2017年底推出的,距离你的Skylake只有几年的时间。) 英特尔的低功耗核心一直没有AVX支持,直到奥尔德湖的E核心Gracemont。IDK,如果/当他们计划用一个只有Gracemont内核的独立低功耗芯片来取代Tremont,以及他们是否可能在其中包括AVX。 |
![]() |
2
2
出于好奇,而且我有一个Gentoo Linux系统,在那里我可以简单地用
这提供了以下统计数据:
所以肯定有一些用处。然而,这并不能证明这些指令是执行的,也不能证明与SSE2中的指令相比,它们在提高性能方面是有效的,或者在没有自动向量化的情况下编译。
我发现看到诸如
正如Peter所指出的,更可能有效使用的候选者是libc。我可以补充一点,如果可用的话,OpenSSL也将使用AVX。 |
![]() |
Adithya · Apache mod_重写以调用不同的URL 2 年前 |
![]() |
Coolen · 通过htaccess重定向并删除部分链接 3 年前 |
![]() |
ciromanfredi · Apache任务组执行 3 年前 |
![]() |
Rabi · php和libapache2 mod php之间的区别 3 年前 |