Vous êtes sur la page 1sur 117

GTI320 - Automne 2023

Cours 1 : Calculs matriciel

Sheldon Andrews et Xavier Provençal


Plan de la séance
1 Scalaires, vecteurs et matrices
Définitions, notations et conventions
Opérations sur les vecteurs
Les normes
Espaces vectoriels
2 Matrices
Multiplication matrice-vecteur
Multiplication matrice-matrice
Matrices remarquables
3 Stockage en mémoire
Ligne vs colonne
4 Exercices
5 Devoirs
Définitions
Dans ce cours, on appelle scalaire un nombre réel. Ex. : a = 0, b = π.
L’ensemble des nombres réels est noté R.
Dans nos programmes, un scalaire sera soit un float, un double.

3 / 49
Définitions
Dans ce cours, on appelle scalaire un nombre réel. Ex. : a = 0, b = π.
L’ensemble des nombres réels est noté R.
Dans nos programmes, un scalaire sera soit un float, un double.
Un vecteur est un tableau unidimensionnel de scalaire.
Ex. :  
−1  2 
π
a =  0 , b = .
6
−4

3 / 49
Définitions
Dans ce cours, on appelle scalaire un nombre réel. Ex. : a = 0, b = π.
L’ensemble des nombres réels est noté R.
Dans nos programmes, un scalaire sera soit un float, un double.
Un vecteur est un tableau unidimensionnel de scalaire.
Ex. :  
−1  2 
π
a =  0 , b = .
6
−4
Une matrice est une tableau bidimensionnel de scalaires.
Ex. :  
3 −3.5 5.3  
0 1 1 0
A= 1 0 3 , B = .
1 1 0 0
π 4 −4.1
3 / 49
Notations et conventions
Scalaire
Un nombre, un coefficient, une seule valeur.
Convention : lettre minuscule en italique.
a ∈ R.

4 / 49
Notations et conventions
Scalaire
Un nombre, un coefficient, une seule valeur.
Convention : lettre minuscule en italique.
a ∈ R.

Vecteur
Tableau de n scalaires.
Convention : on représente les vecteurs en colonne.
Convention : lettre minuscule en gras.
 
a1
 a2 
a =  .  ∈ Rn .
 
 .. 
an
ai est la i-ième entrée du vecteur a.
4 / 49
Scalaires, vecteurs et matrices

Matrice
Tableau de m lignes et n colonnes.
Convention : lettre majuscule en gras.
 
a11 a12 · · · a1n
 a21 a22 · · · a2n 
A= ..  ∈ Rm×n .
 
.. .. . .
 . . . . 
am1 am2 · · · amn
aij est l’entrée en ligne i et colonne j.
(Truc : toujours ligne avant colonne.)

5 / 49
Opérations sur les vecteurs
Multiplication par un scalaire :
   
v1 av1
 v2   av2 
av = a  =
   
.. .. 
 .   . 
vn avn

Addition de vecteurs :
     
u1 v1 u1 + v1
 u2   v2   u2 + v2 
u+v = + = .
     
.. .. ..
 .   .   . 
un vn un + vn

6 / 49
Opérations sur les vecteurs

Le produit scalaire (dot product) de deux vecteurs de même dimension


est :    
u1 v1
 u2   v2 
u · v =  ..  ·  ..  = u1 v1 + u2 v2 + · · · + un vn .
   
 .   . 
un vn

Le produit vectoriel (cross product) de deux vecteurs de dimension 3


est :      
u1 v1 u2 v3 − u3 v2
u × v =  u2  ×  v2  =  u3 v1 − u1 v3 
u3 v3 u1 v2 − u2 v1

7 / 49
Propriétés du produit scalaire

Commutatif : u · v = v · u.

8 / 49
Propriétés du produit scalaire

Commutatif : u · v = v · u.

Distributif sur l’addition : u · (v + w) = u · v + u · w.

8 / 49
Propriétés du produit scalaire

Commutatif : u · v = v · u.

Distributif sur l’addition : u · (v + w) = u · v + u · w.

Se combine avec la multiplication par un scalaire : (ku)·v = u·(kv) = k(u·v).

8 / 49
Propriétés du produit scalaire

Commutatif : u · v = v · u.

Distributif sur l’addition : u · (v + w) = u · v + u · w.

Se combine avec la multiplication par un scalaire : (ku)·v = u·(kv) = k(u·v).

Mesure la similarité ou le parallélisme entre deux vecteurs :


u · v = kukkvk cos(θ),
où θ est l’angle formé par les deux vecteurs.

8 / 49
Les normes

Une norme permet de calculer la longueur d’un vecteur.

Convention : représentée par doubles barres : k k.

Il n’y a pas qu’une seule façon de faire. . .

9 / 49
Les normes

Une norme permet de calculer la longueur d’un vecteur.

Convention : représentée par doubles barres : k k.

Il n’y a pas qu’une seule façon de faire. . .

Propriétés :
Pour tout vecteur a ∈ Rn , kak ≥ 0.

kak = 0 si et seulement si a = 0.

kkak = |k|kak.

ka + bk ≤ kak + kbk.

9 / 49
Les normes

Exemples :
q
La norme-2 dite “euclidienne” : kak2 = a21 + a22 + · · · + a2n

La norme-1 dite “de Manhattan” : kak1 = |a1 | + |a2 | + · · · + |an |

