1

私は行列の乗数をしばらく前にコード化して、高速化しようとしました。同じプロセスでスレッドが実行されていることを発見するために試みました..後でマルチプロセッシング私が以下のコードで実装したライブラリ。さて、私は、結果が共有メモリにないので、生成されたプロセスによって行われた作業をどのようにマージするのか分かりません。Pythonマルチプロセッシングで浮動小数点配列に同時に書き込む

分散計算を「final_multi」変数にマージするにはどうすればよいですか?

HERESに私のコード:

#!/usr/bin/env python 
import numpy as np 
from multiprocessing import Process, Array 

T=64 
v1 = np.empty([T,T], dtype=np.float32) 
v2 = np.empty_like(v1) 
final_multi = np.empty_like(v1) 
#shared = Array('f', final_multi) This doesnt work 
def calclinea(mat1, mat2, fil, col): 
    escalar = 0 
    for vl in range(T): 
     escalar += mat1[fil,vl]*mat2[vl,col] 
    return escalar 

def mulshared(vec1, vec2, froY, toY, froX, toX): 
    global final_multi 
    for y in range(froY,toY): 
     for x in range(froX, toX): 
      final_multi[x,y] = calclinea(vec1,vec2,x,y) 
      #shared[x,y] = calclinea(vec1,vec2,x,y) 

def main(): 
    for r in range(T): ### Allocate host memory 
     for c in range(T): 
      v1[r,c] = r 
      v2[r,c] = c+2 
      final_multi[r,c] = 0 

    #p1 =Process(target=mulshared, args=(v1,v1,0,(T*1/4 -1),0,T)) 
    #p2 =Process(target=mulshared, args=(v1,v1,(T*1/4),(T*2/4 -1),0,T)) 
    #p3 =Process(target=mulshared, args=(v1,v1,(T*2/4),(T*3/4 -1),0,T)) 
    p4 =Process(target=mulshared, args=(v1,v1,T*3/4,T*4/4,0,T)) #All four processes to demo distribution of data, only 4th is initialized so result can be seen, p1 result is all zeros so.. 

    p4.start() 
    p4.join() 

    print "\nfinal_multi\n", final_multi 
main() 

私はちょうど、事前にどのようにマルチプロセッシング作品、感謝を勉強したい、これは行列の乗算の非効率的な方法であることを知っています。

答えて

0

sharedmemモジュールは、Pythonに付属するマルチプロセッシングモジュールの拡張バージョンです。プロセス間でメモリを共有するための簡単な方法を提供します。

import sharedmem as shmem 

out_matrix = shmem.empty((400,400)) 

def do_work(x): 
    out_matrix[100*x:100*(x+1), :] = x 

def main(): 
    with shmem.MapReduce(np=4) as pool: 
     pool.map(do_work, range(4)) 

この最小限の例では、出力マトリックスは4人の作業者によって並行して埋められます。

関連する問題