2017-05-15 19 views
0

私は以下のPythonプログラムを、クラスターコンピューティング機能で順次バージョンと並列バージョンの両方で試しました。私は明らかに(トップコマンドを使用して)並列プログラムのために開始するプロセスをもっと見ることができました。しかし、私が時間を取ると、それは並列バージョンがより多くの時間を費やしているようです。理由は何でしょうか?私はコードとタイミング情報を添付します。このマルチプロセッシングコードがシリアルより遅いのはなぜですか?

#parallel.py 
from multiprocessing import Pool 
import numpy 
def sqrt(x): 
return numpy.sqrt(x) 
pool = Pool() 
results = pool.map(sqrt, range(100000), chunksize=10) 

#seq.py 
import numpy 
def sqrt(x): 
return numpy.sqrt(x) 
results = [sqrt(x) for x in range(100000)] 

[email protected]$ time python parallel.py > parallel.txt 
real 0m1.323s 
user 0m2.238s 
sys  0m0.243s 

[email protected]$ time python seq.py > seq.txt 
real 0m0.348s 
user 0m0.324s 
sys  0m0.024s 
+0

MPI!=マルチプロセッシング!このコードを使用しているシステムに関するさらに多くの情報を指定する必要があります。 – Zulan

+0

クラスタには、1つのマスタノードと2つの他の計算ノードがあります。各ノードには6つのコアがあります。並列バージョンではCPU使用率が130%を超えています –

+0

Pythonマルチプロセッシング[複数のノード間で作業を分散しません](https://stackoverflow.com/questions/5181949/using-the-multiprocessing-module-for-cluster-computing) )。 – Zulan

答えて

1

タスクあたりの作業量が仕事配布オーバーヘッドを補償するためにあまりにも少しです。最初にchunksizeを増やす必要がありますが、1回の平方根演算が短すぎてプロセス間でデータを送信するコストを補うことはできません。あなたは、このようなものから効果的なスピードアップを見ることができます:

def sqrt(x): 
    for _ in range(100): 
    x = numpy.sqrt(x) 
    return x 
results = pool.map(sqrt, range(10000), chunksize=100) 
+0

このコードは、(X)インポートプール インポートnumpyの デフSQRTを多重処理から予想される出力 を与えている: _ための範囲内(100): X = numpy.sqrt(X) リターンX プール=プール()結果:pool.map(sqrt、range(10000)、chunksize = 1000) シリアル1.121秒、パラレル0.955秒 –

関連する問題