シミュレーションのいくつかのインスタンスを並列に実行したいが、それぞれのシミュレーションは独自の独立したデータセットを持つ。次のようにプロセスごとに異なるランダムシードを持つPythonマルチプロセッシングを使用する
現在、私はこれを実装:
sim
、
adatom1
と
lattice
は、シミュレーションを開始機能
run
に渡されたオブジェクトである
P = mp.Pool(ncpus) # Generate pool of workers
for j in range(nrun): # Generate processes
sim = MDF.Simulation(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat,savetemp)
lattice = MDF.Lattice(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, kb, ks, kbs, a, p, q, massL, randinit, initvel, parangle,scaletemp,savetemp)
adatom1 = MDF.Adatom(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, ra, massa, amorse, bmorse, r0, z0, name, lattice, samplerate,savetemp)
P.apply_async(run,(j,sim,lattice,adatom1),callback=After) # run simulation and ISF analysis in each process
P.close()
P.join() # start processes
。
しかし、私は最近、それぞれのバッチを同時に実行していることを知りました(すなわち、ncpus
は、シミュレーション実行の合計がnrun
です)、全く同じ結果が得られます。
ここで誰かがこれを修正する方法を教えてもらえますか?
で見つけることができますか? –
これに乱数が含まれていますか?どのようにシードを設定していますか?なぜこれらは違うのですか?同じプロセスを2回実行すると、同じ結果が2回発生するはずです。なぜ彼らは違うべきだと思いますか? –
関数 'run'はシミュレーションを開始し、すべての結果を統合するために関数 'After'に向けられた結果を返します。それぞれのシミュレーションはランダムな初期条件を持っているため、私は異なる結果を期待しています。 私は考えている種子は使用しません。 'apply_async'を直接呼び出しで置き換えた場合、異なる結果になるかどうかを調べるには、次のコードを使用してください: randshift = np.random.rand(a、b)-0.5 * np.ones((a、b)) –