human
$A$ et $B$ sont des matrices $n \times n$ et $v$ est un vecteur avec $n$ éléments. $Av$ a environ $2n^2$ flops et $A+B$ a $n^2$ flops. En suivant cette logique, $(A+B)v$ devrait être plus rapide que $Av+Bv$.
Pourtant, lorsque j'exécute le code suivant en matlab
```A = rand(2000,2000);
B = rand(2000,2000);
v = rand(2000,1);
tic
D=zeros(size(A));
D = A;
for i =1:100
    D = A + B;
    (D)*v;
end
toc
tic
for i =1:100
    (A*v+B*v);
end
toc
```
Le contraire est vrai. Av+Bv est plus de deux fois plus rapide. Des explications
gpt
Sauf pour le code qui effectue un nombre significatif d'opérations en virgule flottante sur des données qui sont stockées dans le cache, la plupart du code intensif en virgule flottante est limité en performance par la bande passante mémoire et la capacité du cache plutôt que par les flops.
$v$ et les produits $Av$ et $Bv$ sont tous des vecteurs de longueur 2000 (16K octets en double précision), qui s'intègrent facilement dans un cache de niveau 1. Les matrices $A$ et $B$ sont de taille 2000 par 2000, soit environ 32 mégaoctets. Votre cache de niveau 3 pourrait être assez grand pour stocker l'une de ces matrices si vous avez un processeur vraiment performant.

Calculer $Av$ nécessite de lire 32 mégaoctets (pour $A$) depuis la mémoire, de lire 16K octets (pour $v$), de stocker les résultats intermédiaires dans le cache L1 et finalement d'écrire 16K octets dans la mémoire. La multiplication $Bv$ nécessite le même travail. Ajouter les deux résultats intermédiaires pour obtenir le résultat final nécessite une quantité négligeable de travail. Cela représente un total d'environ 64 mégaoctets de lectures et un nombre insignifiant d'écritures.

Calculer $(A+B)$ nécessite de lire 32 mégaoctets (pour A) plus 32 mégaoctets (pour B) depuis la mémoire et d'écrire 32 mégaoctets (pour A+B). Ensuite, vous devez effectuer une seule multiplication matrice-vecteur comme décrit ci-dessus, ce qui implique de lire 32 mégaoctets depuis la mémoire (si vous avez un grand cache L3, alors peut-être que ces 32 mégaoctets sont dans ce cache L3). Cela représente un total de 96 mégaoctets de lectures et 32 mégaoctets d'écritures.

Ainsi, il y a deux fois plus de trafic mémoire impliqué dans le calcul de $(A+B)v$ au lieu de $Av+Bv$.

Notez que si vous devez effectuer de nombreuses de ces multiplications avec différents vecteurs $v$ mais les mêmes $A$ et $B$, il deviendra plus efficace de calculer $A+B$ une fois et de réutiliser cette matrice pour les multiplications matrice-vecteur.