AMD Zen上的英特尔MKL

2020-09-01 02:59:07

免责声明:这篇文章调查了最近的MKL版本在Zen CPU上的表现。在使用MKL之前,您应该阅读MKL许可证。对于您如何使用MKL,我不承担任何责任。

众所周知,英特尔MKL在支持较新SIMD指令(如使用ZenmicroArchitecture的指令)的AMD CPU上使用SSE代码路径。(到目前为止)一个众所周知的技巧是将MKL_DEBUG_CPU_TYPE环境变量设置为值5,以强制使用AVX2kernelson AMD Zen CPU。遗憾的是,此变量已从英特尔MKL 2020更新1及更高版本中删除。通过运行使用带有ltrace-e getenv的mkl的程序,可以很容易地确认这一点。

然而,英特尔似乎删除了这个选项,因为他们在MKL中添加了禅宗内核。例如,如果我们在Ryzen 3700X上使用MKL 2020.2.254运行ACESdgym基准测试,性能会很好:

然而,他们似乎还没有为每一个BLAS函数实现禅宗内核。我修改了ACES基准测试,使用sgem blas函数,结果并不是很好:

一些快速跟踪显示,MKL使用单个函数MKL_SERV_INTEL_CPU_TRUE来检测它是否在处理真正的英特尔CPU。幸运的是,该函数相当简单,所以我们可以用我们自己的函数替换它:

唯一的小缺点是,MKL还将使用AVX2内核来实现其他功能,如dgem。但这似乎并不会对绩效产生负面影响。事实上,DGEM基准测试的性能在我的机器上稍好一些(430GF/s)。

每次在机器上设置LD_PRELOAD可能会让人感到疲倦,很容易忘记它。一个简单的解决方案是使用带DT_NEEDED标记的patchelf将我们的小库添加到程序的ELF动态部分。例如: