Traitement des données massives (INF442, A4)

  • View
    38

  • Download
    2

  • Category

    Science

Preview:

Citation preview

INF442 : Traitement des donnees massivesA4 : Algebre lineaire distribuee

Frank Nielsen

X20136 mai 2015

Frank Nielsen A6-1

Plan

un peu de MPI

produit matriciel sur la topologie du tore

la genericite avec la bibliotheque C++ STL

Frank Nielsen A6-2

MPI : pas de memoire globale !

→ memoire locale pour chaque processus, echange de messagesDifferent d’un fil de calcul (fork) avec memoire globale partagee(INF431)

i n t main ( i n t argc , cha r ∗∗ a rgv ) i n t rang , n , va r ;

i n t ∗ p t r=&va r ;MP I I n i t (&argc , &argv ) ;MPI Comm size (MPI COMM WORLD, &n ) ;MPI Comm rank (MPI COMM WORLD, &rang ) ;

∗ p t r=rang ; ( ∗ p t r )++;p r i n t f ( ”P%d va r=%d\n” , rang , va r ) ;MP I F i n a l i z e ( ) ;

P0 var =1

P2 var =3

P1 var =2

P3 var =4

Frank Nielsen A6-3

#i n c l u d e <s t d i o . h>#i n c l u d e <mpi . h>

i n t main ( i n t argc , c ha r∗∗ a rgv ) i n t rang , p , autre , taga =0, tagb=1; doub l e a , b ;MPI Status s t a t u s ; MPI Request r e qu e s t ;

MP I I n i t (&argc , &argv ) ; MPI Comm size (MPI COMM WORLD, &p ) ; MPI Comm rank (MPI COMM WORLD, &rang ) ;

i f ( p==2)

// Memoire locale de chaque processusau t r e=1−rang ; // l’autre processusa=0; b=1;p r i n t f ( ”Proc . %d au t r e=%d avant a=%f b=%f \n” , rang , autre , a , b ) ;// double swap en utilisant une operation de communication sans variable locale tmp !// on utilise en fait le buffer de communication pour tmpMPI I send(&a , 1 , MPI DOUBLE, autre , taga , MPI COMM WORLD, &r e qu e s t ) ;MPI I send(&b , 1 , MPI DOUBLE, autre , tagb , MPI COMM WORLD, &r e qu e s t ) ;p r i n t f ( ”Attendons avec MPI WAIT que l e s messages s o i e n t b i e n p a r t i s . . . \ n” ) ;MPI Wait(& reque s t , &s t a t u s ) ;// Recoit dans a le message avec tagb (donc la valeur de b)MPI Recv(&a , 1 , MPI DOUBLE, autre , tagb , MPI COMM WORLD, &s t a t u s ) ;// Recoit dans b le message avec taga (donc la valeur de a)MPI Recv(&b , 1 , MPI DOUBLE, autre , taga , MPI COMM WORLD, &s t a t u s ) ;p r i n t f ( ”Proc . %d apr e s a=%f b=%f \n” , rang , a , b ) ;

e l s ei f ( rang==0) p r i n t f ( ” Executez avec mpirun −np 2 mpiswap442 . exe ” ) ;

MP I F i n a l i z e ( ) ;

Frank Nielsen A6-4

taga=0; tagb=1;

a=0;

b=1;

Isend(a,P1,taga);

Isend(b,P1,tagb);

MPI Wait;

Recv(&a,tagb);

Recv(&b,taga);

P0

taga=0; tagb=1;

a=0;

b=1;

Isend(a,P0,taga);

Isend(b,P0,tagb);

MPI Wait;

Recv(&a,tagb);

Recv(&b,taga);

P1

0, taga

1, tagb1, tagb

0, taga

memoire locale P0 memoire locale P1

[france ~]$ mpirun -np 2 mpiswap442 .exe

Proc . 1 autre =0 avant a=0.000000 b=1.000000

Attendons avec MPI_WAIT que les messages soient bien partis ...

Proc . 0 autre =1 avant a=0.000000 b=1.000000

Attendons avec MPI_WAIT que les messages soient bien partis ...

Proc . 1 apres a=1.000000 b=0.000000

Proc . 0 apres a=1.000000 b=0.000000

Frank Nielsen A6-5

Algebre lineaire en parallele : la regression

Frank Nielsen 1.Les matrices en HPC-1.Regression A6-6

La regression lineaire

on veut predire y = f (x) avec f (x) = β0 +∑d

i=1 βixi .

les observations (xi , yi) sont dans Rd × R. Pour des classes

C0 et C1 (valeurs de y), on peut encoder y = 0 ssi. xi ∈ C0 ety = 1 ssi. xi ∈ C1

on classifie avec la regression en evaluant yi = f (xi ) puis enseuillant : xi ∈ C0 ssi. yi <

12 et xi ∈ C1 ssi. yi ≥ 1

2

on peut augmenter l’espace des donnees en rajoutant unecoordonnee x0 = 1. Ainsi x ← (x , 1) etf (x) =

∑di=0 βixi = x⊤i β (d + 1 parametres a evaluer)

l’erreur que l’on veut minimiser est les moindres carres

( Residual Sum of Squares , RSS) :

β = minβ

n∑

i=1

(yi − x⊤i β)2

Frank Nielsen 1.Les matrices en HPC-1.Regression A6-7

La regression lineaire et la classification

Frontiere de decision = hyperplan (espace affine de dimension

d − 1 dans Rd )

Frank Nielsen 1.Les matrices en HPC-1.Regression A6-8

La regression lineaire ordinaireSoit X la matrice des donnees de dimension n× (d + 1), y levecteur colonne de dimension n et β le vecteur parametre dedimension d + 1. On a la somme des differences au carre :

RSS(β) =

n∑

i=1

(yi − x⊤i β)2 = (y − Xβ)⊤(y − Xβ)

En prenant le gradient ∇βRSS(β), on trouve l’equation dite

normale ( normal equation ) :

X⊤(y − Xβ) = 0

