Dense Matrix-Matrix Multiplication in Parallel
PROGETTO PER IL CORSO DI CALCOLO PARALLELO
A.A. 2006/07
Cappellazzo PietroCarminati Roberto De Martin Andrea
Matrix-Matrix Multiplication in Parallel 2
Obbiettivi
Implementazione dell’algoritmo sequenziale
Implementazioni di tre algoritmi paralleli Matrix-Matrix Multiplication Cannon Algorithm Processor Farm
Test e confronti fra gli algoritmi paralleli
Matrix-Matrix Multiplication in Parallel 3
Strutture Dati Le matrici utilizzate sono descritte dalla seguente struttura:
typedef struct matrice{
int size;
double **valori;
} Matrice;
Per gestire queste sono state implementate varie funzioni, fra le quali:
Matrice *generaMatrici(int); void stampaMatrice(Matrice *matrice); Matrice *leggiMatrice(char nome[],int *n); void freeMatrice(Matrice *m);
Matrix-Matrix Multiplication in Parallel 4
Strutture Dati
Le matrici possono essere sia caricate da disco, sia generate a runtime.
Se vengono caricate da file, il file deve essere strutturato come segue:
4
100652072.371159 244830855.097792 58656990.522433 49018021.012937
1069220144.632378 -141295504.878204 -109381498.803692 357493319.983084
392155482.578247 881982189.524574 -673959577.796322 151256985.897165
1043582072.493237 511353868.458505 189438468.246429 -344821564.773202
dimensione matrice contenuto della matrice
Matrix-Matrix Multiplication in Parallel 5
Implementazione Algoritmo Sequenziale L’algoritmo sequenziale è stato implementato tramite una
semplice moltiplicazione di matrici: Entrambe le matrici da moltiplicare vengono caricate o generate
nello heap Anche la matrice risultante viene generata (vuota) nello heap Vengono effettuati i calcoli La matrice risultante viene salvata sul disco locale (di default
nella cartella /tmp) Complessità O(n3)
Questo non è l’algoritmo più efficiente (sequenziale) L’algoritmo ottimo è l’algoritmo di Strassen Complessità O( )
Matrix-Matrix Multiplication in Parallel 6
Implementazione Matrix-Matrix Multiplication
Input Input da file Generazione a runtime
Suddivisione delle matrici (e posizionamento in array)
Matrix-Matrix Multiplication in Parallel 7
Implementazione Matrix-Matrix Multiplication
Comunicazioni (Fase 1) Invio in broadcast il numero di celle che dovrà ricevere ogni
processo Ogni processo alloca lo spazio necessario Il processo master invia ad ogni altro processo le proprie
celle (scatter)
Matrix-Matrix Multiplication in Parallel 8
Implementazione Matrix-Matrix Multiplication
Comunicazioni (Fase 2) i processi devono comunicare il proprio blocco a
tutti gli altri processi presenti nella stessa riga della prima matrice e nella stessa colonna della seconda
MPI_Comm_split(MPI_COMM_WORLD,xy[1],myid,&MPI_Riga);MPI_Comm_split(MPI_COMM_WORLD,xy[0],myid,&MPI_Colonna);
Matrix-Matrix Multiplication in Parallel 9
Implementazione Matrix-Matrix Multiplication
Comunicazioni (Fase 2) Vengono effettuate tutte le comunicazioni
necessarie (all_to_all) Viene eseguita una Allgather in ogni comunicatore
creato.
Matrix-Matrix Multiplication in Parallel 10
Implementazione Matrix-Matrix Multiplication
Moltiplicazione ogni processo possiede tutti i dati necessari a calcolare il
proprio blocco risultante e procede con la moltiplicazione
Comunicazioni (Fase 3) I blocchi vengono convertiti in array monodimensionali e
inviati al processo master (gather)
Matrix-Matrix Multiplication in Parallel 11
Implementazione Matrix-Matrix Multiplication Salvataggio
Il processo master a questo punto compone la matrice risultante e la salva nel disco locale
Di default nella cartella /tmp del sistema
Riassunto funzionamento
Matrix-Matrix Multiplication in Parallel 12
Implementazione Cannon Algorithm
Input Input da file Generazione a runtime
Suddivisione delle matrici (e posizionamento in array)
Matrix-Matrix Multiplication in Parallel 13
Implementazione Cannon Algorithm
Allineamento delle matrici
Matrix-Matrix Multiplication in Parallel 14
Implementazione Cannon Algorithm Comunicazioni (Fase 1)
La fase di allineamento pone le matrici in array monodimensionali
Viene comunicato ad ogni processo quante celle dovrà ricevere(broadcast)
Ogni processo alloca quindi lo spazio necessario a ricevere i dati Il master invia ad ogni processo il proprio blocco (scatter)
Matrix-Matrix Multiplication in Parallel 15
Implementazione Cannon Algorithm Determinazione del rank dei processi vicini
Per ogni processo vengono determinati gli id del processo Sopra, Sotto, A Destra, A Sinistra
Matrix-Matrix Multiplication in Parallel 16
Implementazione Cannon Algorithm
Moltiplicazione ogni processo procede al calcolo del blocco
parziale (moltiplicando i due blocchi in suo possesso)
Comunicazioni (Fase 2) Attraverso la primitiva MPI_Sendrecv_replace
ogni processo comunica: Il proprio blocco della prima matrice al vicino di destra
e lo riceve da quello di sinistra Il proprio blocco della seconda matrice al vicino in alto
e lo riceve dal vicino in basso
Matrix-Matrix Multiplication in Parallel 17
Implementazione Cannon Algorithm In questo modo viene effettuato uno shift delle matrici
Ad ogni passo il valore del blocco risultante temporaneo viene aggiornato
Matrix-Matrix Multiplication in Parallel 18
Implementazione Cannon Algorithm Una volta ricevuti:
tutti i blocchi della riga della prima matrice e della colonna della seconda matrice
Il blocco calcolato è il risultato finale Comunicazioni (Fase 3)
I blocchi calcolati vengono trasformati in array monodimensionali e inviati al processo master (gather)
Matrix-Matrix Multiplication in Parallel 19
Implementazione Cannon Algorithm Salvataggio
Il processo master a questo punto compone la matrice risultante e la salva nel disco locale Di default nella cartella /tmp del sistema
Riassunto funzionamento
Matrix-Matrix Multiplication in Parallel 20
Implementazione Processor Farm
Input Input da file Generazione a runtime
Comunicazioni (Fase 1) Viene comunicata la dimensione della seconda
matrice (broadcast) Ogni processo può allocare lo spazio necessario L’intera seconda matrice viene quindi replicata in tutti i
processi slave (broadcast)
Matrix-Matrix Multiplication in Parallel 21
Implementazione Processor Farm
Comunicazioni (Fase 2) Il Processo master inizia a scandire la prima matrice
comunica ad ogni processo slave una riga (MPI_send) Ed un id che indica la posizione della riga nella prima matrice se ci sono più processi che righe viene comunicato il valore
id = -1 che indica al processo slave che non ci sono dati da computare
Moltiplicazione Ogni processo slave può calcolare la riga risultante
Possiede una riga della prima matrice (MPI_recv) e l’intera seconda matrice
Matrix-Matrix Multiplication in Parallel 22
Implementazione Processor Farm Comunicazioni (Fase 3)
Il processo slave, una volta terminato il calcolo invia il risultato (e l’indice) al processo master (MPI_send)
Comunicazioni (Fase 4) Il processo master :
se ha ancora righe della matrice Ris che non sono state calcolate, invia una riga della prima matrice (e l’indice corrispondente)
al processo dal quale ha appena ricevuto un risultato altrimenti
Invia al processo richiedente l’indice -1 che indica che il lavoro è terminato Salvataggio
Il processo master a questo punto compone la matrice risultante e la salva nel disco locale
Di default nella cartella /tmp del sistema
Matrix-Matrix Multiplication in Parallel 23
Implementazione Processor Farm
Master
Slave 1 B
Slave 1 B Slave 1 B
Slave 1 B
Riga matric
e A + id
Rig
a m
atric
e A
+ id R
iga matrice A
+ id
id = -1
Riga matric
e Ris
+ id
Rig
a m
atric
e R
is +
id
Riga m
atrice Ris + id
Processo Idle
Processo Attivo
Matrix-Matrix Multiplication in Parallel 24
Implementazione Processor Farm
Matrix-Matrix Multiplication in Parallel 25
Scelte progettuali Funzione per appesantire la computazione
Funzione che accetta in input un numero e, a seconda del suo valore, utilizza il processore per più o meno tempo.
E’ basata sulle dimensione delle matrici Ad esempio:
per calcolare una matrice 1920x1920,vengono effettuate 19203 moltiplicazioni Supponendo che la funzione occupi il processore per 1ms 1ms* 19203≈1960 ore di computazione (in sequenziale)
(81 giorni !!!! ) Per questo la scelta è ricaduta su un semplice ciclo for
for (k=0;k<granularita;k++)l++; Sono state scelte tre granularità:
Matrix-Matrix Multiplication in Parallel 26
Scelte progettuali
Dimensioni delle matrici Sono state scelte delle matrici che permettono
di occupare la memoria di essere calcolate in un tempo ragionevole
Matrix-Matrix Multiplication in Parallel 27
Test I test sono stati eseguiti su un cluster di workstation con
macchine omogenee, così configurate: CPU: Intel® Pentium® 4 1.80Ghz (1795 Mhz) RAM: 768MB (774300KB total - 528184KB free) RETE: Ethernet 100.0Mbps indirizzi Ip 157.138.22.* OS: Ubuntu Linux (kernel version: 2.6.15-26-686)
Per i test sono state utilizzate fino a 16 macchine
I test sono stati eseguiti variando: Granularità (BASSA – MEDIA – ALTA) Dimensione matrice (192 – 384 – 960 - 1920)
Questo per ogni algoritmo, con un totale di 120 test prestazionali
Matrix-Matrix Multiplication in Parallel 28
Test – tempi di esecuzioneAlgoritmo sequenziale O(n3)
algoritmo sequenziale - tempi di calcolo
0
500
1000
1500
2000
2500
192 384 960 1920
dimensione n della matrice (n*n)
tem
po
(se
c)
BASSA
MEDIA
ALTA
• la complessità dell’algoritmo è O(n3)
• nella matrice con dimensioni maggiori (1920x1920) la differenza è di circa 1469sec (≈24minuti).
• Questo permetterà poi di valutare effettivamente il comportamento degli algoritmi paralleli
Matrix-Matrix Multiplication in Parallel 29
Test – tempi di esecuzioneMatrix-Matrix Multiplication
Matrice 384x384 Algoritmo Matrix Matrix Multiplication
0
2
4
6
8
10
12
14
16
18
4 9 16
numero processi
tem
po
(se
c)
BASSAMEDIAALTA
• l’aumento del numero di processi non comporta l’aumento delle prestazioni auspicabile
• con l’aumento del numero di processori, aumentano anche le comunicazioni necessarie a fornire ad ogni processo il proprio blocco di dati da computare.
Matrix-Matrix Multiplication in Parallel 30
Test – tempi di esecuzioneMatrix-Matrix Multiplication
Matrice 1920x1920 Algoritmo Matrix Matrix Multiplication
0
200
400
600
800
1000
1200
1400
1600
4 9 16
numero processi
tem
po
(se
c)
BASSA
MEDIA
ALTA
• Matrix-Matrix Multiplication non effettua il bilanciamento del carico
• Si ipotizza infatti che almeno una delle macchine coinvolte nel calcolo, sia risultata più lenta, comportando un aumento del tempo totale di calcolo
Matrix-Matrix Multiplication in Parallel 31
Test – tempi di esecuzioneCannon Algorithm
Matrice 384x384 Algoritmo Cannon
0
1
2
3
4
5
6
4 9 16
numero processi
tem
po
(se
c)
BASSA
MEDIA
ALTA
• l’algoritmo offre un significativo aumento delle prestazioni fino a 9 processi, per poi diminuire le prestazioni passando a 16
Matrix-Matrix Multiplication in Parallel 32
Test – tempi di esecuzioneCannon Algorithm
Matrice 1920x1920 Algoritmo Cannon
0
100
200
300
400
500
600
4 9 16
numero processi
tem
po
(s
ec)
BASSA
MEDIA
ALTA
• Questo comportamento viene enfatizzato con matrici di grandi dimensioni
• arriva addirittura ad impiegare lo stesso tempo utilizzando 9 oppure 16 processi
Matrix-Matrix Multiplication in Parallel 33
Test – tempi di esecuzioneProcessor Farm
Matrice 1920x1920 Algoritmo Processor Farm
0
100
200
300
400
500
600
700
800
900
4 9 16
numero processi
tem
po
(se
c)
BASSA
MEDIA
ALTA
• L’algoritmo processor farm risente meno dello sbilanciamento del carico
• il numero di comunicazioni totali dipende esclusivamente dalla dimensione della matrice
Matrix-Matrix Multiplication in Parallel 34
Test – speedupMatrice 192x192 Funzione di Granularità MEDIA
0,0
0,2
0,4
0,6
0,8
1,0
1,2
1,4
1,6
4 9 16
numero processi
spee
du
p Matrix Matrix Multiplication
Cannon Algorithm
Processor Farm
• Nei problemi semplici Matrix-Matrix Multiplication è l’unico algoritmo ad avere un andamento positivo del valore di speedup.
Matrix-Matrix Multiplication in Parallel 35
Test – speedupMatrice 1920x1920 Funzione di granularità ALTA
0
2
4
6
8
10
12
14
4 9 16
numero processi
spee
du
p Matrix Matrix Multiplication
Cannon Algorithm
Processor Farm
• In problemi onerosi, l’algoritmo Processor Farm ha una crescita con andamento lineare del valore di speedup.
Matrix-Matrix Multiplication in Parallel 36
Test – efficienza
Matrice 192x192 Funzione di granularità BASSA
0,000
0,050
0,100
0,150
0,200
0,250
0,300
0,350
4 9 16
numero processi
effi
cien
za
Matrix MatrixMultiplication
Cannon
ProcessorFarm
• Con problemi di ridotte dimensioni gli algoritmi paralleli implementati non hanno mai evidenziato valori di efficienza significativi (max≈0.3)
Matrix-Matrix Multiplication in Parallel 37
Test – efficienza
Matrice 1920x1920 Funzione granulartià ALTA
0,000
0,200
0,400
0,600
0,800
1,000
1,200
1,400
4 9 16
numero processi
effi
cien
za
Matrix MatrixMultiplication
Cannon
ProcessorFarm
• Cannon Algorithm presenta un buon valore di efficienza nel caso in cui i processi coinvolti siano pochi.
• Riteniamo più efficiente l’algoritmo Processor Farm, che tende a far rimanere il valore dell’efficienza costante
Matrix-Matrix Multiplication in Parallel 38
Test – dimensione del problema
Numero processi 16 Funzione granularità ALTA
0
100
200
300
400
500
600
700
800
900
192 384 960 1920
dimensione matrice
tem
po
(se
c)
Matrix Matrix Multiplication
Cannon Algorithm
Processor Farm
• il tempo di calcolo dell’algoritmo matrix-matrix multiplication aumenta notevolmente rispetto agli algoritmi cannon e processor farm, rendendolo praticamente inutilizzabile per la risoluzione di compiti di grande dimensione
Matrix-Matrix Multiplication in Parallel 39
Test – Complessità del problema
Matrice 1920x1920 numero processi 16
0
100
200
300
400
500
600
700
800
900
B M A
granularità
tem
po
(se
c)
Matrix Matrix Multiplication
Cannon Algorithm
Processor Farm
• l’algoritmo processor farm ha un andamento all’incirca costante al variare della granularità
• il bilanciamento del carico effettuato da questo algoritmo è sempre più efficiente all’aumentare della complessità del problema
Matrix-Matrix Multiplication in Parallel 40
Conclusioni L’algoritmo Matrix Matrix Multiplication, non si è mostrato
idoneo alla parallellizzazione, arrivando al massimo ad un efficienza pari a 0.4.
Gli algoritmi Cannon e Processor Farm hanno invece evidenziato dei tempi di esecuzione simili: Cannon algorithm ha una tendenza a far diminuire l’efficienza
all’aumentare dei processi coinvolti nel calcolo; Processor farm ha invece mantenuto invariato tale valore.
L’algoritmo che quindi è da preferire, nell’ambiente di test provato, è sicuramente Processor Farm: ha dimostrato di risolvere i calcoli in un buon tempo; di riuscire a bilanciare il carico; di non soffrire di un aumento di comunicazioni, all’aumentare nel
numero di processi coinvolti nelle fasi di calcolo.
Matrix-Matrix Multiplication in Parallel 41
Riferimenti
MPI: The Complete Reference, by Marc Snir, Steve Otto, Steven Huss-Lederman, David Walker and Jack Dongarra, The MIT Press, Cambridge, Massachusetts London, England.
Parallel Matrix Multiplication and other Full Matrix Algorithms, G. Fox, Community Grids Laboratory, Indiana University, 2005.
Introduction to Parallel Computing, 2° Ed., A. Grama, A. Gupta, G. Karypis, V. Kumar Addison-Wesley, 2003.
The C Programming Language, Kernighan, Brian W.; Dennis M. Ritchie, Prentice Hall.
http://www-unix.mcs.anl.gov/mpi/ - The Message Passing Interface (MPI) standard.
http://www.cs.mu.oz.au/498/notes/node30.html - The University of Melbourne - Department of Computer Science and Software Engineering - Cannon's algorithm.
http://www.dsi.unive.it/~calpar/ - Università Ca’Foscari, Venezia – Dipartimento di informatica - Appunti per il corso di calcolo parallelo