La norme-∞ : kak∞ = max(|a1 |, |a2 |, . . . , |an |)

10 / 49
Les normes

Exemples :
q
La norme-2 dite “euclidienne” : kak2 = a21 + a22 + · · · + a2n

La norme-1 dite “de Manhattan” : kak1 = |a1 | + |a2 | + · · · + |an |

La norme-∞ : kak∞ = max(|a1 |, |a2 |, . . . , |an |)

p
p
La norme-p : kakp = |a1 |p + |a2 |p + · · · + |an |p

10 / 49
Les normes

Exemples :
q
La norme-2 dite “euclidienne” : kak2 = a21 + a22 + · · · + a2n

La norme-1 dite “de Manhattan” : kak1 = |a1 | + |a2 | + · · · + |an |

La norme-∞ : kak∞ = max(|a1 |, |a2 |, . . . , |an |)

p
p
La norme-p : kakp = |a1 |p + |a2 |p + · · · + |an |p

10 / 49
Vecteurs unitaires

Un vecteur de norme 1 est dit unitaire.

En dimension 2 et 3, un vecteur unitaire correspond à une direction.

Notation : étant donné un vecteur a, on note â le vecteur unitaire qui


pointe dans la même direction que a.

11 / 49
Vecteurs unitaires

Un vecteur de norme 1 est dit unitaire.

En dimension 2 et 3, un vecteur unitaire correspond à une direction.

Notation : étant donné un vecteur a, on note â le vecteur unitaire qui


pointe dans la même direction que a.

On peut donc séparer un vecteur en deux informations :

a = aâ

où a ∈ R est la magniture, et â ∈ Rn (avec kâk = 1) est la direction.

11 / 49
Vecteurs unitaires

Soit a un vecteur de magniture a et de direction â,

a = kak (la magnitude est la norme).

a
â = kak (calcul de la direction de a)

12 / 49
Espaces vectoriels

Tout objet qui est représentable par une liste de nombres peut être vu
comme un vecteur.

Si ces objets satisfont certaines règles (addition, multiplication par un


scalaire, . . . ) ont dit qu’ils forment un espace vectoriel.

13 / 49
Espaces vectoriels

Tout objet qui est représentable par une liste de nombres peut être vu
comme un vecteur.

Si ces objets satisfont certaines règles (addition, multiplication par un


scalaire, . . . ) ont dit qu’ils forment un espace vectoriel.

Exemple : les polynômes de degrés n sont de la forme :

p(x) = a0 + a1 x + a2 x2 + · · · + an xn

Un tel polynôme est entièrement déterminé par la liste (ordonnée) de


nombres (a0 , a1 , . . . , an ). L’ensemble des polynômes de degrés n forment un
espace vectoriel de dimension n + 1.

13 / 49
Espaces vectoriels

Exemples d’espaces vectoriels :

Les points de R2 ou de R3 .

Les déplacements entre deux points d’un même


espace.

Les vélocités.

14 / 49
Espaces vectoriels

p1

Exemples d’espaces vectoriels :


p2
Les points de R2 ou de R3 .

Les déplacements entre deux points d’un même


espace.
p0
Les vélocités.

14 / 49
Espaces vectoriels

p1

Exemples d’espaces vectoriels :


d12 p2
Les points de R2 ou de R3 .

Les déplacements entre deux points d’un même


espace.
p0
Les vélocités.

14 / 49
Espaces vectoriels
v1
p1

Exemples d’espaces vectoriels :


d12 p2
Les points de R2 ou de R3 .

Les déplacements entre deux points d’un même


v0 v2
espace.
p0
Les vélocités.

14 / 49
1 Scalaires, vecteurs et matrices
Définitions, notations et conventions
Opérations sur les vecteurs
Les normes
Espaces vectoriels
2 Matrices
Multiplication matrice-vecteur
Multiplication matrice-matrice
Matrices remarquables
3 Stockage en mémoire
Ligne vs colonne
4 Exercices
5 Devoirs

15 / 49
Multiplication matrice-vecteur

Si A ∈ Rm×n et u ∈ Rn alors, le produit Au est :


    
a11 a12 · · · a1n u1 a11 u1 + a12 u2 + · · · + a1n un
 a21 a22 · · · a2n   u2   a21 u1 + a22 u2 + · · · + a2n un 
..   ..  =   ∈ Rn
    
 .. .. . . ..
 . . . .  .   . 
am1 am2 · · · amn vn am1 u1 + am2 u2 + · · · + amn un

16 / 49
Multiplication matrice-vecteur

Si A ∈ Rm×n et u ∈ Rn alors, le produit Au est :


    
a11 a12 · · · a1n u1 a11 u1 + a12 u2 + · · · + a1n un
 a21 a22 · · · a2n   u2   a21 u1 + a22 u2 + · · · + a2n un 
..   ..  =   ∈ Rn
    
 .. .. . . ..
 . . . .  .   . 
am1 am2 · · · amn vn am1 u1 + am2 u2 + · · · + amn un

Deux manières de calculer un tel produit :


Multiplication par lignes.
Multiplication par colonnes.

16 / 49
Multiplication par lignes
Notation : on note Lignei (A) la i-ième ligne de la matrice A.

Soit v = Au, on calcule la i-ième entrée de v en faisant le produit scalaire


de la i-ième ligne de A et du vecteur u.
   