Pour X⊤X non-singuliere, on trouve β minimisant les moindrescarres par la matrice pseudo-inverse (Penrose-Moore) :

β = (X⊤X )−1X⊤y = X †y

Frank Nielsen 1.Les matrices en HPC-1.Regression A6-9

La regression lineaire en Scilab

rand(’seed ’,getdate(’s’))

x = -30:30; a=0.8; b=5; y=a

*x+b;

// on perturbe avec un bruit

uniforme

bruit=rand(1,61,’uniform ’)

-0.5;

y = y+10*bruit;

// regression lineaire en scilab

[aa, bb] = reglin(x, y);

plot(x, y,’r+’ );

plot(x, a*x+b,’bo-’)

Frank Nielsen 1.Les matrices en HPC-1.Regression A6-10

La regression lineaire : ordinaire ou totale

x

yy = a× x

(x1, y1)

(x2, y2)

(x3, y3)

ordinary regression vs. total regression

Frank Nielsen 1.Les matrices en HPC-1.Regression A6-11

Comparaison de la classification par regression ou par

k-PPV

Classifieur sur un vecteur aleatoire = variable aleatoire ⇒ varianceet biais

Frank Nielsen 1.Les matrices en HPC-1.Regression A6-12

Comparaison de la classification par regression vs. k-PPV

regression = bon pour interpoler et extrapoler mais modelerigide avec l’hypothese globale d’une fonction lineaire f (x)(faible complexite = d + 1 parametres).⇒ grand biais et petite variance

k-PPV : modele f (x) localement constant, flexible, maisgrande complexite = d × n “parametres”.⇒ petit biais mais grande variance

Frank Nielsen 1.Les matrices en HPC-1.Regression A6-13

Algebre lineaire : les briques de base

des vecteurs colonnes :

v =

v1...vl

des matrices (square, skinny, ou fat) :

M =

m1,1 ... m1,c...

. . ....

ml ,1 ... ml ,c

plusieurs types de matrices avec leur stockage memoire :matrices denses O(lc), matrices diagonales, matricessymetriques, matrices triangulaires, matrices creuses O(l + c).Algebre multi-lineaire et tenseurs.

Frank Nielsen 1.Les matrices en HPC-1.Regression A6-14

Les operations/primitives en algebre lineaire

Soit l = c = d les dimensions des matrices et vecteurs.

le produit scalaire v1 · v2 = v⊤1 × v2 : O(d)

le produit matrice-vecteur M × v : O(d2)

le produit matrice-matrice M1 ×M2 : O(d3)

la factorisation (decomposition) LU M = L× U (pourresoudre les systemes lineaires), QR , etc.

Toutes ces primitives sont implementees dans la bibliotheque BLAS,Basic Linear Algebra Subroutines en plusieurs niveauxhttp://www.netlib.org/blas/

Frank Nielsen 1.Les matrices en HPC-1.Regression A6-15

La multiplication matricielle : un defi = probleme ouvert !

meme en sequentiel, on ne connait pas d’algorithmeoptimal !

borne inferieure : Ω(d2), nombre d’entrees de la matricecarree resultat.

meilleur algorithme connu a ce jour : O(d2.3728639) , analysefine de l’algorithme de Coppersmith et Winograd.

Le Gall, Francois (2014), “Powers of tensors and fast matrixmultiplication,” Proceedings of the 39th InternationalSymposium on Symbolic and Algebraic Computation (ISSAC2014), arXiv:1401.7714

Frank Nielsen 1.Les matrices en HPC-1.Regression A6-16

Differents motifs pour le parallelisme de donnees

acces et transmissions des donnees M et v sur un cluster demachines : depend de la topologie du reseau d’interconnexion

dispositions bloc-colonnes et bloc-colonne cycliques→ largeur b du bloc elementaire (chaque bloc tient dans lamemoire locale)

Idem si on prend les lignes (= colonnes de la matrice transposee)Frank Nielsen 1.Les matrices en HPC-2.Motifs A6-17

Differents motifs pour le parallelisme des donnees

Motif 2D bloc ligne-colonne , et 2D bloc ligne-colonne cyclique

Damier, echiquier

Frank Nielsen 1.Les matrices en HPC-2.Motifs A6-18

Le produit matrice vecteursur la topologie del’anneau oriente

Frank Nielsen 1.Les matrices en HPC-3.Produit matrice-vecteur sur l’anneau A6-19

Produit matrice-vecteur sur l’anneau : Bloc colonne 1D

En BLAS, une operation de base :

y ← y + Ax

A(i) = Ai× np:(i+1)× n

p−1,·: sous-matrice bloc ligne de dimension

n × np

y(i)← y(i) + A(i)× x(i) = y(i) +∑

j

A[i ][j]× x [j]

initialement, A(i), x(i) et y(i) sont stockes sur le processus Pi

faire tourner les sous-vecteurs x(i) sur la topologie del’anneau oriente

Frank Nielsen 1.Les matrices en HPC-3.Produit matrice-vecteur sur l’anneau A6-20

Regardons la situation pour y(1)

X1

X2

X3

X4

X1

X2

X3

X4 Y1 = A1,4 ×X4 + A1,1 ×X1

Y1 = A1,1 ×X1P1

P2

P3

P4 A4,4A4,3

A1,1

A2,2

A3,3

A1,2 A1,3 A1,4

A2,1

A3,1

A4,1 A4,2

A3,2 A3,4

A2,4A2,3

A4,4A4,3

A1,1

A2,2

A3,3

A1,2 A1,3 A1,4

A2,1

A3,1

A4,1 A4,2

A3,2 A3,4

A2,4A2,3

En fond gris, les blocs qui servent aux produits locauxy(·)← A(·, ·)x(·) + y(·)

Frank Nielsen 1.Les matrices en HPC-3.Produit matrice-vecteur sur l’anneau A6-21

X1

X2

X3

X4

X2

X1

X4

X3

Y1 = A1,3 ×X3 + A1,4 ×X4 + A1,1 ×X1

