当你有 AMD CPU 时,你可以加速使用 Intel-MKL 的代码吗?

When you have an AMD CPU, can you speed up code that uses the Intel-MKL?

我有一个 AMD cpu,我正在尝试 运行 一些使用 Intel-MKL 的代码。代码比我预期的要慢得多。

当你有 AMD CPU 时,你可以加速使用 Intel-MKL 的代码吗?怎么样?

更新 2021-08-26:您可以从大约 2020-08-31 之前加速旧版本的 MKL。设置环境变量 MKL_DEBUG_CPU_TYPE=5 然后 运行 你的代码。

注意:我不知道英特尔删除环境变量解决方法的确切日期或版本。

仅供参考,此减速会影响 任何使用 Intel-MKL 库和 AMD CPU 上的 运行 的东西(即影响所有操作系统并影响所有编程语言和所有程序(older versions of Matlab, C, C++, Python, Anaconda-Python, Machine-Learning like Tensorflow and Pytorch,再次 任何在 AMD CPU 上使用 Intel-MKL 库的东西)。

仅供参考设置和获取环境变量超出了这个问题的范围,但这里有一些有用的链接:

  • 对于Windows and another link with screenshots
    • 我个人是:“旧”控制面板 --> 系统 --> 高级 --> 环境变量 --> 系统变量 --> ceate new
  • 为 Linux here is a general guide
    • 对于想要仅为自己的用户设置环境变量的 bash 用户的简单情况,将 export MKL_DEBUG_CPU_TYPE=5 行附加到您用户的 .bashrc 文件



p.s.

关于问题“why/how 将环境变量设置为 运行 是否明显更快?”

  • 如果检测到非英特尔,Intel-MKL 的默认行为是检查 CPU 和 运行 较慢的代码。
  • 设置环境变量会覆盖默认行为并使代码执行得更快,尽管没有 Intel 硬件。

您可能想知道“为什么英特尔会在他们的 MKL 库中放慢软件速度?

  • 英特尔多年来让他们的编译代码首先检查 CPU 然后如果 CPU 被检测为非英特尔代码将选择 运行 较慢的代码
  • 有官司
  • 诉讼的结果是英特尔不得不披露他们正在做的事情,但不必停止他们正在做的事情
  • 这是包含更多历史和信息的维基页面:https://en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler#Reception

截至 2021 年,英特尔不幸 removed MKL_DEBUG_CPU_TYPE 以防止 AMD 用户使用已接受答案中提供的解决方法。这意味着解决方法不再有效,AMD 用户必须切换到 OpenBLAS 或继续使用 MKL。

要使用解决方法,请遵循此方法

  1. 使用 conda 和 NumPy 的 MKL=2019 创建一个 conda 环境。
  2. 激活环境
  3. 设置MKL_DEBUG_CPU_TYPE = 5

上述步骤的命令:

  1. conda create -n my_env -c anaconda python numpy mkl=2019.* blas=*=*mkl
  2. conda activate my_env
  3. conda env config vars set MKL_DEBUG_CPU_TYPE=5

就是这样!