v1 Ligne1 (A) · u
v =  ...  =  ..
.
   
.
vm Lignem (A) · u

Algorithme :

Input : A ∈ Rm×n et u ∈ Rn
Output : v ∈ Rm
pour i de 1 à m faire
vi = Lignei (A) · u // produit scalaire
17 / 49
Multiplication par colonnes

Notation : on note Coli (A) la i-ième colonne de la matrice A.

Soit v = Au, on calcule la v en faisant la somme des vecteurs obtenus en


multipliant la i-ième colonne de A par le scalaire ui .

v = Col1 (A) u1 + Col2 (A) u2 + · · · + Coln (A) un .

Algorithmes :

Input : A ∈ Rm×n et u ∈ Rn
Output : v ∈ Rm
v=0 // v est un vecteur
pour i de 1 à n faire
v = v + Coli (A) ui // ui est un scalaire

18 / 49
Multiplication matrice-matrice

Si A ∈ Rm×n , B ∈ Rn×p et C ∈ Rm×p alors, le produit :

C = AB

signifie que :
cij = Lignei (A) · Colj (B) .

19 / 49
Multiplication matrice-matrice

Si A ∈ Rm×n , B ∈ Rn×p et C ∈ Rm×p alors, le produit :

C = AB

signifie que :
cij = Lignei (A) · Colj (B) .

ATTENTION !!! Le produit de matrices n’est pas commutatif. En


général :
AB 6= BA.

19 / 49
Transposée d’une matrice
|
La transposée d’une matrice A ∈ Rm×n est A ∈ Rn×m , la matrice
obtenue en échangeant mes lignes et les colonnes.

 
  a11 a21 · · · am1
a11 a12 a13 · · · a1n  a12 a22 · · · am2 
 a21 a22 a23 · · · a2n 
|
 
A =  ..

.. .. .. .. ,

A =
 a13 a23 · · · am3 

 . . . . .  .. .. .. .. 
.

 . . . 
am1 am2 am3 · · · amn
a1n a2n · · · amn

20 / 49
Transposée d’une matrice
|
La transposée d’une matrice A ∈ Rm×n est A ∈ Rn×m , la matrice
obtenue en échangeant mes lignes et les colonnes.

 
  a11 a21 · · · am1
a11 a12 a13 · · · a1n  a12 a22 · · · am2 
 a21 a22 a23 · · · a2n 
|
 
A =  ..

.. .. .. .. ,

A =
 a13 a23 · · · am3 

 . . . . .  .. .. .. .. 
.

 . . . 
am1 am2 am3 · · · amn
a1n a2n · · · amn

Remarques :
La diagonale ne change pas.
La taille de la matrice change lorsque m 6= n.
| | |
(AB) = B A .
20 / 49
Vecteur en tant que matrice

 
v1
On considère parfois un vecteur  ...  ∈ Rn comme une matrice de Rn×1 .
 
vn

21 / 49
Vecteur en tant que matrice

 
v1
On considère parfois un vecteur  ...  ∈ Rn comme une matrice de Rn×1 .
 
vn

Étant donné, deux vecteur u, v ∈ Rn , le produit scalaire peut être exprimé


|
en terme de produit matriciel : u · v = u v (abus de notation).

21 / 49
Matrice symétrique

Une matrice symétrique est une matrice carrée égale à sa transposée.


|
A = A ∈ Rn×n

Ainsi, pour tout i et pour tout j, on a : aij = aji .

22 / 49
Matrice diagonale

Une matrice diagonale est une matrice carrée dont tout les éléments en
dehors de la diagonale sont nuls.
 
a11 0 0 ··· 0
 0 a22 0 · · · 0 
 
A= 0 0 a33 0 


 .. .. . . 
 . . . 0 
0 0 · · · 0 ann

Un matrice diagonale est forcément symétrique.

23 / 49
Matrice diagonale

Le produit d’une matrice diagonale avec un vecteur est particulièrement


simple (et rapide) à calculer.
    
a11 0 0 ··· 0 u1 a11 u1
 0 a22 0 · · · 0   u2   a22 u2 
    
 0 0 a33 0 
  u3  =  a33 u3 
   

 .. .. ..  .   ..
. 0   ..  

 . . . 
0 0 · · · 0 ann un ann un

Chaque coefficient du vecteur en multiplié par la valeur correspondante de la


diagonale.
Chaque coordonnée est traitée indépendamment.

24 / 49
Matrice identité

La matrice identité est une matrice diagonale dont tous les éléments de la
diagonale sont 1.
Par exemple, la matrice identité 3 × 3 est :
 
1 0 0
I3×3 =  0 1 0 
0 0 1

Propriétés :
Pour tout vecteur v ∈ Rn , on a In×n v = v.

Pour toute matrice A ∈ Rm×n , on a Im×m A = AIn×n = A.

25 / 49
Inverse d’une matrice

Une matrice A est inversible s’il existe une matrice A−1 telle que :

AA−1 = I

26 / 49
Inverse d’une matrice

Une matrice A est inversible s’il existe une matrice A−1 telle que :

AA−1 = I

Propriétés :
Seules les matrices carrées peuvent être inversibles.
Lorsqu’elle existe, la matrice inverse est unique.
(A−1 )−1 = A.
(AB)−1 = B−1 A−1 .
| |
(A )−1 = (A−1 ) .