Y1 = A1,2 ×X2 + A1,3 ×X3 + A1,4 ×X4 + A1,1 ×X1

A4,4A4,3

A1,1

A2,2

A3,3

A1,2 A1,3 A1,4

A2,1

A3,1

A4,1 A4,2

A3,2 A3,4

A2,4A2,3

A4,4A4,3

A1,1

A2,2

A3,3

A1,2 A1,3 A1,4

A2,1

A3,1

A4,1 A4,2

A3,2 A3,4

A2,4A2,3

Frank Nielsen 1.Les matrices en HPC-3.Produit matrice-vecteur sur l’anneau A6-22

p r odu i tMa t r i c eV ec t eu r (A , x , y ) q = Comm rank ( ) ; // rang du processusp = Comm size ( ) ; // nombre de processusr = n/p ; // taille des blocsf o r ( s t e p =0; s tep<p ; s t e p++)

// on envoie le bloc de x sur le prochain nœud de l’anneausend ( x , r ) ; // communication non-bloquante

// calcul local : produit matrice-vecteur blocf o r ( i =0; i<r ; i++)

f o r ( j =0; j<r ; j++) y [ i ] = y [ i ] + a [ i , ( q−s t e p mod p ) r + j

] ∗ x [ j ] ;

// on recoit le bloc de x du processus precedent de l’anneaur e c e i v e ( temp , r ) ;x = temp ;

Frank Nielsen 1.Les matrices en HPC-3.Produit matrice-vecteur sur l’anneau A6-23

Produit matriciel parallele

Les algorithmes paralleles vont dependre :

des motifs des donnees

de la topologie du reseau d’interconnexion des machines

des types d’operations de communications utilises

Cout d’une communication entre deux nœuds voisins :

Temps Message = Latence + #longeur× temps par unite de longeur

Temps Message = α+ τ l

on mesure α et τ en equivalent FLOPS

efficacite : temps sequentiel/(P × temps parallele)

speed-up optimal ⇔ efficacite = 1

Frank Nielsen 1.Les matrices en HPC-4.Complexite des communications A6-24

Le produit matriciel sur un cluster de machines

C = A× B

les elements des matrices n × n sont initialement distribuessur les P processus P1, ...,PP−1

on echange par messages des matrices blocs (rappel MPI : pasde memoire partagee globale)

plusieurs motifs de decompositions : blocs de lignes blocs de colonnes blocs de damiers

les decompositions sont en rapport avec les algorithmes et lereseau d’interconnexion (graphe complet, anneau, tore)

Frank Nielsen 3.Produit matriciel A6-25

Le tore 2D

on considere√P ∈ N le cote de la grille torique a√

P ×√P = P processeurs (NB : anneau = tore 1D)

chaque processeur Pi peut communiquer avec ses 4 voisins :Nord, Sud, Est, Ouest

Frank Nielsen 3.Produit matriciel A6-26

Produit matriciel C = A× B sur le tore

initialement, les matrices sont stockes par bloc avec le motifde damier (par bloc 2D) sur le tore.

le processus Pi ,j pour i , j ∈ 1, ...,√P est responsable du

calcul de

C (i , j) =

√P

k=1

A(i , k)× B(k , j)

Plusieurs facons de transmettre les matrices blocs A(·, ·),B(·, ·) et C (·, ·).

→ nous allons voir trois principaux algorithmes

Frank Nielsen 3.Produit matriciel A6-27

Produit matriciel :l’algorithme de Cannon

Frank Nielsen 3.Produit matriciel-1.L’algorithme de Cannon A6-28

Algorithme de Cannon : vue generale

necessite des operations de pre-skewing des matrices avant

les calculs locaux et des operations de post-skewing apres cescalculs locaux

les communications des sous-matrices A et B sont desrotations horizontales (←) et des rotations verticales (↑).

Frank Nielsen 3.Produit matriciel-1.L’algorithme de Cannon A6-29

A0,0

B0,0

A0,0 A0,1 A0,2

A1,2A1,1A1,0

A2,0 A2,1 A2,2

B0,0 B0,1 B0,2

B1,2B1,1B1,0

B2,0 B2,1 B2,2

A0,1

B0,1

A0,2

B0,2

A1,0

B1,0

A2,0

B2,0

A1,1

B1,1

A2,1

B2,1

A2,2

B2,2

A1,2

B1,2

A0,0 A0,1 A0,2

A1,2A1,1 A1,0

A2,0 A2,1A2,2

B0,0

B0,1

B0,2

B1,2

B1,1

B1,0

B2,0

B2,1

B2,2

A0,1

B1,0

A0,0A0,1 A0,2

A1,2 A1,1A1,0

A2,0 A2,1 A2,2 B0,0

B0,1

B0,2

B1,2

B1,1

B1,0

B2,0

B2,1

B2,2

A0,2

B2,1

A0,0

B0,2

A1,2

B2,0

A2,0

B0,0

A1,0

B0,1

A2,1

B1,1

A2,2

B2,2

A1,1

B1,2

Initialisation

Pre-processing :

Preskewing

etape 1 :

Calculs locaux

Rotations

etape 2:

Calculs locaux

Rotations

A0,0

B0,0

A0,1

B1,1

A0,2

B2,2

A1,1

B1,0

A2,2

B2,0

A1,2

B2,1

A2,0

B0,1

A2,1

B1,2

A1,0

B0,2

Frank Nielsen 3.Produit matriciel-1.L’algorithme de Cannon A6-30

A0,2

B2,0

A0,0 A0,1A0,2

A1,2A1,1A1,0

A2,0A2,1 A2,2

B0,0

B0,1

B0,2

B1,2

B1,1

B1,0

B2,0

B2,1

B2,2

A0,0

B0,1

A0,1

B1,2

A1,0

B0,0

A2,0

B0,0

A1,1

B1,1

A2,1

B1,1

A2,0

B0,2

A1,2

B2,2

etape 3 :

Calculs locaux

Rotations

A0,0 A0,1 A0,2

