matlab gurobi优化加速_英特尔MKL加速AMD计算可达3倍?AMD Yes

机器之心报道

参与:思源、一鸣、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 加速工具,也能获得很大的提升:

5671d1e170c130f127ae3d66a570f9d6.png

综合基准测试结果:

27757a7bd94a384e6954839e12c57bef.png

而这一讨论在 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 的实例进行应用。

90ccf63f6d847786f60b30ae11895829.png

你可以在上图的窗口中键入指令,或者在 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 秒。

317f6b33f9cee9d29cf0eb9478ef0651.png

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

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

80442702a29f1a2e27d02d94a1592046.png

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

43fd8b6d73e555ed44aa8eb452ff147b.png

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

参考链接:https://www.reddit.com/r/MachineLearning/comments/f2pbvz/discussion_workaround_for_mkl_on_amd/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MatlabGurobi是两种常用的优化调度工具,可以用来解决各种复杂的约束问题。 Matlab是一种数学建模软件,可以通过线性规划、整数规划、非线性规划、二次规划等方法,对各种实际问题进行优化求解Matlab提供了丰富的优化函数和工具箱,可以方便地进行模型建立、参数设置、求解和结果检验。 Gurobi是一种高性能的商业优化库,可以用于求解线性规划、整数规划、混合整数规划、二次规划等优化问题。Gurobi支持多种编程语言,包括Matlab。通过Matlab接口,可以直接调用Gurobi函数来求解优化问题。 使用MatlabGurobi进行优化调度代码的步骤如下: 1. 安装MatlabGurobi,并确保两者都正常运行。 2. 在Matlab中,使用相应的优化函数建立优化模型,包括目标函数、约束条件和决策变量。 3. 使用Gurobi提供的Matlab接口函数,将优化模型转化为Gurobi可识别的格式,并调用Gurobi函数进行求解。 4. 根据求解结果,分析并优化调度方案。 在使用MatlabGurobi进行优化调度代码时,需要注意以下几点: 1. 理解优化问题的性质和目标,选择合适的优化方法和算法。 2. 合理设置模型的参数和约束条件,避免模型过于复杂而导致计算困难。 3. 在使用Gurobi求解时,根据具体问题设置求解时间限制和停止条件,以避免耗费过多的时间和计算资源。 4. 对求解结果进行可视化和分析,验证调度方案的优劣并进一步优化。 通过合理地利用MatlabGurobi的优势,可以有效地进行优化调度代码,得到满足约束条件的最优调度方案。以上是关于如何使用MatlabGurobi进行优化调度代码的简要介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值