2016-12-14 12 views
2

おはようPython Joblibのダブル並列ループ

私は、多くの独立した統合を含む計算を高速化しようとしています。これを行うために、私はPython Joblibとマルチプロセッシングを使用しています。今まで私は計算の内部ループを並列化することに成功しましたが、私は外部ループと同じことをしたいと思います。並列プログラミングは私の心を乱すので、誰かが私を助けることができるかどうか疑問に思っています。これまで私は持っています:

from joblib import Parallel, delayed 
import multiprocessing 

N = 10 # Some number 
inputs = range(1,N,2) 
num_cores = multiprocessing.cpu_count() 

def processInput(n): 
    u_1 = lambda x,y: f(x,y)g(n,m) # Some function 
    Cn = scintegrate.nquad(u_1, [[A,B],[C,D]]) # A number 
    return Cn*F(x,y)*G(n,m) 

resultsN = [] 

for m in range(1,N,2): # How can this be parallelized? 
    add = Parallel(n_jobs=num_cores)(delayed(processInput)(n) for n in inputs) 
    resultsN = add + resultsN 

resultsN = sum(resultsN) 

これまでのところ、正しい結果が得られました。今私は外側のループで同じことをしたいと思います。どのように私はこれを行うことができます誰も考えを持っていますか?

また、u_1宣言をprocessInputの外で行うことができるかどうか、また改善のための提案があれば幸いです。

ありがとうございました。

答えて

2

私が正しく理解している場合は、nの値の範囲で関数processInput(n)を実行し、その値をm倍にしてすべてを加算する必要があります。ここでは、インデックスmは、処理機能を実行して結果を追加する回数をカウントしていますが、それ以外は何も表示されません。これにより、ただ1つのレイヤーの並列処理だけですべてを行うことができます。つまり、繰り返し値を含む入力リストを作成し、コア間でそのワークロードを分割します。速い直感は、入力を[1,2,3,4]と並行して処理するのではなく、それを複数回実行するのではなく、並列入力[1,1,1,2,2,2,3,3,3,4,4,4]で実行するということです。ここでは、それがどのように見えるかを示します(関数をより簡単な関数に変更しました)。

import numpy as np 
from joblib import Parallel, delayed 
import multiprocessing 
from math import ceil 

N = 10 # Some number 
inputs = range(1,N,2) 
num_cores = multiprocessing.cpu_count() 

def processInput(n): # toy function 
    return n 

resultsN = [] 
# your original solution with an additional loop that needs 
# to be parallelized 
for m in range(1,N,2): 
    add = Parallel(n_jobs=num_cores)(delayed(processInput)(n) for n in inputs) 
    resultsN = add + resultsN 
resultsN = sum(resultsN) 
print resultsN 

# solution with only one layer of parallelization 
ext_inputs = np.repeat(inputs,ceil(m/2.0)).tolist() 
add = Parallel(n_jobs=num_cores)(delayed(processInput)(n) for n in ext_inputs) 
resultsN = sum(add) 
print resultsN 

あなたの元のループにmは、すべての第2の値をスキップするためceilが必要です。

関連する問題