A1,2A1,1 A1,0

A2,0 A2,1A2,2

B0,0

B0,1

B0,2

B1,2

B1,1

B1,0

B2,0

B2,1

B2,2A0,0

B0,0

A0,1

B1,1

A0,2

B2,2

A1,1

B1,0

A2,2

B2,0

A1,2

B2,1

A2,0

B0,1

A2,1

B1,2

A1,0

B0,2

A0,0

B0,0

A0,0 A0,1 A0,2

A1,2A1,1A1,0

A2,0 A2,1 A2,2

B0,0 B0,1 B0,2

B1,2B1,1B1,0

B2,0 B2,1 B2,2

A0,1

B0,1

A0,2

B0,2

A1,0

B1,0

A2,0

B2,0

A1,1

B1,1

A2,1

B2,1

A2,2

B2,2

A1,2

B1,2

Postprocessing:

Post-skewing

Configuration

initiale !

Frank Nielsen 3.Produit matriciel-1.L’algorithme de Cannon A6-31

// Pre-traitement des matrices A et B

// Preskew ← : elements diagonaux de A alignes

verticalement sur la premiere colonne

PreskewHorizontal(A);

// Preskew ↑ : elements diagonaux de B alignes

horizontalement sur la premiere ligne

PreskewVertical(B);

// Initialise les blocs de C a 0

C = 0;

pour k = 1 a√P faire

C ← C+ProduitsLocaux(A,B);

// decalage vers la gauche ←RotationHorizontale(A);

// decalage vers le haut ↑RotationVerticale(B);

fin

// Post-traitement des matrices A et B : operations

inverses du pre-traitement

// Preskew →PostskewHorizontal(A);

// Preskew ↓PostskewVertical(B);

Frank Nielsen 3.Produit matriciel-1.L’algorithme de Cannon A6-32

Produit matriciel :algorithme de Fox

Frank Nielsen 3.Produit matriciel-2.Algorithme de Fox A6-33

Algorithme de Fox

initialement, les donnees ne bougent pas (= pas depre-traitement)

diffusions horitonzales des diagonales de A (decalees vers ladroite)

rotations verticales de B , de bas en haut

... appele aussi algorithme broadcast-multiply-roll

Frank Nielsen 3.Produit matriciel-2.Algorithme de Fox A6-34

A0,0 A0,0 A0,0

A1,1A1,1 A1,1

A2,2 A2,2A2,2

etape 1 :Diffusion A

(premiere diagonale)Calculs locaux

etape 1’:Rotation verticalede B

A0,1

B1,0

A0,1 A0,1A0,1

A1,2A1,2A1,2

A2,0A2,0 A2,0

A0,1

B1,1

A0,1

B1,2

A1,2

B2,0

A2,0

B0,0

A1,2

B2,1

A2,0

B0,1

A2,0

B0,2

A1,2

B2,2

etape 2 :Diffusion A(deuxieme diagonale)Calcul locaux

A0,0

B0,0

A0,0

B0,1

A0,0

B0,2

A1,1

B1,0

A2,2

B2,0

A1,1

B1,1

A2,2

B2,1

A2,2

B2,2

A1,1

B1,2

B0,0 B0,1 B0,2

B1,2B1,1B1,0

B2,0 B2,1 B2,2

B1,2B1,1B1,0

B2,0 B2,1 B2,2

B0,0 B0,1 B0,2

A0,0 A0,0 A0,0

A1,1A1,1 A1,1

A2,2 A2,2A2,2

B1,2B1,1B1,0

B2,0 B2,1 B2,2

B0,0 B0,1 B0,2

Frank Nielsen 3.Produit matriciel-2.Algorithme de Fox A6-35

A0,2

B2,0

A0,2 A0,2 A0,2

A1,0A1,0A1,0

A2,1 A2,1 A2,1

A0,2

B2,1

A0,2

B2,2

A1,0

B0,0

A2,1

B1,0

A1,0

B0,1

A2,1

B1,1

A2,1

B1,2

A1,0

B0,2

etape 2’:Rotation verticalede B

etape 3:Diffusion A

(troisieme diagonale)Calculs locaux

A0,1 A0,1A0,1

A1,2A1,2A1,2

A2,0A2,0 A2,0

B2,0 B2,1 B2,2

B0,0 B0,1 B0,2

B1,2B1,1B1,0

B2,0 B2,1 B2,2

B0,0 B0,1 B0,2

B1,2B1,1B1,0

A0,0

B0,0

A0,1

B0,1

A0,2

B0,2

A1,0

B1,0

A2,0

B2,0

A1,1

B1,1

A2,1

B2,1

A2,2

B2,2

A1,2

B1,2

etape 3’:Rotation verticalede B

→ etat final

B0,0 B0,1 B0,2

B1,2B1,1B1,0

B2,0 B2,1 B2,2

Frank Nielsen 3.Produit matriciel-2.Algorithme de Fox A6-36

// Initialise les blocs de C a 0

C = 0;

pour i = 1 a√P faire

// Broadcast

Diffusion de la i -ieme diagonale de A sur les lignes de processusdu tore;

// Multiply

C ← C+ProduitsLocaux(A,B);

// Roll

// Rotation verticale : decalage vers le haut ↑RotationVerticale(B);

fin

Frank Nielsen 3.Produit matriciel-2.Algorithme de Fox A6-37

Produit matriciel :algorithme de Snyder

Frank Nielsen 3.Produit matriciel-3.Algorithme de Snyder A6-38

Produit matriciel : algorithme de Snyder

initialement, on transpose B : B ← B⊤

sommes globales (reduce) sur les lignes de processeurs

accumulation des resultats sur les diagonales principales deC (decalees a chaque etape vers la droite)

rotations verticales de bas en haut

A0,0 A0,1 A0,2

A1,0 A1,1 A1,2

A2,0 A2,1 A2,2 premiere diagonale

deuxieme diagonale

troisieme diagonale

Frank Nielsen 3.Produit matriciel-3.Algorithme de Snyder A6-39

