私は2つの行列でnumpyドット積を実行しています(aとbが2つの行列であると仮定します)。
aの形状が(10000、10000)で、bの形状が(1、10000)の場合、numpy.dot(a、bT)はすべてのCPUコアを使用しています。
ただし、aの形状が(10000、10000)で、bの形状が(2、10000)の場合、numpy.dot(a、bT)はすべてのCPUコアを使用しているわけではありません(1つのみを使用しています)。
これは、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ドット操作はすべてのCPUコアを使用しているわけではありません
numpy.show_config()は、アンダースコアレベルでOpenBLASを使用していることを明確に示しています。
したがって、OpenBLASは並列計算を担当する実際のものです。
しかし、sgemm
OpenBLASでは、特定のしきい値まで計算を並列化しません(あなたの場合、bの行サイズは2から15です)。
回避策として、sgemmファイルのしきい値(GEMM_MULTITHREAD_THRESHOLD)を変更し、numpyを使用してOpenBLASをコンパイルできます。
GEMM_MULTITHREAD_THRESHOLD値を4から0に変更して、すべてのsgemm
計算を並列化します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加