Python 2.7 では、2 次元配列の計算をすべてのコアに分散しようとしています。
そのために、グローバル スコープで変数に関連付けられた 2 つの配列があり、1 つは読み取り用、もう 1 つは書き込み用です。
import itertools as it
import multiprocessing as mp
temp_env = 20
c = 0.25
a = 0.02
arr = np.ones((100,100))
x = arr.shape[0]
y = arr.shape[1]
new_arr = np.zeros((x,y))
def calc_inside(idx):
new_arr[idx[0],idx[1]] = ( arr[idx[0], idx[1] ]
+ c * ( arr[idx[0]+1,idx[1] ]
+ arr[idx[0]-1,idx[1] ]
+ arr[idx[0], idx[1]+1]
+ arr[idx[0], idx[1]-1]
- arr[idx[0], idx[1] ]*4
)
- 2 * a
* ( arr[idx[0], idx[1] ]
- temp_env
)
)
inputs = it.product( range( 1, x-1 ),
range( 1, y-1 )
)
p = mp.Pool()
p.map( calc_inside, inputs )
#for i in inputs:
# calc_inside(i)
#plot arrays as surface plot to check values
計算 (温度の反復計算) が実際に意味をなすように、arr
その例示的な -s 以外のいくつかの異なる値を持つ配列の追加の初期化があると仮定します。1
for
メソッドの代わりにコメントアウトされたループを使用するとPool.map()
、すべてが正常に機能し、配列には実際に値が含まれます。関数を使用するPool()
と、変数new_array
は初期化された状態のままになります (つまり、最初に で初期化されたため、ゼロのみが含まれます)。
Q1 :Pool()
グローバル変数に書き込めなくなるということですか?
Q2 :並列化でこの問題に取り組む他の方法はありますか?