A0,0 A0,1 A0,2

A1,2A1,1A1,0

A2,0 A2,1 A2,2

B0,0 B0,1 B0,2

B1,2B1,1B1,0

B2,0 B2,1 B2,2

Initialisation

Pre-processing :

Transpose B → B⊤

etape 1:

Calculs locaux et

accumulation sur

la premiere diagonale

de C

B0,0

B1,1

B2,2

B1,0 B2,0

B0,2

B0,1 B2,1

B1,2

C0,0

C1,1

C2,2

B⊤

A0,0 A0,1 A0,2

A1,2A1,1 A1,0

A2,0 A2,1A2,2

A0,0 A0,1 A0,2

A1,2A1,1 A1,0

A2,0 A2,1A2,2

B0,0

B1,1

B2,2

B1,0 B2,0

B0,2

B0,1 B2,1

B1,2

Frank Nielsen 3.Produit matriciel-3.Algorithme de Snyder A6-40

etape 1’:

Rotation verticale

de B

A0,0 A0,1 A0,2

A1,2A1,1 A1,0

A2,0 A2,1A2,2 B0,0 B1,0 B2,0

B1,1B0,1 B2,1

B2,2B0,2 B1,2

etape 2:

Calculs locaux et

accumulation sur

la deuxieme diagonale

de C

etape 2’:

Rotation verticale de B

A0,0 A0,1 A0,2

A1,2A1,1 A1,0

A2,0 A2,1A2,2 B0,0 B1,0 B2,0

B1,1B0,1 B2,1

B2,2B0,2 B1,2

C0,1

C1,2

C2,0

A0,0 A0,1 A0,2

A1,2A1,1 A1,0

A2,0 A2,1A2,2

B0,0 B1,0 B2,0

B1,1B0,1 B2,1

B2,2B0,2 B1,2 C0,2

C1,0

C2,1

etape 3:

Calculs locaux et

accumulation sur

la troisieme diagonale

de C

Frank Nielsen 3.Produit matriciel-3.Algorithme de Snyder A6-41

// Preskewing

Transpose B ;

// Phase de calcul

for k = 1 to√P do

// Produit scalaire ligne par ligne sur A et B

Calcule localement par bloc : C = A× B ;

// On calcule les matrices blocs definitives de Cpour la k-ieme diagonale

// Somme globale equivaut au produit scalaire

d’une ligne de A avec une ligne de B

Somme globale∑

de C sur les processeurs lignes pour lak-ieme diagonale de C ;

Decalage vertical de B ;

end

// On transpose B afin de retrouver la matrice

initiale

Transpose B ;

Frank Nielsen 3.Produit matriciel-3.Algorithme de Snyder A6-42

En resume

Le produit matriciel sur le tore :

algorithme de Cannon (pre-processing)

algorithme de Fox (broadcast-multiply-roll)

algorithme de Snyder (sommes globales)

Comparatif des trois algorithmes :

Algorithme Cannon Fox Snyder

pretraitement preskewing de A et B rien transposition B ← B⊤

produits matriciels en place en place∑

sur les lignes PEs

mouvements A gauche → droite diffusion horizontale rien

mouvements B bas → haut bas→ haut bas → haut

Frank Nielsen 3.Produit matriciel-3.Algorithme de Snyder A6-43

La bibliotheque

C++ STL :genericite

Frank Nielsen 4.STL A6-44

Les classes generiques en C++

But de la genericite = produire du code independant des

types (instancies lors de l’usage):

// returns 0 if equal, 1 if value1 is bigger, -1 otherwisei n t compare ( con s t i n t &va lue1 , con s t i n t &va l u e2 ) i f ( va l u e1 < va l u e2 ) r e t u r n −1;i f ( va l u e2 < va l u e1 ) r e t u r n 1 ;r e t u r n 0 ;// returns 0 if equal, 1 if value1 is bigger, -1 otherwisei n t compare ( con s t s t r i n g &va lue1 , con s t s t r i n g &

va l u e2 ) i f ( va l u e1 < va l u e2 ) r e t u r n −1;i f ( va l u e2 < va l u e1 ) r e t u r n 1 ;r e t u r n 0 ;

⇒ factorisation du code puis a la compilation, code polymorphiquepour les divers types requis : generation des codes specifiques pourles types demandes.

Frank Nielsen 4.STL A6-45

#i n c l u d e <i o s t ream>#i n c l u d e <s t r i n g >

// returns 0 if equal, 1 if value1 is bigger, -1 otherwiset emp l a t e <c l a s s T>i n t compare ( con s t T &va lue1 , con s t T &va l u e2 ) i f ( va l u e1 < va l u e2 ) r e t u r n −1;i f ( va l u e2 < va l u e1 ) r e t u r n 1 ;r e t u r n 0 ;

// On est gentil ici pour le compilateur :// on indique explicitement les types demandes

i n t main ( i n t argc , cha r ∗∗ argv ) s td : : s t r i n g h ( ” h e l l o ” ) , w( ” wor ld ” ) ;s t d : : cout << compare<s td : : s t r i n g >(h , w) << s td : :

end l ;s t d : : cout << compare<i n t >(10 , 20) << s td : : end l ;s t d : : cout << compare<double >(50 .5 , 5 0 . 6 ) << s td : :

end l ;r e t u r n 0 ;

Frank Nielsen 4.STL A6-46

Inference des types demandes par le compilateur#i n c l u d e <i o s t ream>#i n c l u d e <s t r i n g >

// returns 0 if equal, 1 if value1 is bigger, -1 otherwiset emp l a t e <c l a s s T>i n t compare ( con s t T &va lue1 , con s t T &va l u e2 ) i f ( va l u e1 < va l u e2 ) r e t u r n −1;i f ( va l u e2 < va l u e1 ) r e t u r n 1 ;r e t u r n 0 ;

// Le compilateur doit trouver le type demande ici :// inference de types

