2013-08-07 13 views
15

マルチプロセッシングを使用して簡単なテストを実行しようとしています。 numpyをインポートするまで(プログラムで使用されていなくても)テストはうまく動作します。ここでは、コードは次のようになります。マルチプロセッシングとNumPyの互換性がありません

from multiprocessing import Pool 
import time 
import numpy as np #this is the problematic line 


def CostlyFunc(N): 
    """""" 
    tstart = time.time() 
    x = 0 
    for i in xrange(N): 
     for j in xrange(N): 
      if i % 2: x += 2 
      else: x -= 2  
    print "CostlyFunc : elapsed time %f s" % (time.time() - tstart) 
    return x 

#serial application 
ResultList0 = [] 
StartTime = time.time() 
for i in xrange(3): 
    ResultList0.append(CostlyFunc(5000)) 
print "Elapsed time (serial) : ", time.time() - StartTime 


#multiprocessing application 
StartTime = time.time() 
pool = Pool() 
asyncResult = pool.map_async(CostlyFunc, [5000, 5000, 5000]) 
ResultList1 = asyncResult.get() 
print "Elapsed time (multiporcessing) : ", time.time() - StartTime 

私はnumpyのインポートしない場合、結果は次のとおりです。

CostlyFunc : elapsed time 2.866265 s 
CostlyFunc : elapsed time 2.793213 s 
CostlyFunc : elapsed time 2.794936 s 
Elapsed time (serial) : 8.45455098152 
CostlyFunc : elapsed time 2.889815 s 
CostlyFunc : elapsed time 2.891556 s 
CostlyFunc : elapsed time 2.898898 s 
Elapsed time (multiporcessing) : 2.91595196724 

総経過時間が計算がされていることを意味し、1つの工程に要する時間と同様です並列化される。 Iインポートない場合numpyの結果は次のようになる。

CostlyFunc : elapsed time 2.877116 s 
CostlyFunc : elapsed time 2.866778 s 
CostlyFunc : elapsed time 2.860894 s 
Elapsed time (serial) : 8.60492110252 
CostlyFunc : elapsed time 8.450145 s 
CostlyFunc : elapsed time 8.473006 s 
CostlyFunc : elapsed time 8.506402 s 
Elapsed time (multiporcessing) : 8.55398178101 

唯一つのコアを使用しているため、経過時間の合計は、両方のシリアルおよびマルチ方法についても同様です。この問題は数が少ないことから生じることは明らかです。マルチプロセッシングのバージョンとNumPyとの間に互換性がない可能性はありますか?

私は現在Python2.7、numpyの1.6.2を使用し、Linux上で0.70a1マルチプロセッシングい

+1

これは非常に奇妙です - それはOSXでPython 2.7とNumPy 1.7で正常に動作するようです。 3つのコアが使用されているようなタイミングから、処理時間は遅くなります。これを確認できますか? – Daniel

+0

お返事ありがとうございます。 NumPyをインポートすると、計算が1つのコアのみで行われることは確かです(mpstat(http://linuxcommand.org/man_pages/mpstat1.html)で確認しました)。同じコアが3つのジョブを同時に計算するように見えるので、各ジョブは8.5秒かかりますが、合計時間も8.5秒です。 – user2660966

+0

私はnumpy 1.6.1、numpy 1.6.2とnumpy 1.7.1 ...同じ問題を試しました – user2660966

答えて

2

(初ポスト申し訳ありません、十分に策定やallignedされていない場合)あなたはマルチスレッドを使用するためにnumpyのを停止することができます

Debianで1

にMKL_NUM_THREADSをSETINGで私が使用:

export MKL_NUM_THREADS=1 

ソースの関連StackOverflowのポストから:Python: How do you stop numpy from multithreading?

結果:

[email protected]:~/tmp$ python multi.py 
CostlyFunc : elapsed time 3.847009 s 
CostlyFunc : elapsed time 3.253226 s 
CostlyFunc : elapsed time 3.415734 s 
Elapsed time (serial) : 10.5163660049 
CostlyFunc : elapsed time 4.218424 s 
CostlyFunc : elapsed time 5.252429 s 
CostlyFunc : elapsed time 4.862513 s 
Elapsed time (multiporcessing) : 9.11713695526 

[email protected]:~/tmp$ export MKL_NUM_THREADS=1 

[email protected]:~/tmp$ python multi.py 
CostlyFunc : elapsed time 3.014677 s 
CostlyFunc : elapsed time 3.102548 s 
CostlyFunc : elapsed time 3.060915 s 
Elapsed time (serial) : 9.17840886116 
CostlyFunc : elapsed time 3.720322 s 
CostlyFunc : elapsed time 3.950583 s 
CostlyFunc : elapsed time 3.656165 s 
Elapsed time (multiporcessing) : 7.399310112 

が、私はそれは私が最終的にあなたが並行して実行するnumpyのしたいと思いますので、多分あなたのマシンにnumpyのためのスレッドの数を調整しようとする場合に役立ちますことを確認していません。あなたの質問に対するコメントから

+0

downvoted人へ:downvoteの場合 - 理由を説明し、コメントセクションで質問してください。 – Jon

1

、ノーそのリンク @Ophionを見て、私はWhy does multiprocessing use only a single core after I import numpy?の重複としてそれをフラグが立てられている - 8月22日9時06分ali_m

で私がどうかを確認しますBLASの最適化バージョンを使用しています。私はnumpyのいくつかの一般的なインストールは、このlibのバージョンを提供し最適化しないことを発見しました。私のインストールから、libf77blas.so、libcblas.so、libatlas.soのポイントであることに気付くことができます。 Pythonで持つからhttp://docs.scipy.org/doc/numpy/user/install.html

輸入numpy.core._dotblas

ここ

は、BLASの最適化バージョンを構築するための命令です

>>> numpy.core._dotblas.__file__ 

## output: 

'PYTHONHOME/lib/python2.7/site-packages/numpy/core/_dotblas.so' 
お使いの端末から

$ ldd 'PYTHONHOME/lib/python2.7/site-packages/numpy/core/_dotblas.so' 
linux-vdso.so.1 => (0x00007fff241ff000) 
libf77blas.so => /opt/arch/intel/lib/libf77blas.so (0x00007f6050647000) 
libcblas.so => /opt/arch/intel/lib/libcblas.so (0x00007f6050429000) 
libatlas.so => /opt/arch/intel/lib/libatlas.so (0x00007f604fbf1000) 
libpython2.7.so.1.0 => 'PYTHONHOME/lib/libpython2.7.so.1.0 (0x00007f604f817000) 
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f604f5f9000) 
libc.so.6 => /lib64/libc.so.6 (0x00007f604f266000) 
libgfortran.so.3 => /usr/lib64/libgfortran.so.3 (0x00007f604ef74000) 
libm.so.6 => /lib64/libm.so.6 (0x00007f604ecef000) 
libdl.so.2 => /lib64/libdl.so.2 (0x00007f604eaeb000) 
libutil.so.1 => /lib64/libutil.so.1 (0x00007f604e8e8000) 

/lib64/ld-linux-x86-64.so。2(0x0000003c75e00000)

関連する問題