Programmazione.it v6.2
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Chat Forum
Una soluzione parallela per la moltiplicazione di matrici in Java (2/3)
Scritto da Francesco Carotenuto il 10-03-2010 ore 11:11
Nel precedente articolo abbiamo indicato l'utilizzo dei thread pool come una buona scelta per implementare la moltiplicazioni di matrici in parallelo. L'idea che è alla base di questo programma è quello di affidare a ogni thread del pool pezzi di matrici, esattamente di dimensioni (n/2)x(n/2), su cui effettueremo le operazioni di moltiplicazione e addizione, inoltre assumiamo per semplicità che n sia una potenza di due.

Ad esempio, se dobbiamo effettuare un prodotto tra due matrici A e B e la relativa matrice prodotto P di dimensioni 16x16, avremo quattro sottomatrici 4x4 sia per A che per B; nel caso di A esse saranno A00, A01, A10, A11, e in maniera analoga indicheremo in questo modo le sottomatrici di B e P. Il prodotto P00, che equivale alle prime quattro righe e colonne della matrice P, sarà:
  1. P00=A00*B00+A01*B10
Analogo ragionamento si può fare per le altre tre parti di P. Quindi abbiamo bisogno di realizzare una struttura dati Matrix, che oltre a inglobare la matrice vera e propria, includa i vari metodi get e set per poter lavorare sui singoli elementi e un metodo split, che scompone la nostra matrice nxn in quattro sottomatrici (n/2)x(n/2), con un'implementazione analoga al listato seguente:
  1. public class Matrix{
  2.  
  3.   private int dim;
  4.   private double[][]data;
  5.   private int rowDisplace,colDisplace;
  6.  
  7.   public Matrix(int d){
  8.     dim=d;
  9.     rowDisplace=colDisplace=0;
  10.     data= newdouble[d][d];
  11.   }
  12.  
  13.   private Matrix(double[][]matrix, int x, int y, int d){
  14.     data=matrix;
  15.     rowDisplace=x;
  16.     colDisplace=y;
  17.     dim=d;
  18.   }
  19.  
  20.   public double get(int row, int col){
  21.     return data[row+rowDisplace][col+colDisplace];
  22.   }
  23.  
  24.   public void set(int row, int col, double value){
  25.    data[row+rowDisplace][col+colDisplace]=value;
  26.   }
  27.  
  28.   public int getDim(){
  29.    return dim;
  30.   }
  31.  
  32.   public Matrix[][]split(){
  33.     Matrix[][]result= new Matrix[2][2];
  34.     int newDim=dim/2;
  35.     result[0][0]=
  36.      new Matrix(data,rowDisplace,colDisplace,newDim);
  37.     result[0][1]=
  38.      new Matrix(data,rowDisplace,colDisplace+newDim,newDim);
  39.     result[1][0]=
  40.      new Matrix(data,      rowDisplace+newDim,colDisplace,newDim);
  41.     result[1][1]=
  42.       new     Matrix(data,rowDisplace+newDim,colDisplace+newDim,newDim);
  43.     return result;
  44.   }
  45. }
Tale struttura verrà utilizzata nei task di addizione e moltiplicazione, che interagiranno con la logica del prodotto di matrici implementato con il thread pool.
Precedente: Rilevare globalmente gli eventi del mouse in C#
Successiva: Vecchi scanner e porte parallele (1/6)
Intervento di Jack Niisan a.k.a. jack0niisan del 26-05-2010 ore 17:02, Bolzano (BZ)
Plebeo
Plebeo
(4 interventi)
Iscritto il 23-05-2010
Ciao, volevo solo fare una osservazione, essendo io molto interessato al prodotto tra matrici in parallelo, ho deciso di provare la tecnica da te suggerita, ma un' affermazione non mi è chiara. Nel testo è scritto che partendo da una matrice nxn è possibile ricavare delle sotto-matrici di dimensioni n/2+n/2, ciò significa, se non erro, dividere "sempre" la matrice in 4 sotto-matrici che hanno metà numero di colonne e metà numero di righe, ma allora una matrice che è 16*16, non dovrebbe essere suddivisa in 4 matrici 8*8, piuttosto che 4 matrici 4*4?
Intervento di Francesco Carotenuto a.k.a. nucarote del 26-05-2010 ore 18:27, Nocera inferiore (SA)
Plebeo
Plebeo
(25 interventi)
Iscritto il 14-01-2009
jack0niisan ha scritto:
Ciao, volevo solo fare una osservazione, essendo io molto interessato al prodotto tra matrici in parallelo, ho deciso di provare la tecnica da te suggerita, ma un' affermazione non mi è chiara. Nel testo è scritto che partendo da una matrice nxn è possibile ricavare delle sotto-matrici di dimensioni n/2+n/2, ciò significa, se non erro, dividere "sempre" la matrice in 4 sotto-matrici che hanno metà numero di colonne e metà numero di righe, ma allora una matrice che è 16*16, non dovrebbe essere suddivisa in 4 matrici 8*8, piuttosto che 4 matrici 4*4?

Tenendo presente che tale articolo presenta solo uno stub di come potrebbe essere l'implementazione del prodotto di matrici parallelo.
Ad ogni modo, nel caso di matrici 16x16, la matrice viene suddivisa in 4 sottomatrici 8x8, così come mostrato nel codice del metodo split e che tu stesso puoi verificare. Per cui si è trattato solo di un banale errore di battitura.
Copyright Programmazione.it™ 1999-2009. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.819 secondi. Sito ottimizzato per Mozilla Firefox. Powered by Kyron.