i n t main ( i n t argc , cha r ∗∗ argv ) s td : : s t r i n g h ( ” h e l l o ” ) , w( ” wor ld ” ) ;s t d : : cout << compare (h , w) << s td : : end l ;s t d : : cout << compare (10 , 20) << s td : : end l ;s t d : : cout << compare ( 5 0 . 5 , 5 0 . 6 ) << s td : : end l ;r e t u r n 0 ;

Frank Nielsen 4.STL A6-47

Mecanisme de compilation

le compilateur ne genere pas de code directement lorsqu’ilrencontre une classe/fonction template parce qu’il ne connaıtpas encore quelles seront les types demandes.

quand le compilateur rencontre une fonction template

utilisee, il sait quel type est demande : Il instancie alors letemplate et compile le code correspondant

⇒ les classes/fonctions templates doivent donc se trouver dans lefichier d’en-tete, header .hLe mecanisme de template ressemble donc a une macroexpansion...

Frank Nielsen 4.STL A6-48

fichier compare.h :

#i f n d e f COMPARE H#de f i n e COMPARE H

temp l a t e <c l a s s T> i n t comp ( con s t T& a , con s t T& b )

i f ( a < b ) r e t u r n −1;i f ( b < a ) r e t u r n 1 ;r e t u r n 0 ;

#en d i f // COMPARE H

fichier main.cpp :

#i n c l u d e <i o s t ream>#i n c l u d e ”compare . h”u s i n g namespace s td ;

i n t main ( i n t argc , cha r ∗∗ argv ) cout << comp<i n t >(10 , 20) ; cout << end l ;r e t u r n 0 ;

Frank Nielsen 4.STL A6-49

Lire un fichier dans un vector de la STLVous avez deja utilise la classe vector de la STL ! (tableauxdynamiques)

i f s t r e am f i n ;f i n . open ( ” f i c h i e r . t x t ” ) ;v ec to r<s t r i n g > t e x t e ; s t r i n g mote ;

wh i l e ( f i n >> mot ) t e x t e . push back (mot ) ;

f i n . c l o s e ( ) ;

La boucle while lit jusqu’a temps de rencontrer EOF (EndOf File)

Les donnees sont des chaınes de caracteres separees par desdelimiteurs (espace, tab, retour a la ligne, point virgule pourles fichiers CSV, Comma-Separated Values)

Frank Nielsen 4.STL A6-50

STL : une collection de structures de donnees

Le concept fondamental est le containeur avec son iterator , letout en template !

Structure de donnees nom STL #include

tableau dynamique vector <vector>

liste chaınee list <list>

pile stack <stack>

file queue <queue>

arbre binaire set <set>

table de hachage map <set>

tas ordonne file de priorite <queue>

Les #include sont a faire sans le .h

Frank Nielsen 4.STL A6-51

La STL : structures de donnees generiques

se t<s t r i n g > mots ;l i s t <Eleve> PromoX2013 ;s tack< vec to r<i n t> > nombres ;

A chaque container STL, on a un iterateur (iterator) associe detype container<T>::iterator

se t<s t r i n g > : : i t e r a t o r p=mots . f i n d ( ” cou r s ” ) ;l i s t <Eleve > : : i t e r a t o r p r em i e r=PromoX2013 . beg i n

( ) ;s tack< vec to r<i n t> > : : i t e r a t o r f i n=nombres . end

( ) ;

On dereference un iterateur comme pour un pointeur : *it

Frank Nielsen 4.STL A6-52

Les containeurs stockent par valeur, pas par reference

quand on insere un objet, le containeur va en faire une copie

quand le containeur doit rearranger les objets, il procede enfaisant des copies de ceux-ci. Par exemple, si on tri, ou si oninsere sur un containeur map, etc.

si on veut eviter cela, il faudra donc faire des containeurs depointeurs !

C++11 a le mot clef auto pour inferer directemement les types etun “foreach” (pour les curieux !) :

f o r ( ve c to r<Pr i n t e r > : : i t e r a t o r i t = vec . b eg i n ( ) ; i t< vec . end ( ) ; i t++) cout << ∗ i t << end l ;

f o r ( auto i t = vec . b eg i n ( ) ; i t < vec . end ( ) ; i t ++) cout << ∗ i t << end l ;

s td : : s t r i n g s t r ( ”Bonjour INF442” ) ; f o r ( auto c :s t r ) s td : : cout << c << end l ;

Frank Nielsen 4.STL A6-53

Fonctions membres communes a la STL

Toutes les classes containeurs ont les fonctions membres :

i n t s i z e ( )i t e r a t o r beg i n ( )i t e r a t o r end ( )boo l empty ( )

Pour lister tous les elements d’un containeur, on fait :

l i s t <s t r i n g > : : i t e r a t o r i t=maLi s t e . b eg i n ( ) ;wh i l e ( i t !=maLi s t e . end ( ) ) cout << ∗ i t<<end l ; i t e r ++;

Notons que end() est un element sentinel . On ne peut pasdereferencer end().

Frank Nielsen 4.STL A6-54

Differents acces aux elements d’un containeur

pour vector, on peut acceder aux elements en utilisant unindex [i ] :

v e c to r<i n t> vec442<double >;vec442 [0 ]=280 ;

... mais les crochets ne peuvent pas etre utilises pourlist<int> par exemple

on peut rajouter un element a la fin d’une liste ou d’unvecteur avec push back :

monVecteur . push back (2013) ;maL i s t e . push back (2013) ;

... mais il n’ y a pas de push_back pour les ensembles (codespar des arbres binaires) :

s e t<i n t> monEnsemble ;monEnsemble . push back (2013) ; // Erreur !!!

Frank Nielsen 4.STL A6-55

La liste (doublement chaınee)

On peut ajouter a la tete ou a la queue d’une liste en temps

constant :

maL i s t e . push back (2013) ;maL i s t e . p u s h f r o n t (2015) ;

On peut inserer ou supprimer un element avec un iterateur :

l i s t <s t r i n g > : : i t e r a t o r p=maLi s te . b eg i n ( ) ;p=maLi s te . e r a s e ( p ) ;p=maLi s te . i n s e r t ( p , ”HPC” ) ;

