【发布时间】: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 个线程总是失败以及如何使其工作。我在Win7,64bit。我的 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