26 / 49
Inverse d’une matrice

Inverse d’une matrice 2 × 2 :


 −1  
a b 1 d −b
=
c d ad − bc −c a

Ici on dispose d’une expression algébrique pour l’inverse.

Nombre de FLOP (Floating Point OPerations) :

27 / 49
Inverse d’une matrice

Inverse d’une matrice 2 × 2 :


 −1  
a b 1 d −b
=
c d ad − bc −c a

Ici on dispose d’une expression algébrique pour l’inverse.

Nombre de FLOP (Floating Point OPerations) : 8


(on change le signe simplement en inversant un bit)

27 / 49
Inverse d’une matrice

Inverse d’une matrice 2 × 2 :


 −1  
a b 1 d −b
=
c d ad − bc −c a

Ici on dispose d’une expression algébrique pour l’inverse.

Nombre de FLOP (Floating Point OPerations) : 8


(on change le signe simplement en inversant un bit)

Lors que n grandit, calculer l’inverse d’une matrice n × n demande


beaucoup de calculs.

27 / 49
Inverse d’une matrice diagonale

Même pour un n très grand, inverser une matrice diagonale n × n est très
simple :
 −1
a11 0 0 0
 0 a22 0 0 
 =
 

 0 ...
0 0 
0 0 0 ann

28 / 49
Inverse d’une matrice diagonale

Même pour un n très grand, inverser une matrice diagonale n × n est très
simple :
 −1  1 
a11 0 0 0 a11
0 0 0
 0 1
 0 a22 0 0  a22
0 0 
=
   

 0 ...   ... 
0 0   0 0 0 
1
0 0 0 ann 0 0 0 ann

L’inverse existe si et seulement tous les aii sont non nuls.

28 / 49
1 Scalaires, vecteurs et matrices
Définitions, notations et conventions
Opérations sur les vecteurs
Les normes
Espaces vectoriels
2 Matrices
Multiplication matrice-vecteur
Multiplication matrice-matrice
Matrices remarquables
3 Stockage en mémoire
Ligne vs colonne
4 Exercices
5 Devoirs

29 / 49
Pourquoi deux versions pour v = Au ?
Pour une matrixe A ∈ Rm×n , quelle version est la plus rapide ?

Version ligne Version colonne

pour i de 1 à m faire pour i de 1 à n faire


vi = Lignei (A) · u v = v + Coli (A) ui

30 / 49
Pourquoi deux versions pour v = Au ?
Pour une matrixe A ∈ Rm×n , quelle version est la plus rapide ?

Version ligne Version colonne

pour i de 1 à m faire pour i de 1 à n faire


vi = Lignei (A) · u v = v + Coli (A) ui

Une itération effectue :


n multiplications.
n additions.
Total : 2mn flops.

30 / 49
Pourquoi deux versions pour v = Au ?
Pour une matrixe A ∈ Rm×n , quelle version est la plus rapide ?

Version ligne Version colonne

pour i de 1 à m faire pour i de 1 à n faire


vi = Lignei (A) · u v = v + Coli (A) ui

Une itération effectue : Une itération effectue :


n multiplications. m multiplications.
n additions. m additions.
Total : 2mn flops. Total : 2mn flops.

30 / 49
Pourquoi deux versions pour v = Au ?
Pour une matrixe A ∈ Rm×n , quelle version est la plus rapide ?

Version ligne Version colonne

pour i de 1 à m faire pour i de 1 à n faire


vi = Lignei (A) · u v = v + Coli (A) ui

Une itération effectue : Une itération effectue :


n multiplications. m multiplications.
n additions. m additions.
Total : 2mn flops. Total : 2mn flops.

Selon la configuration matérielle, Lignei (A) · u peut est plus rapide que u + Coli (A) ui .
Le contraire est aussi possible.

30 / 49
Pourquoi ?

Pourquoi est-ce qu’un version est plus rapide que l’autre si le nombre et la
nature des FLOP sont rigoureusement les mêmes ?

31 / 49
Pourquoi ?

Pourquoi est-ce qu’un version est plus rapide que l’autre si le nombre et la
nature des FLOP sont rigoureusement les mêmes ?

Réponse : la manière dont on accède à la mémoire.

Les CPU sont de plus en plus performants mais pas nécessairement plus
rapides.
Voir Wikipedia : Microprocessor chronology.

31 / 49
Core i7-9xx Cache Hierarchy