On peut avancer ou reculer dans une liste avec les operateursunaires ++ et -- :

p++; p−−; // faire attention aux debordements possibles

Seul bemol : on ne peut pas directement acceder i -ieme element(cela demande de parcourir la liste, pas de crochets).

Frank Nielsen 4.STL A6-56

La liste doublement chaınee en STL

Voir INF311/INF411

NULL

NULL

C++ HPC MPI

list<string>::iterator it=liste.find("HPC")

q=it-- q=it++

Frank Nielsen 4.STL A6-57

Les piles et les files

Piles ( stacks ) et files ( queues ) sont des sous-classes de laclasse deque

Une pile est une liste chaınee avec la propriete Dernier ArrivePremier Sorti, DAPS (LIFO : Last In First Out).

Une file est une liste chaınee avec la propriete Premier ArrivePremier Sorti, PAPS (FIFO : First In First Out).

On accede au dernier eleement au sommet de la pile ou aupremier element d’une file avec les primitives push et pop

Pour les piles, on a aussi top, et pour les files front et back

Frank Nielsen 4.STL A6-58

Les piles : illustration

s tack<s t r i n g > S ;S . push ( ”A” ) ;S . push ( ”B” ) ;S . push ( ”C” ) ;S . pop ( ) ;Q. pop ( ) ;S . push ( ”D” ) ;Q. push ( ”D” ) ;cout << S . top ( ) ;

Frank Nielsen 4.STL A6-59

Les files : illustration

queue<s t r i n g > Q;Q. push ( ”A” ) ;Q. push ( ”B” ) ;Q. push ( ”C” ) ;Q. pop ( ) ;Q. push ( ”D” ) ;cout << Q. f r o n t ( ) << Q. back ( ) ;

Frank Nielsen 4.STL A6-60

Les files de priorite

On doit definir un operator < .

La plus grande valeur est sur le haut (max-heap, top).

p r i o r i t y q u e u e <i n t> Q;Q. push (23) ; Q. push (12) ; Q. push (71) ; Q. push (2) ;cout << Q. top ( ) ;Q. pop ( ) ;cout << Q. top ( ) ;

pour la plus petite valeur (min-heap), il faut donc changer le senssemantique de l’operateur < ...

http://en.cppreference.com/w/cpp/language/operator_comparison

Frank Nielsen 4.STL A6-61

On peut trier facilement avec une file de priorite...

#i n c l u d e <queue>#i n c l u d e <i o s t ream>u s i n g namespace s td ;

s t r u c t comparator boo l o p e r a t o r ( ) ( i n t i , i n t j ) r e t u r n i < j ;

;

i n t main ( i n t argc , cha r con s t ∗ argv [ ] )

p r i o r i t y q u e u e <i n t , s t d : : v e c to r<i n t >,comparator> minHeap ;

minHeap . push (10) ; minHeap . push (5 ) ;minHeap . push (12) ; minHeap . push (3 ) ;minHeap . push (3 ) ; minHeap . push (4 ) ;

wh i l e ( ! minHeap . empty ( ) ) cout << minHeap . top ( ) << ” ” ;minHeap . pop ( ) ;

r e t u r n 0 ; // 12 10 5 4 3 3

Frank Nielsen 4.STL A6-62

Les ensembles : set (arbres binaires equilibres)

On doit definir operator <. Toutes les valeurs sont uniques

(sinon, utiliser un multiset).insert(value), erase(value), erase(iterator),iterator find(value)

se t<s t r i n g > s ;s . i n s e r t ( ” Eco l e ” ) ;s . i n s e r t ( ” Po l y t e chn i q u e ” ) ;s . e r a s e ( ” Eco l e ” ) ;cout << ∗( s . f i n d ( ” Po l y t e chn i q u e ” ) ) ;

Frank Nielsen 4.STL A6-63

Le hachage (map)

Difference entre hachage ferme (tableau) et hachage ouvert(tableau de pointeurs sur des listes).

Templates pour la clef et le type de donnees map<K,T>.

On doit definiroperator < pour le type K.

map<i n t , s t r i n g > monHachage ;monHachage [23121981 ] = ” A n n i v e r s a i r e Toto” ;monHachage [05031953 ] = ” A n n i v e r s a i r e T i t i ” ;. . .map<s t r i n g , i n t> monHachageRev ;monHachageRev [ ”Toto” ] = 23121981;monHachageRev [ ” T i t i ” ] = 05031953;

Frank Nielsen 4.STL A6-64

Le hachage (map)

Les fonctions membres pour la classe STL map :erase(iterator), erase(K clef), map_name(K key)

map<s t r i n g , i n t> M;M[ ”A” ] = 23 ;M[ ”B” ] = 12 ;M[ ”C” ] = 71 ;M[ ”D” ] = 5 ;M. e r a s e ( ”D” ) ;cout << M[ ”B” ] ;

Frank Nielsen 4.STL A6-65

La classe STL paire a la rescousse

map<s t r i n g , i n t> maMap;pa i r<s t r i n g , i n t> p a i r e ( ”Tutu” , 606) ;maMap. i n s e r t ( p a i r e ) ;. . .// on cree un nouvel enregistrement en faisant aussi :maMap[ ”Tata” ] = 707;

⇒ operateur crochet [K]

Frank Nielsen 4.STL A6-66

Les temps d’acces aux structures de donnees

Pour un containeur a n elements :

vecteur list set map

Inserer/supprimer O(n) O(1) O(log n) O(1)

Rechercher O(n) O(n) O(log n) O(1)

Voir INF311/INF411.

Frank Nielsen 4.STL A6-67

Les iterateurs

Chaque containeur est equippe d’un iterateur :

c on t a i n e r<T> : : i t e r a t o r i t ;i t=C . beg i n ( ) ;

++ et -- pour avancer ou reculer

* pour dereferencer

== et =! pour les tests de comparaisons

Seulement dans la classe vector, on peut bouger de p elements(arithmetique) en faisant

