Numpy с mpmath использует один поток для умножения матриц - PullRequest
0 голосов
/ 22 декабря 2018

Я работаю над простой матрицей adj , которая представляет матрицу смежности некоторого графа networkx.Когда я создаю adj следующим образом:

adj = sparse.csr_matrix(nx.adjacency_matrix(graph), dtype='longdouble').todense()

, а затем запускаю adj = adj ** 2, тогда в htop я вижу, что numpy использует все доступные потоки.

Однако из-за потери точности я попытался интегрировать mpmath где-то посередине.

Я сделал это так:

mp.dps = 120
adj = sparse.csr_matrix(nx.adjacency_matrix(graph), dtype='longdouble').todense()
# ... just like before
adjmp = mp.matrix(adj)
# this casts all values to mpf
adj = np.matrix(adjmp, dtype=object)
# and get back the np matrix, now with mpfs inside

Получившийся прилагательное выглядит так

matrix([[mpf('0.0'), mpf('0.0'), mpf('0.0'), ..., mpf('0.0'), mpf('0.0'),
     mpf('0.125')], #  [...]

, что я и ожидаю.

Расчет состоит из двух этапов: первый - квадрат прил , а второйэто фактическое вычисление.Из результатов видно, что точность намного выше, но htop показывает, что шаг возведения в квадрат по какой-то причине выполняется только в одном потоке.

Когда я запускаю np.show_config (), яполучить:

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