Операция Numpy Dot не использует все ядра процессора - PullRequest
0 голосов
/ 11 мая 2018
  • Я делаю произведение на одну точку с двумя точками (Предположим, a и b - две матрицы).

  • Когда форма a равна (10000, 10000) и форма b равна (1, 10000), тогда numpy.dot (a, bT) использует все ядра процессора.

  • Но когда форма a равна (10000, 10000) и форма b (2, 10000), то numpy.dot (a, bT) не использует все ядра ЦП (только одно).

Этопроисходит, когда размер строки 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

1 Ответ

0 голосов
/ 18 мая 2018

Операция Numpy Dot не использует все ядра процессора

numpy.show_config () ясно показывает, что он использует OpenBLAS на уровне подчеркивания.

Таким образом, OpenBLAS - это тот, который отвечает за параллельные вычисления.

Но в sgemm OpenBLAS не будет распараллеливать вычисления до определенного порога (в вашем случае размер строки b составляет от 2 до 15).

В качестве обходного пути вы можете изменить пороговое значение ( GEMM_MULTITHREAD_THRESHOLD ) в sgemm файле и скомпилировать OpenBLAS с numpy

Измените значение GEMM_MULTITHREAD_THRESHOLD с 4 на 0 , чтобы распараллелить все вычисления sgemm.

...