v ec to r<T> : : i t e r a t o r i t ;i t=i t+p ;i t=i t−p ;

Frank Nielsen 4.STL A6-68

Les iterateurs : premier et dernier elements

Le dernier element est une sentinelle :

cout << ∗( L . beg i n ( ) ) ; // oui, si pas vide !cout << ∗( L . end ( ) ) ; // toujours non !

l i s t <s t r i n g > : : i t e r a t o r p = L . end ( ) ;p−−;cout << ∗p ; // ok, si pas vide !

Frank Nielsen 4.STL A6-69

La classe STL algorithm

Procedures (pas des methodes de classe) : find, remove, count,shuffle, replace, sort, for each, min element,binary search, transform, copy, swap :

i t e r = f i n d (L . beg i n ( ) , L . end ( ) , ” Cours INF442”) ;

i n t x = count (L . beg i n ( ) , L . end ( ) , ” i n s c r i t enINF442” ) ;

r e p l a c e (L . beg i n ( ) , L . end ( ) , ”DEP442” , ” INF442”) ;

if : prend une fonction booleene utilisateur :

r e p l a c e i f (L . begin , L . end ( ) , appa r t i en t442S , ”Tutora t ” ) ;

Frank Nielsen 4.STL A6-70

La bibliothequeBoost

Frank Nielsen 5.Boost uBLAS A6-71

Boost

un ensemble de bibliotheques qui se comportent bien avec laSTL :http://www.boost.org/

liste des bibliotheques de Boost :http://www.boost.org/doc/libs/

Graph BGL generic graph componentsMPI MPI interface in Boost styleRational rational number classThread Portable multi-threadinguBlas linear algebra for vector/matrixXpressive regular expression

Installe dans le repertoire /usr/local/boost-1.56.0

Frank Nielsen 5.Boost uBLAS A6-72

Boost : la bibliotheque uBLAS

#i n c l u d e <boos t / numer ic / ub l a s /mat r i x . hpp>#i n c l u d e <boos t / numer ic / ub l a s / i o . hpp>u s i n g namespace s td ;u s i n g namespace boos t : : numer ic : : u b l a s ;

i n t main ( ) matr ix<double> m (3 , 3) ;f o r ( un s i gned i = 0 ; i < m. s i z e 1 ( ) ; ++ i )

f o r ( un s i gned j = 0 ; j < m. s i z e 2 ( ) ;++ j )m ( i , j ) = i + j ∗ j ;

cout << m << end l ;

Frank Nielsen 5.Boost uBLAS A6-73

Boost : la bibliotheque uBLAS

alias mpiboost =’/usr/local/openmpi -1.8.3/ bin

/mpic++ -I/usr/local/boost -1.56.0/ include

/ -L/usr/local/boost -1.56.0/ lib/ -

lboost_mpi -lboost_serialization ’

mpiboost matrice442.cpp -o matrice442.exe

mpirun -np 1 matrice442.exe

[3 ,3]((0 ,1 ,4) ,(1,2,5) ,(2,3,6))

http://www.boost.org/doc/libs/1_58_0/libs/numeric/ublas/doc/

Frank Nielsen 5.Boost uBLAS A6-74

# i n c l u d e <boos t / numer ic / ub l a s /mat r i x . hpp># i n c l u d e <boos t / numer ic / ub l a s / i o . hpp># i n c l u d e <boos t / numer ic / ub l a s /mat r i x . hpp>u s i n g namespace boos t : : numer ic : : u b l a s ;u s i n g namespace s td ;i n t main ( ) mat r i x <doub l e > myMat (3 ,3 , 2 . 5 ) ;myMat (0 , 0 )= myMat (2 , 2 ) =1.0 ;myMat (0 , 2 )= −3.6; myMat (2 , 0 ) =5.9 ;cout << ”My Mat : ” << myMat << end l ;cout << ”Num Rows : ” << myMat . s i z e 1 ( ) << end l ;cout << ”Num Co l s : ” << myMat . s i z e 2 ( ) << end l ;cout << ”My Mat Transp : ” << t r a n s (myMat ) << end l

;cout << ”My Mat Rea l Par t : ” << r e a l (myMat ) <<

end l ;myMat . r e s i z e (4 , 4 ) ;cout << ”My Res i z ed Mat : ” << myMat << end l ;r e t u r n 0 ;

Frank Nielsen 5.Boost uBLAS A6-75

mat r i x <doub l e > myMat (3 ,3 , 2 . 5 ) ;myMat (0 ,0 )= myMat (2 ,2 ) =1.0;myMat (0 ,2 )= −3.6; myMat (2 ,0 ) =5.9;

mpirun -np 1 matricefun442.exe

My Mat :[3 ,3]((1 ,2.5 , -3.6) ,(2.5 ,2.5 ,2.5)

,(5.9,2.5,1))

Num Rows :3

Num Cols :3

My Mat Transp :[3,3]((1,2.5,5.9)

,(2.5 ,2.5 ,2.5) ,(-3.6,2.5,1))

My Mat Real Part :[3 ,3]((1 ,2.5 , -3.6)

,(2.5 ,2.5 ,2.5) ,(5.9,2.5,1))

My Resized Mat :[4,4]((1,2.5, -3.6,3.57355e

-115) ,(2.5,2.5,2.5,2.02567e-322)

,(5.9,2.5,1,0) ,(0,0,0,0))

Frank Nielsen 5.Boost uBLAS A6-76

Resume A4

X la classification par regression lineaire (et comparaison avec leclassifieur k-PPV)

X le produit matrice-vecteur sur l’anneau oriente

X produits matriciels sur le tore : algorithmes de Cannon(pre-processing), de Fox (broadcast-multiply-roll) et de Snyder(sommes globales)

X la genericite avec la bibliotheque C++ STL

X la bibliotheque Boost uBLAS

Pour la prochaine fois : lire le chapitre 5 du polycopie

Frank Nielsen 5.Boost uBLAS A6-77

Recommended