Exemples de tailles :
Un thread du coeur contient 16
registres de 64 bits.
Cache L1 : 32 KB, 2 par coeur.
Cache L2 : 256 KB, 1 par coeur.
Cache L3 : 8MB, commun pour
le CPU.
(Source : http://www.aristeia.com)

(Source : Scott Meyers, “CPU Caches and Why You Care”)

32 / 49
Hiérarchie de la mémoire

Vision simplifiée :

33 / 49
Hiérarchie de la mémoire

Vision simplifiée :

Dans la cache, la mémoire est stockée par blocs.

33 / 49
Hiérarchie de la mémoire

Vision simplifiée :

Dans la cache, la mémoire est stockée par blocs.


Un cache miss se produit lorsqu’une donnée demandée par le CPU n’est
pas dans un des blocs du cache.

33 / 49
Minimiser les cache miss

Objectif : minimiser le nombre de cache miss.

Comment faire ?

34 / 49
Minimiser les cache miss

Objectif : minimiser le nombre de cache miss.

Comment faire ?

À savoir : lorsqu’un cache miss à lieu, on ne se contente pas d’aller chercher


la donnée manquante. On récupère tout un bloc de données consécutives.

34 / 49
35 / 49
Je veux le
contenu de
la case #6.

35 / 49
Cache miss !
Un instant,
je demande à
la RAM.

35 / 49
Il me faut le
contenu de
la case #6.

35 / 49
Ok mais pendant qu’on y est, je te
donne le bloc de 6 à 9 d’un seul
coup.

35 / 49
Ok mais pendant qu’on y est, je te
donne le bloc de 6 à 9 d’un seul
coup.

35 / 49
Voici la case
#6.

35 / 49
35 / 49
Je veux le
contenu de
la case #7.

35 / 49
La voici

35 / 49
Je veux le
contenu de
la case #8.

35 / 49
La voici

35 / 49
Je veux le
contenu de
la case #9.

35 / 49
La voici

35 / 49
La voici

Wow, c’est
rapide !

35 / 49
Minimiser les cache miss

Les blocs de mémoire retournés par la RAM sont toujours des cases
consécutives.
(Remarque : dans un Core i7, le cache stocke des blocs de 64 octets. Soit l’équivalent de 16 int ou 8 double.)

36 / 49
Minimiser les cache miss

Les blocs de mémoire retournés par la RAM sont toujours des cases
consécutives.
(Remarque : dans un Core i7, le cache stocke des blocs de 64 octets. Soit l’équivalent de 16 int ou 8 double.)

(Démo avec memoryAccess.cpp)

36 / 49
Minimiser les cache miss

Les blocs de mémoire retournés par la RAM sont toujours des cases
consécutives.
(Remarque : dans un Core i7, le cache stocke des blocs de 64 octets. Soit l’équivalent de 16 int ou 8 double.)

(Démo avec memoryAccess.cpp)

Pour en savoir plus sur les impacts d’une bonne utilisation de la cache, voir
le vidéo : Scott Meyers ”CPU Caches and Why You Care” (lien disponible
sur la page Moodle).

36 / 49
Stockage d’une matrice en mémoire
Un tableau 1D est une bloc de mémoire contigu.
Un tableau 2D est simulé à partir d’un tableau 1D via le calcul des indices.
Il y a deux façon de faire : lignes VS colonnes.

Par lignes Par colonnes

a11 a12 a13 a14 a11 a12 a13 a14


a21 a22 a23 a24
a21 a22 a23 a24
a31 a32 a33 a34
a31 a32 a33 a34 a41 a42 a43 a44

a41 a42 a43 a44

37 / 49
Multiplication matrice-vecteur
On considère un processeur dont la cache stoque 3 blocks de contenant chacun
l = 4 scalaires.

v = A ∗ u pour i de 1 à 4 faire
vi = Lignei (A) · u
v1 a11 a12 a13 a14 u1 Cache
v2 a21 a22 a23 a24 u2
= ∗
v3 a31 a32 a33 a34 u3
v4 a41 a42 a43 a44 u4

cause un cache miss v1 =

38 / 49
Multiplication matrice-vecteur
On considère un processeur dont la cache stoque 3 blocks de contenant chacun
l = 4 scalaires.

v = A ∗ u pour i de 1 à 4 faire
vi = Lignei (A) · u
v1 a11 a12 a13 a14 u1 Cache
v2 a21 a22 a23 a24 u2
= ∗ a11 u1
v3 a31 a32 a33 a34 u3 a21 u2
v4 a41 a42 a43 a44 u4 a31 u3
a41 u4

cause un cache miss v1 = a11 u1 +

38 / 49
Multiplication matrice-vecteur
On considère un processeur dont la cache stoque 3 blocks de contenant chacun
l = 4 scalaires.

v = A ∗ u pour i de 1 à 4 faire
vi = Lignei (A) · u
v1 a11 a12 a13 a14 u1 Cache
v2 a21 a22 a23 a24 u2
= ∗ a11 a12 u1
v3 a31 a32 a33 a34 u3 a21 a22 u2
v4 a41 a42 a43 a44 u4 a31 a32 u3
a41 a42 u4

cause un cache miss v1 = a11 u1 + a12 u2 +

38 / 49
Multiplication matrice-vecteur
On considère un processeur dont la cache stoque 3 blocks de contenant chacun
l = 4 scalaires.

v = A ∗ u pour i de 1 à 4 faire
vi = Lignei (A) · u
v1 a11 a12 a13 a14 u1 Cache
v2 a21 a22 a23 a24 u2
= ∗ a13 a12 u1
v3 a31 a32 a33 a34 u3 a23 a22 u2
v4 a41 a42 a43 a44 u4 a33 a32 u3
a43 a42 u4

cause un cache miss v1 = a11 u1 + a12 u2 + a13 u3 +

38 / 49
Multiplication matrice-vecteur
On considère un processeur dont la cache stoque 3 blocks de contenant chacun
l = 4 scalaires.

v = A ∗ u pour i de 1 à 4 faire
vi = Lignei (A) · u
v1 a11 a12 a13 a14 u1 Cache
v2 a21 a22 a23 a24 u2
= ∗ a13 a14 u1
v3 a31 a32 a33 a34 u3 a23 a24 u2
v4 a41 a42 a43 a44 u4 a33 a34 u3
a43 a44 u4

cause un cache miss v1 = a11 u1 + a12 u2 + a13 u3 + a14 u4

38 / 49
Multiplication matrice-vecteur
On considère un processeur dont la cache stoque 3 blocks de contenant chacun
l = 4 scalaires.

v = A ∗ u pour i de 1 à 4 faire
vi = Lignei (A) · u
v1 a11 a12 a13 a14 u1 Cache
v2 a21 a22 a23 a24 u2
= ∗ a13 a14 u1
v3 a31 a32 a33 a34 u3 a23 a24 u2
v4 a41 a42 a43 a44 u4 a33 a34 u3
a43 a44 u4

cause un cache miss v1 = a11 u1 + a12 u2 + a13 u3 + a14 u4

1 cache miss pour u + 4 cache miss par ligne = 17 cache miss au total.
38 / 49
Multiplication matrice-vecteur
On refait la même chose mais avec la version colonne.
v = A ∗ u v=0
pour i de 1 à n faire
v1 a11 a12 a13 a14 u1
v = v + Coli (A) ui
v2 a21 a22 a23 a24 u2 Cache
= ∗
v3 a31 a32 a33 a34 u3  
0
v4 a41 a42 a43 a44 u4  0 
v= 
 0 
0
cause un cache miss

39 / 49
Multiplication matrice-vecteur
On refait la même chose mais avec la version colonne.
v = A ∗ u v=0
pour i de 1 à n faire
v1 a11 a12 a13 a14 u1
v = v + Coli (A) ui
v2 a21 a22 a23 a24 u2 Cache
= ∗
v3 a31 a32 a33 a34 u3  
a11 u1 a11 u1 +
v4 a41 a42 a43 a44 u4 a21 u2  0 
a31 u3 v=
 0


a41 u4 0
cause un cache miss

39 / 49
Multiplication matrice-vecteur
On refait la même chose mais avec la version colonne.
v = A ∗ u v=0
pour i de 1 à n faire
v1 a11 a12 a13 a14 u1
v = v + Coli (A) ui
v2 a21 a22 a23 a24 u2 Cache
= ∗
v3 a31 a32 a33 a34 u3  
a11 u1 a11 u1 +
v4 a41 a42 a43 a44 u4 a21 u2  a21 u1 + 
a31 u3 v=
 0


a41 u4 0
cause un cache miss

39 / 49
Multiplication matrice-vecteur
On refait la même chose mais avec la version colonne.
v = A ∗ u v=0
pour i de 1 à n faire
v1 a11 a12 a13 a14 u1
v = v + Coli (A) ui
v2 a21 a22 a23 a24 u2 Cache
= ∗
v3 a31 a32 a33 a34 u3  
a11 u1 a11 u1 +
v4 a41 a42 a43 a44 u4 a21 u2  a21 u1 + 
a31 u3 v= 
 a31 u1 + 
a41 u4 0
cause un cache miss

39 / 49
Multiplication matrice-vecteur
On refait la même chose mais avec la version colonne.
v = A ∗ u v=0
pour i de 1 à n faire
v1 a11 a12 a13 a14 u1
v = v + Coli (A) ui
v2 a21 a22 a23 a24 u2 Cache
= ∗
v3 a31 a32 a33 a34 u3  
a11 u1 a11 u1 +
v4 a41 a42 a43 a44 u4 a21 u2  a21 u1 + 
a31 u3 v= 
 a31 u1 + 
a41 u4 a41 u1 +
cause un cache miss

39 / 49
Multiplication matrice-vecteur
On refait la même chose mais avec la version colonne.
v = A ∗ u v=0
pour i de 1 à n faire
v1 a11 a12 a13 a14 u1
v = v + Coli (A) ui
v2 a21 a22 a23 a24 u2 Cache
= ∗
v3 a31 a32 a33 a34 u3  
a11 a12 u1 a11 u1 + a12 u2 +
v4 a41 a42 a43 a44 u4 a21 a22 u2  a21 u1 + 
a31 a32 u3 v=
 a31 u1 +


a41 a42 u4 a41 u1 +
cause un cache miss

39 / 49
Multiplication matrice-vecteur
On refait la même chose mais avec la version colonne.
v = A ∗ u v=0
pour i de 1 à n faire
v1 a11 a12 a13 a14 u1
v = v + Coli (A) ui
v2 a21 a22 a23 a24 u2 Cache
= ∗
v3 a31 a32 a33 a34 u3  
a11 a12 u1 a11 u1 + a12 u2 +
v4 a41 a42 a43 a44 u4 a21 a22 u2  a21 u1 + a22 u2 + 
a31 a32 u3 v=
 a31 u1 +


a41 a42 u4 a41 u1 +
cause un cache miss

39 / 49
Multiplication matrice-vecteur
On refait la même chose mais avec la version colonne.
v = A ∗ u v=0
pour i de 1 à n faire
v1 a11 a12 a13 a14 u1
v = v + Coli (A) ui
v2 a21 a22 a23 a24 u2 Cache
= ∗
v3 a31 a32 a33 a34 u3  
a11 a12 u1 a11 u1 + a12 u2 +
v4 a41 a42 a43 a44 u4 a21 a22 u2  a21 u1 + a22 u2 + 
a31 a32 u3 v= 
 a31 u1 + a32 u2 + 
a41 a42 u4 a41 u1 +
cause un cache miss

39 / 49
Multiplication matrice-vecteur
On refait la même chose mais avec la version colonne.
v = A ∗ u v=0
pour i de 1 à n faire
v1 a11 a12 a13 a14 u1
v = v + Coli (A) ui
v2 a21 a22 a23 a24 u2 Cache
= ∗
v3 a31 a32 a33 a34 u3  
a11 a12 u1 a11 u1 + a12 u2 +
v4 a41 a42 a43 a44 u4 a21 a22 u2  a21 u1 + a22 u2 + 
a31 a32 u3 v= 
 a31 u1 + a32 u2 + 
a41 a42 u4 a41 u1 + a42 u2 +
cause un cache miss

39 / 49
Multiplication matrice-vecteur
On refait la même chose mais avec la version colonne.
v = A ∗ u v=0
pour i de 1 à n faire
v1 a11 a12 a13 a14 u1
v = v + Coli (A) ui
v2 a21 a22 a23 a24 u2 Cache
= ∗
v3 a31 a32 a33 a34 u3  
a11 a12 u1 a11 u1 + a12 u2 +
v4 a41 a42 a43 a44 u4 a21 a22 u2  a21 u1 + a22 u2 + 
a31 a32 u3 v= 
 a31 u1 + a32 u2 + 
a41 a42 u4 a41 u1 + a42 u2 +
cause un cache miss

1 cache miss pour u et 1 cache miss par colonne = 5 cache miss au total.

39 / 49
Multiplication de matrices
On considère C = AB où A, B, C ∈ Rn×n .
Chaque coefficients cij requiert O(n) opérations. Au total O(n3 ) opérations.
Qu’on procède par ligne ou par colonne, peu importe. . .
    
c11 · · · c1n a11 · · · a1n b11 · · · b1n
 .. . . .   . .  . . 
 . . ..  =  .. . . . ..   .. . . . .. 
cn1 · · · cnn an1 · · · ann bn1 · · · bnn

40 / 49
Multiplication de matrices
On considère C = AB où A, B, C ∈ Rn×n .
Chaque coefficients cij requiert O(n) opérations. Au total O(n3 ) opérations.
Qu’on procède par ligne ou par colonne, peu importe. . .
    
c11 · · · c1n a11 · · · a1n b11 · · · b1n
 .. . . .   . .  . . 
 . . ..  =  .. . . . ..   .. . . . .. 
cn1 · · · cnn an1 · · · ann bn1 · · · bnn

Taille des blocs : l << n.

40 / 49
Multiplication de matrices
On considère C = AB où A, B, C ∈ Rn×n .
Chaque coefficients cij requiert O(n) opérations. Au total O(n3 ) opérations.
Qu’on procède par ligne ou par colonne, peu importe. . .
    
c11 · · · c1n a11 · · · a1n b11 · · · b1n
 .. . . .   . .  . . 
 . . ..  =  .. . . . ..   .. . . . .. 
cn1 · · · cnn an1 · · · ann bn1 · · · bnn

Taille des blocs : l << n.


n
l
cache miss sur une ligne/colonne qui est contigüe en mémoire.

40 / 49
Multiplication de matrices
On considère C = AB où A, B, C ∈ Rn×n .
Chaque coefficients cij requiert O(n) opérations. Au total O(n3 ) opérations.
Qu’on procède par ligne ou par colonne, peu importe. . .
    
c11 · · · c1n a11 · · · a1n b11 · · · b1n
 .. . . .   . .  . . 
 . . ..  =  .. . . . ..   .. . . . .. 
cn1 · · · cnn an1 · · · ann bn1 · · · bnn

Taille des blocs : l << n.


n
l
cache miss sur une ligne/colonne qui est contigüe en mémoire.
n cache miss sur une ligne/colonne qui ne l’est pas.

40 / 49
Multiplication de matrices
On considère C = AB où A, B, C ∈ Rn×n .
Chaque coefficients cij requiert O(n) opérations. Au total O(n3 ) opérations.
Qu’on procède par ligne ou par colonne, peu importe. . .
    
c11 · · · c1n a11 · · · a1n b11 · · · b1n
 .. . . .   . .  . . 
 . . ..  =  .. . . . ..   .. . . . .. 
cn1 · · · cnn an1 · · · ann bn1 · · · bnn

Taille des blocs : l << n.


n
l
cache miss sur une ligne/colonne qui est contigüe en mémoire.
n cache miss sur une ligne/colonne qui ne l’est pas.
Chaque cij cause nl + n cache miss.

40 / 49
Multiplication de matrices
On considère C = AB où A, B, C ∈ Rn×n .
Chaque coefficients cij requiert O(n) opérations. Au total O(n3 ) opérations.
Qu’on procède par ligne ou par colonne, peu importe. . .
    
c11 · · · c1n a11 · · · a1n b11 · · · b1n
 .. . . .   . .  . . 
 . . ..  =  .. . . . ..   .. . . . .. 
cn1 · · · cnn an1 · · · ann bn1 · · · bnn

Taille des blocs : l << n.


n
l
cache miss sur une ligne/colonne qui est contigüe en mémoire.
n cache miss sur une ligne/colonne qui ne l’est pas.
Chaque cij cause nl + n cache miss.
2 n
 
Total : n + n cache miss.
l
40 / 49
Stockage de matrices par blocs
Une matrice est partitionnée en sous-matrices.
1 4 1 0
2 3 2 1
A=
1 0 2 5
0 1 1 0

41 / 49
Stockage de matrices par blocs
Une matrice est partitionnée en sous-matrices.
1 4 1 0
2 3 2 1
A=
1 0 2 5
0 1 1 0
       
1 4 1 0 1 0 2 5
A11 = , A12 = , A21 = , A22 = .
2 3 2 1 0 1 1 0

 
A11 A12
A=
A21 A22
41 / 49
Stockage de matrices par blocs

Multiplication de sous-blocs
Exemple :
   
A11 A12 B11 B12
A= , B=
A21 A22 B21 B22

 
A11 B11 + A12 B21 A11 B12 + A12 B22
AB =
A21 B11 + A22 B22 A21 B12 + A22 B22

42 / 49
Stockage de matrices par blocs

(Source : Golub and Val Load, “Matrix Computations”, 3e édition)


43 / 49
Stockage de matrices par blocs
Calcul des cache miss avec le stockage par blocs.
On choisir la taille des sous-matrices b de sorte que 3 sous-matrices
puissent être entièrement stockés dans le cache.
Soit N = n/b.
    
C11 · · · C1N A11 · · · A1N B11 · · · B1N
 .. .. ..  =  .. .. ..   .. .. .. 
 . . .   . . .  . . . 
CN 1 · · · CN N AN 1 · · · AN N BN 1 · · · BN N

44 / 49
Stockage de matrices par blocs
Calcul des cache miss avec le stockage par blocs.
On choisir la taille des sous-matrices b de sorte que 3 sous-matrices
puissent être entièrement stockés dans le cache.
Soit N = n/b.
    
C11 · · · C1N A11 · · · A1N B11 · · · B1N
 .. .. ..  =  .. .. ..   .. .. .. 
 . . .   . . .  . . . 
CN 1 · · · CN N AN 1 · · · AN N BN 1 · · · BN N

Charger une sous-matrice en cache cause b2 /l cache miss.

44 / 49
Stockage de matrices par blocs
Calcul des cache miss avec le stockage par blocs.
On choisir la taille des sous-matrices b de sorte que 3 sous-matrices
puissent être entièrement stockés dans le cache.
Soit N = n/b.
    
C11 · · · C1N A11 · · · A1N B11 · · · B1N
 .. .. ..  =  .. .. ..   .. .. .. 
 . . .   . . .  . . . 
CN 1 · · · CN N AN 1 · · · AN N BN 1 · · · BN N

Charger une sous-matrice en cache cause b2 /l cache miss.


Calculer un coeff. Cij : 2N (b2 /l) = 2(n/b)(b2 /l) = 2nb/l.

44 / 49
Stockage de matrices par blocs
Calcul des cache miss avec le stockage par blocs.
On choisir la taille des sous-matrices b de sorte que 3 sous-matrices
puissent être entièrement stockés dans le cache.
Soit N = n/b.
    
C11 · · · C1N A11 · · · A1N B11 · · · B1N
 .. .. ..  =  .. .. ..   .. .. .. 
 . . .   . . .  . . . 
CN 1 · · · CN N AN 1 · · · AN N BN 1 · · · BN N

Charger une sous-matrice en cache cause b2 /l cache miss.


Calculer un coeff. Cij : 2N (b2 /l) = 2(n/b)(b2 /l) = 2nb/l.
n3
Au total : (2nb/l)N 2 = 2(nb/l)(n/b)2 = 2 .
bl
44 / 49
Exercices
Calculez à la main les produits scalaires :
   
1 2
a  0 · 0 
0 7
   
2 2
 −1   6 
 1  ·  −3
b    

−4 −2
 |  |
c 3 −1 0 2 · 3 −1 1 0
 
−2  
d  1  · −4
1
3
45 / 49
Exercices

Calculez les normes :


3 Normalisez, au sens de la norme
4 euclidienne
 :
a

5 1
1
 1 
a  
3  1 
b 4 1
5 2  |
b 3 4 5
3  
c 4 c 0 0 0
5 ∞

46 / 49
Exercices

Effectuez les multiplications suivante d’abord par lignes et ensuite par


colonnes.
  
2 0 0 1
a  0 3 0  2 
0 0 5 3
  
0.5 1 2 1
b  0.1 2 0   2 
−1 3 1 3

47 / 49
Exercices

On considère une machine dont le cache contient des blocs dont la taille
correspond à 8 int. Comptez le nombre de cache miss qui ont lieu
lorsqu’on exécute le code suivant. On suppose que t pointe vers un tableau
de taille 20 et qu’initialement aucune donnée pertinente n’est dans le cache.

48 / 49
Devoirs

À réaliser avant le cours #2 : TP0


Découvrir le C++ par soi-même.
Énoncé disponible sur Moodle avec des vidéos qui montrent comment
effectuer la prise en main.

À réaliser avant le cours #3 : regarder et comprendre “Essence of Linear


Algebra” de 3blue1brown (lien sur Moodle).
Chapitre 1 : 9m51.
Chapitre 2 : 9m58.
Chapitre 3 : 10m58.
Chapitre 4 : 10m03.
https://www.youtube.com/playlist?list=
PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab

49 / 49

Vous aimerez peut-être aussi