を使用して大きな行列の乗算を実行したいと思いますmultiprocessing.Pool
。
突然、次元が50を超えると、計算時間が非常に長くなります。
より速くする簡単な方法はありますか?
ここでは、のような共有メモリを使用したくありません。RawArray
元のコードが毎回ランダムにマトリックスを生成するためです。
サンプルコードは以下のとおりです。
import numpy as np
from time import time
from multiprocessing import Pool
from functools import partial
def f(d):
a = int(10*d)
N = int(10000/d)
for _ in range(N):
X = np.random.randn(a,10) @ np.random.randn(10,10)
return X
# Dimensions
ds = [1,2,3,4,5,6,8,10,20,35,40,45,50,60,62,64,66,68,70,80,90,100]
# Serial processing
serial = []
for d in ds:
t1 = time()
for i in range(20):
f(d)
serial.append(time()-t1)
# Parallel processing
parallel = []
for d in ds:
t1 = time()
pool = Pool()
for i in range(20):
pool.apply_async(partial(f,d), args=())
pool.close()
pool.join()
parallel.append(time()-t1)
# Plot
import matplotlib.pyplot as plt
plt.title('Matrix multiplication time with 10000/d repetitions')
plt.plot(ds,serial,label='serial')
plt.plot(ds,parallel,label='parallel')
plt.xlabel('d (dimension)')
plt.ylabel('Total time (sec)')
plt.legend()
plt.show()
の合計計算コストはf(d)
すべて同じであるためd
、並列処理時間は等しくなければなりません。
しかし、実際の出力はそうではありません。
システム情報:
Linux-4.15.0-47-generic-x86_64-with-debian-stretch-sid
3.6.8 |Anaconda custom (64-bit)| (default, Dec 30 2018, 01:22:34)
[GCC 7.3.0]
Intel(R) Core(TM) i9-7940X CPU @ 3.10GHz
注子
@
プロセスにデータを送信するのではなく、(のような)複雑な内部シミュレーションとして並列計算を使用したいと思います。
これは自己参照用です。
ここで、私は解決策を見つけました。
私numpy
はバックエンドとしてMKLを使用していますが、MKLマルチスレッドが衝突することが問題である可能性がありますmultiprocessing
。
コードを実行した場合:
import os
os.environ['MKL_NUM_THREADS'] = '1'
インポートする前にnumpy
、それは解決しました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加