参与:思源、一鸣、Jamin
数学打算中的硬件加速是社区常常磋商的话题,如果能够利用一些库和硬件的上风,无疑能够帮助科研、生产等。近日,一个优化 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 的情形下,两个 40964096 的矩阵乘法须要 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/









