1

Bir matris çarpanı bir süre önce kodladım, daha hızlı bir hale getirme çabasıyla, iş parçacığının aynı süreçte işlediğini keşfetmeye çalıştım. Daha sonra çoklu işlemeyi keşfettim. Aşağıdaki kodda uyguladığım kütüphane. Şimdi, sonuç paylaşılan bellekte olmadığı için ortaya çıkan süreçlerin nasıl yapıldığını bilmiyorum.Aynı anda python çoklu işleme ile float dizisine yazmak için yazınız

Dağıtılmış hesaplamaları "final_multi" değişkenine nasıl birleştirebilirim?

İşte benim kod:

#!/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() 

ben sadece önceden ne kadar çoklu işlem eserler sayesinde öğrenmek istiyorum, bu matris çarpım bir verimsiz bir yoludur biliyorum.

cevap

0

sharedmem modülünü kullanabilirsiniz, bu Python ile birlikte gelen çoklu işlem modülünün geliştirilmiş bir sürümüdür. İşlemler arasında hafızayı paylaşmak için güzel ve kolay bir yol sunar.

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)) 

Bu minimal örnekte, çıktı matrisi paralel olarak dört işçi tarafından doldurulacaktır.

İlgili konular