performance - Multiplication matrix vector with Python 3.x, numpy e multiprocessing -


i'm writing benchmark show differences in time, cost, speed up, efficiency , effective of sequential , parallel algorithm calculate system of linear equations using python 3.5, when calculate different processes, calculation not performed correctly because result of calculation in sequential (and numpy) different done in parallel. noticed half of matrix, each time increasing number of processes, not calculate sets 0 i-th position. doing wrong? mistake , why? code:

import random import sys import time import multiprocessing import math, numpy np numpy import linalg import argparse, sys, os   def creamatrici(n):     = [[random.random() x in range(n)] x in range(n)]     b = [random.random() x in range(n)]     #a^(-1)     = np.linalg.inv(a)     return a,b   def np_moltiplica(a, b):     c = np.dot(a,b)     return c   def moltiplica_seriale(a,b,n):     c = [0 x in range(n)]     in range(0,len(a)):         j in range(0,len(a)):             c[i] += a[i][j] * b[j]     return c  def moltiplica_parallelo(result_queue, worker_index, chunk_boundary, a,b):     n = len(a)     result = []     m in range(n):         output = moltiplica_seriale(                 a[chunk_boundary[0]:chunk_boundary[1],:],b,n)         result.append(output)      result_queue.put((worker_index, result))  ###########################################################################  def divisione_lavoro(nworkers, a,b):     def calcola_partizionamento_lavoro(l, n):         c = int(math.ceil(len(l)/float(n)))         return c      sizepartizionamento = calcola_partizionamento_lavoro(a, nworkers)     limitimatricidivise = [(i, i+sizepartizionamento) in range(0, (len(a)), sizepartizionamento)]     if nworkers != len(limitimatricidivise):         return none      result_queue = multiprocessing.queue()     processifigli = []     worker_index in range(nworkers):         processifigli.append(                                          multiprocessing.process(target=moltiplica_parallelo,                               args=(                                                                                                                    result_queue,                                    worker_index,                                    limitimatricidivise[worker_index],                                    a,                                     b)                                       )                            )      c in processifigli:         c.start()      results = [0 n in range(len(a))]      _ in range(nworkers):         worker_index, result_chunk = result_queue.get(block=true)         chunk_boundary = limitimatricidivise[worker_index]         results = result_chunk[0]       c in processifigli:         c.join()     return results       ###########################################################################      def main(argv=none):     if argv none:         argv = sys.argv      n = int(argv[1])       a,b = creamatrici(n)         #########################seriale##########################      start = time.time()     c = moltiplica_seriale(a,b,n)     end = time.time()       duration = (end-start) % 60     print ('risultato = ', c)     print ('\ntempo seriale: %.5f s' % duration)      #########################numpy############################      start = time.time()     c = np_moltiplica(a,b)     end = time.time()      duration = (end-start) % 60      print ('\n\nrisultato = ', c)     print ('\ntempo usando il modulo numpy: %.5f s' %duration)     print ('\n\n')      ######################multiprocessing#######################      durations = []     n_children = [1, 2, 4, 8]     n in n_children:         start = time.time()         result = divisione_lavoro(n, a, b)         if result none:             continue         duration = (time.time() - start) %60         if n == 1:             print ("risultato calcolato con %s processo figlio: %s" % (n, result))         else:             print ("risultato calcolato con %s processi figli: %s" % (n, result))         print ("tempo: %.2f s" % duration)         print ('\n\n')         durations.append(duration)      costo = [n*d n,d in zip(n_children,durations)]     speedup = [durations[0]/d d in durations]     efficienza = [s/n s,n in zip(speedup, n_children)]     efficacia = [s/c s,c in zip(speedup,costo)]     n, costo, speed, efficienza, efficacia in zip(n_children,costo,speedup,efficienza,efficacia):         if n == 1:             print ("costo con %s-processo figlio: %.2f" % (n,costo))             print ("speedup con %s-processo figlio: %.2f" % (n, speed))             print ("efficienza con %s-processo figlio: %.2f" % (n, efficienza))             print ("efficacia con %s-processo figlio: %.2f\n" % (n, efficacia))         else:             print ("costo con %s-processi figli: %.2f" % (n,costo))             print ("speedup con %s-processi figli: %.2f" % (n, speed))             print ("efficienza con %s-processi figli: %.2f" % (n, efficienza))             print ("efficacia con %s-processi figli: %.2f\n" % (n, efficacia))  if __name__ == "__main__":     sys.exit(main()) 


Comments

Popular posts from this blog

authentication - Mongodb revoke acccess to connect test database -

r - Update two sets of radiobuttons reactively - shiny -

ios - Realm over CoreData should I use NSFetchedResultController or a Dictionary? -