【问题标题】:Anaconda MKL can't set number of threadsAnaconda MKL 无法设置线程数
【发布时间】:2018-11-02 08:21:04
【问题描述】:

我使用 anaconda 中的 numpy 来对大矩阵乘法(8192x8192 类型为 float32)进行基准测试,如下所示:(在 jupyter 中)

import numpy as np
a = np.empty((8192, 8192), 'f')
%timeit a @ a

numpy 是针对 MKL 构建的。当做乘法(连续)时,我发现 python 的 CPU 使用率总是 50%。我想知道为什么它不是 100%(因为矩阵乘法应该自动颚化)。因此,我四处搜索并找到两种方法来设置 MKL 使用的线程数。

一种方法是直接使用 DLL:

from ctypes import CDLL
mkl = CDLL('../conda/pkgs/mkl-2019.0-118/Library/bin/mkl_rt.dll')
print(mkl.MKL_Set_Num_Threads(4))
print(mkl.MKL_Get_Max_Threads())

我相信它给了我一些未知的错误代码并且未能设置:

-899695632
2

另一种方式是通过mkl-service包:

import mkl
print(mkl.set_num_threads(4))
print(mkl.get_max_threads())

这也没有成功。

None
2

我想知道为什么在 MKL 中设置 4 个线程总是失败以及如何使其工作。我在Win764bit。我的 CPU 是 i5-2520M,它应该有 4 个核心。我的anaconda环境如下:(略)

mkl                       2019.0                      118
mkl-service               1.1.2            py36hb217b18_5
mkl_fft                   1.0.6            py36hdbbee80_0
mkl_random                1.0.1            py36h77b88f5_1
numpy                     1.15.3           py36ha559c80_0
numpy-base                1.15.3           py36h8128ebf_0
zeromq                    4.2.5                he025d50_1

【问题讨论】:

  • 您确定启用了超线程吗?您可以通过启动 wmic(在开始菜单中搜索或从 cmd 运行)并运行不带引号的命令“CPU Get NumberOfCores,NumberOfLogicalProcessors /Format:List”来检查。
  • 看起来 MKL 关心物理内核的数量,并没有从超线程中受益。您的机器有 2 个物理内核,这将是 MKL 使用的最多线程数。 software.intel.com/en-us/forums/intel-math-kernel-library/topic/…
  • @roro 你知道为什么任务管理器会说只使用了 50% 的 CPU 吗?这是错误的统计数据吗?
  • 超线程是一种物理内核在特定情况下模拟两个内核的方法(对许多通用程序有用,对数学计算没有用)。这些模仿的核心称为逻辑核心,是 Windows 所看到的。这些线程可能与逻辑核心相关联,因此 Windows 认为只有 2/4 被使用。你的两个物理核心都被充分利用了,但是 windows 认为它​​有两个逻辑核心坐在那里什么都不做。由于逻辑核心共享大部分资源,因此情况并非如此。我认为您的系统正在按预期工作。

标签: python numpy anaconda intel-mkl


【解决方案1】:

请考虑以下文档: https://software.intel.com/en-us/articles/intel-math-kernel-library-intel-mkl-intel-mkl-100-threading

关键变量是MKL_NUM_THREADS,您可以将其设置为全局Windows 变量。

我强烈反对@roro 在这点上。您看到 50% 的原因是您没有使用超线程功能。话虽如此,请记住,计算速度有两个限制因素:CPU 能力和!!内存访问带宽。通常第二个会限制速度,说是 CPU 功率的 70%,因为 RAM/缓存不能足够快地向算法提供数据。

正确处理并行性是 HPC 中更具挑战性的部分之一。

【讨论】:

  • 您提供的链接在有关超线程的部分中这样说:“如果请求的线程数超过物理内核数(可能是由于超线程),并且 MKL_DYNAMIC 未更改其默认值如果值为 TRUE,英特尔 MKL 会将线程数缩减为物理内核数。”超线程通常不会使数据并行性丰富的任务受益,这就是为什么 MKL 不会(默认情况下)让您的线程数超过物理内核数。
  • 这就是我写答案的原因。这完全取决于您的算法,如果您可以从超线程中获利。我在博士期间对 MRI 数据进行了重建,并且总能找到达到 75% 的超线程内核的方法。不过,它确实涉及到很多思考,如何尽可能避免缓存未命中。不容易。我用于教学的工作和代码都在这里:github.com/kvahed/codeare。几乎每个班级都进行了很好的调整,以获得最佳性能。
  • 我同意这一点,也许您的反对意见是我关于超线程对数学计算无用的松散声明?我在考虑 BLAS 3 级函数,比如原始问题中的矩阵矩阵乘法,其中瓶颈不在内存上,而是在触发器上。它们构成了 LAPACK 和其他 MKL 实现等高性能数学库的基础。
猜你喜欢
  • 1970-01-01
  • 2014-10-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
相关资源
最近更新 更多