5

マルチプロセッシングによって呼び出される関数内でnumpy ndarray関数のスコープは異なりますか? 次に例を示します。

Python のマルチプロセッシング モジュールを使用して、次のような関数を呼び出しています。

for core in range(cores):
    #target could be f() or g()
    proc = mp.Process(target=f, args=(core))
    jobs.append(proc)
for job in jobs:
    job.start()
for job in jobs:
    job.join()

def f(core):
    x = 0
    x += random.randint(0,10)
    print x

def g(core):
    #Assume an array with 4 columns and n rows
    local = np.copy(globalshared_array[:,core])
    shuffled = np.random.permutation(local)

を呼び出すf(core)と、x変数はプロセスに対してローカルになります。予想どおり、別のランダムな整数を出力します。これらは 10 を超えることはなくx=0、各プロセスでそれを示しています。あれは正しいですか?

配列のコピーを呼び出しg(core)て並べ替えると、4 つのまったく同じように「シャッフルされた」配列が返されます。これは、作業コピーが子プロセスに対してローカルではないことを示しているようです。あれは正しいですか?もしそうなら、共有メモリ空間を使用する以外に、共有メモリ空間から埋める必要があるときに、ndarray を子プロセスに対してローカルにすることは可能ですか?

編集:

ランダムな整数を追加するように変更g(core)すると、望ましい効果が得られるようです。配列は異なる値を示しています。permutation列(各子プロセスにローカル)をランダムに並べ替えているという点で何かが起こっているに違いありません...アイデア?

def g(core):
    #Assume an array with 4 columns and n rows
    local = np.copy(globalshared_array[:,core])
    local += random.randint(0,10)

編集 II: np.random.shuffleも同じ動作を示します。配列の内容はシャッフルされていますが、各コアで同じ値にシャッフルされています。

4

2 に答える 2

5

g(core)を呼び出して配列のコピーを並べ替えると、4つの同じように「シャッフルされた」配列が返されます。これは、作業コピーが子プロセスのローカルではないことを示しているようです。

おそらく、乱数ジェネレーターは各子プロセスで同じように初期化され、同じシーケンスを生成することを示しています。各子のジェネレーターをシードする必要があります(おそらく、子のプロセスIDをミックスにスローします)。

于 2013-01-24T16:09:54.953 に答える
4

ランダムな配列をシードするには、この投稿が最も役に立ちました。次のg(core)関数は、コアごとにランダムな順列を生成することに成功しました。

def g(core):
    pid = mp.current_process()._identity[0]
    randst = np.random.mtrand.RandomState(pid)
    randarray = randst.randint(0,100, size=(1,100)
于 2013-01-24T16:21:14.540 に答える