代码之家  ›  专栏  ›  技术社区  ›  ZisIsNotZis

anaconda mkl无法设置线程数

  •  0
  • ZisIsNotZis  · 技术社区  · 7 年前

    我在用 numpy 从水蟒到基准大矩阵乘法( 8192x8192 类型 float32 )像这样:(在朱彼特)

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

    这个 麻木的 是建立在 MKL . 当进行乘法(连续)时,我发现python的CPU使用率总是50%。我想知道为什么它不是100%(因为矩阵乘法应该被自动修复)。因此,我四处搜索,找到两种设置线程数的方法 百万分之一 使用。

    一种方法是直接使用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个核心。我的蟒蛇环境看起来像:(缩写)

    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
    
    1 回复  |  直到 7 年前
        1
  •  -1
  •   Kaveh Vahedipour    7 年前

    请考虑此文档: 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中最具挑战性的部分之一。