最近有一个LLVM错误报告“
针对Zen进行优化时,Zen CPU的运行时性能较差
。“好吧,这不好……幸运的是,这个错误现在已经用最新的LLVM Clang编译器代码修复了,但AMD CPU优化目标中的其他缺陷仍然存在。
上周公布的是“[X86]为Zen优化时Zen CPU的运行时性能更差”的错误报告。通过一个示例代码片段,它表明在AMD Ryzen 9 7950X处理器上使用“-march=znver4”最终产生的性能比使用更通用的“-march=X86-64-v4”甚至“-march=X86-64”基线时慢25%左右。
截至今天,由于此LLVM提交,此错误报告已关闭:[X86]在Barcelona/Bobcat/Bulldodde/Ryzen Families上启用TuningSlowDiver64。该提交消息解释道:
“尽管大多数AMD CPU的i64划分延迟较低,但我们还是最好测试i32表示的值,并在可能的情况下执行i32划分。
当我们添加“idivq to divl”属性时,所有AMD cpu似乎都被遗漏了——这个补丁现在与英特尔的cpu行为(以及x86-64/v2/3/4级别)相匹配。"
虽然当AMD Zen 4(znver4)调谐关闭时,原始错误报告的性能较慢是件好事,但故事还没有结束。此后为LLVM打开了另一个错误报告:“
[X86]针对znver4或skylake进行优化时,Zen 4 CPU的运行时性能较差
."
“当为znver4或skylake优化时,以下代码在Zen 4上的运行速度比为znver3或其他目标优化时慢300%左右。”
更新的错误报告发现了一个代码片段
慢300%
与针对Zen 3(-march=znver3)或其他CPU目标进行优化时相比,在Zen 4上使用“-march=znvers4”(甚至是常见的“-march=skylake”基线)时。AMD编译器工程师已经被指派处理这个错误,所以希望它能很快得到解决。
AMD在LLVM下游的AMD优化C/C++编译器(AOCC)上做了很多工作,但在LLVM/Cang和GCC上游,AMD可以从更大的投资中受益。虽然传统上,他们在开源编译器对新CPU目标的上游处理方面非常缓慢,但在GCC 14中,他们确实在发布前提供了早期的Zen 5(znver5)支持。这至少启用了所有新的Zen 5 CPU ISA扩展,但它还没有提供任何新的成本表,因为它仍然是从Znver4遗留下来的。对于上游LLVM,还没有任何Znver5支持,但至少没有那么紧迫,因为频繁的点发布和六个月的功能发布比GCC不频繁的发布节奏(点发布和年度功能发布之间的几个月)有了很大的改进。它仍然落后于英特尔的开源编译器准时性,因为GCC 14为月球湖、黑豹湖、清水森林和其他比Zen 5更远的CPU核心引入了英特尔CPU目标。
With compiler bugs like these noted, there's still a lot of potential for additional performance gains if AMD would continue ramping up their GCC and LLVM/Clang upstream engineering especially as EPYC continues enjoying great HPC adoption where compiler optimizations tend to be more common place, developers continue embracing Ryzen and Threadripper processors for their boxes, and high core count servers like with AMD EPYC "Bergamo" make for great CI/CD deployments with speedy build times.