思源 一鸣 佳明报道

英特尔MKL加速AMD计算可达3倍?AMD Yes

数学计算中的硬件加速是社区经常探讨的话题,如果能够利用一些库和硬件的优势,无疑能够帮助科研、生产等。近日,一个优化 AMD CPU 的帖子在 Matlab 社区引起讨论——通过几行代码,将 AMD CPU 加速 250%,进而帖子作者将方法推广到了其他社区,介绍了更普适性的优化方法。

从 Matlab 优化说起

在此前的研究中,作者在 Matlab 社区发起讨论:如何能够使得 Matlab 在 AMD Ryzen/TR CPUs 使用快速代码路径,从而使得性能提升 250%?

众所周知,Matlab 在 AMD CPU 上使用 Intel 数学内核库(MKL)的运行速度非常慢。因为 Intel MKL 会使用一个有区分的 CPU 调度器,而鉴于 CPU 对 SIMD 的支持,该调度器并不会使用有效代码路径,但是会基于供应商的字符串查询结果进行操作。如果 CPU 是 AMD 的,则可以通过系列调整,使得性能有较大的提升。详情参照:https://www.reddit.com/r/matlab/comments/dxn38s/howto_force_matlab_to_use_a_fast_codepath_on_amd/?sort=new

如下图所示,在 Matlab 上测试不同 CPU 加速环境下的性能,就能得到惊人的效果。在 AMD 上加载英特尔 MKL 加速工具,也能获得很大的提升:

综合基准测试结果:

而这一讨论在 Matlab 社群中广为流传,自从发布之后,便有更多社区的开发者来信与作者进行深度的讨论(比如:Pytorch/Numpy/Anaconda/Tensorflow 等等)。所以,这篇新的讨论将更为系统的去分享操作思路,介绍其原理。

英特尔的库,加速 AMD 的芯片?

一般来说,英特尔的数学核库(Intel Math Kernel Library:MKL)是很多人默认使用的库。它在 AMD CPU 上运行地非常慢,因为 MLK 使用一种区分性的(discriminative)CPU 调度器,这种调度器不能根据 SIMD 的支持来有效使用代码路径。如果是 AMD CPU,不管 CPU 到底支不支持更高效的 SIMD 扩展,MKL 不支持使用 SSE3-SSE4 或 AVX1/2 扩展,它只能回到 SSE。

而帖子中则提供了一种方法,能够强制 MKL 支持 AVX2,它和 vendor string 独立,而且只需要一分钟就能完成。如果你有一个 AMD CPU,基于 Zen/Zen+/Zen2 µArch Ryzen/Threadripper 等架构,那么它可以被加速到惊人的程度。

另外,这种方法也可以在更老的 Excavator µArch 上应用,但是请*不要将这个方法用在比 Excavator µArch 更老的 AMD CPU 上,以及英特尔的系统上。*

事实上,这种性能提升是非常明显的,根据操作系统和 CPU 的不同,性能加速幅度在 30% 到 300% 不等。

使用方法

在 Windows 系统上

如果你使用的是 Windows 系统,你首先需要管理员权限。

然后,在 system environment variables 里键入「MKL_DEBUG_CPU_TYPE=5」。这将会对所有使用 NKL 的实例进行应用。


你可以在上图的窗口中键入指令,或者在 CMD 窗口中键入:

setx /M MKL_DEBUG_CPU_TYPE 5

这样一来,所有使用 MKL 的程序都会被永久性的改变设置,直到你修改变量的输入。

Linux

打开终端,在运行同一个实例前键入如下命令即可:

export MKL_DEBUG_CPU_TYPE=5

如果要永久性的改变系统中所有的实例,可在终端中键入:

echo 'export MKL_DEBUG_CPU_TYPE=5' >> ~/.profile

Reddit 热评

首先第一个疑惑就是,这样做能 work 吗?还真有开发者直接上手测试,Inori 在 Reddit 上表明,通过实际基准测试,他确认这样做能提升 NumPy 25% 到 90% 的性能。如下所示,在 AMD 不采用 MKL 的情况下,两个 4096*4096 的矩阵乘法需要 1 秒钟,而加了 MKL 后只需要 0.56 秒。

Inori 后续还提供了基准测试脚本,并表示他也会继续试试 MKL 对 TensorFlow 的加速能力(AMD 芯片下)。

在 Reddit Matlab 原板块中,很多开发者表示计算速度确实快了很多:

对于这种奇淫技巧,当然并不是所有开发者都赞同的,如果就我们自己用用还行,要是放到生产中,其并不稳定,也不安全。wind_of_amazingness 表示,mkl 从没有真正完整地在 AMD 芯片上测试过,这表示它会有一些意想不到的误差,例如数值不稳定等。

最后,也许除了速度,我们还需要测试计算误差,这样才能真正放心使用 MKL 库加速 AMD 芯片的数值计算。

参考链接:https://www.reddit.com/r/MachineLearning/comments/f2pbvz/discussion_workaround_for_mkl_on_amd/
工程MKL英特尔AMDMatlab
暂无评论
暂无评论~