繁体   English   中英

Numpy dot操作不使用所有cpu内核

[英]Numpy dot operation is not using all cpu cores

  • 我在两个矩阵上做了numpy dot product(让我们假设a和b是两个矩阵)。

  • 当a的形状是(10000,10000)并且b的形状是(1,10000)时,numpy.dot(a,bT)正在使用所有CPU核心。

  • 但是当a的形状为(10000,10000)并且b的形状为(2,10000)时,numpy.dot(a,bT)不使用所有CPU核心(仅使用一个)。

当b的行大小为2到15(即从(2,10000)到(15,10000)时)会发生这种情况。

例:

import numpy as np

a = np.random.rand(10**4, 10**4)

def dot(a, b_row_size):
    b = np.random.rand(b_row_size, 10**4)

    for i in range(10):
        # dot operation
        x = np.dot(a, b.T)

# Using all CPU cores
dot(a, 1)

# Using only one CPU core
dot(a, 2)

# Using only one CPU core
dot(a, 5)

# Using only one CPU core
dot(a, 15)

# Using all CPU cores
dot(a, 16)

# Using all CPU cores
dot(a, 50)

np.show_config()

openblas_lapack_info:
    define_macros = [('HAVE_CBLAS', None)]
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
lapack_opt_info:
    define_macros = [('HAVE_CBLAS', None)]
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
blas_mkl_info:
  NOT AVAILABLE
lapack_mkl_info:
  NOT AVAILABLE
blas_opt_info:
    define_macros = [('HAVE_CBLAS', None)]
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
blis_info:
  NOT AVAILABLE
openblas_info:
    define_macros = [('HAVE_CBLAS', None)]
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c

Numpy dot操作不使用所有cpu内核

numpy.show_config()清楚地表明它在下划线级别使用OpenBLAS。

所以OpenBLAS是负责并行计算的实际的。

但是在sgemm OpenBLAS不会将计算并行化到某个阈值(在您的情况下,b的行大小为2到15)。

作为解决方法,您可以更改sgemm文件中的阈值( GEMM_MULTITHREAD_THRESHOLD )并使用numpy 编译 OpenBLAS

GEMM_MULTITHREAD_THRESHOLD值从4更改为0以并行化所有sgemm计算。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM