2017-06-05 3 views
0

を増加させない私は、関数numpy.linalg.matrix_powerをparalizeする必要があると私は、私が試してみましたどのくらい速く並列バージョンParalizeのnumpy.linalg.matrix_powerがパフォーマンス

def aux_matrix_arg3(A): 

    aaa=np.linalg.matrix_power(np.random.randn(199,199),100)  

return 1 

N=10000 
processes=4 
chunksize=N/processes 
poolWorkers=mp.Pool(processes=processes) 
ti=t.time() 
A=poolWorkers.map(aux_matrix_arg3,range(N),chunksize=chunksize) 
print 't_iteration 3',t.time()-ti 

ことができるテストするには、次のコードを使用します私のラップトップには1と4のプロセスがあります。 t_iteration 3つの40.7985408306 1工程:t_iteration 3 40.6538720131

私はparalleプロセスとすべてのimprovmentを得ることはありません、なぜ任意の手掛かり私は非常に類似した性能 4のプロセスを得ましたか。

+3

1プロセス対4プロセスのCPU負荷を確認する必要があります。たぶん 'np.linalg.matrix_power'は既にマルチプロセスであるか、内部的にマルチスレッド化されています。 – MSeifert

+0

あなたは正しいです!すでにマルチスレッド化されています。 – user2157396

答えて

0

ドキュメントは言う:nは正の整数の

は、電源が繰り返し行列squaringsと行列乗算によって計算されます。 n == 0の場合、Mと同じ形状の単位行列が返されます。 n < 0の場合、逆数が計算され、abs(n)に引き上げられます。

お使いのシステムが正しく設定されている場合は、BLASは(計算するために使用される線形連立方程式を解くためのマトリックス乗算とLAPACK(多分SuperLUで、おそらく唯一のまばらなケースでは、後者を)並列化するために使用されます逆)。だから非常に高い確率で、素朴なコードはすでに非常に最適化されています!

これにもかかわらず、純粋な並列化はすべてのデータをコピーするので、傷つける可能性があるので注意してください。 (通常、mmap-arraysを使用してコピーするのではなくデータを共有します)。

関連する問題