Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Calcul ou mémoire : où est le goulot ?

Après cette leçon: Je peux dire si un travail est limité par le calcul ou par la mémoire.

Leçon de 60 min2 commandesLab de calcul parallèle : comment pense un GPU, sans GPU, dans JupyterLab

Limité par le calcul ou par la mémoire

Un travail est limité par le calcul quand le processeur ne suit pas. Il est limité par la mémoire quand les données arrivent trop lentement. Savoir lequel des deux freine un programme dit où chercher un gain.

Un GPU fait un très grand nombre de sommes par seconde, mais il doit d’abord recevoir ses données. Le labo n’a pas de GPU : le script transfer.py calcule des temps à partir d’un débit et d’une vitesse inventés, sans rien mesurer.

À la fin de cette leçon

Remarque

Je peux dire si un travail est limité par le calcul ou par la mémoire.

Mots clés

MotCe que ça veut dire
Débit mémoirele nombre d’octets déplacés par seconde
Vitesse de calculle nombre d’opérations faites par seconde
Goulot d’étranglementla limite qui freine tout le reste
Intensitéle nombre d’opérations faites par octet déplacé
Accès groupésdes fils voisins qui lisent des cases voisines
Ligne mémoireun bloc d’octets lu d’un seul coup

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Un appareil a deux limites

Un appareil déplace des octets à un certain débit, et fait des opérations à une certaine vitesse. Le script suppose 500 gigaoctets par seconde et 10 millions de millions d’opérations par seconde.

Pour chaque travail, il calcule deux temps : celui de déplacer les octets, et celui de faire les opérations. Le plus long est le goulot.

Comparer déplacer et calculer

Commande
docker exec jupyter python3 steps/transfer.py

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Exemple : deux travaux, deux limites

TravailOctetsOpérationsTemps mémoireTemps calculLimité par
Addition de 10 millions d’éléments120 000 00010 000 000240 µs1 µsLa mémoire
Produit de matrices 1000 par 100012 000 0002 000 000 00024 µs200 µsLe calcul

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

L’intensité dit où est le goulot

L’intensité d’un travail est son nombre d’opérations divisé par ses octets. Elle vaut 0,08 pour l’addition et environ 166,7 pour le produit de matrices.

L’appareil a lui aussi un seuil : sa vitesse divisée par son débit, soit 20 opérations par octet. Sous le seuil, la mémoire freine. Au-dessus, c’est le calcul.

Comparer l’intensité au seuil

Code: python
# Calcul ou mémoire ? On compare l'intensité du travail à celle de l'appareil.
debit = 500 * 10 ** 9      # octets par seconde
vitesse = 10 * 10 ** 12    # opérations par seconde
seuil = vitesse / debit
print("seuil de l'appareil :", seuil, "opérations par octet")
travaux = [["addition", 10000000, 120000000], ["produit", 2000000000, 12000000]]
for travail in travaux:
    intensite = travail[1] / travail[2]
    if intensite < seuil:
        verdict = "la mémoire"
    else:
        verdict = "le calcul"
    print(travail[0], ":", round(intensite, 2), "opérations par octet, limité par", verdict)
# Changez le débit en 1000 * 10 ** 9 : le seuil baisse de moitié.

Des fils voisins doivent lire des cases voisines

La mémoire est lue par lignes de 32 octets. Si huit fils lisent huit nombres de 4 octets côte à côte, une seule ligne suffit.

Si chacun lit un nombre sur huit, il faut huit lignes, pour les mêmes huit nombres. On appelle cela l’accès groupé, ou coalescence, et il compte autant que le calcul.

Compter les lignes mémoire lues

Commande
docker exec jupyter python3 steps/coalesce.py

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Exemple : deux façons de lire huit nombres

LectureAdresses touchéesLignes de 32 octets
Chaque fil lit la case suivante0, 4, 8, 12, 16, 20, 24, 281
Chaque fil lit une case sur huit0, 32, 64, 96, 128, 160, 192, 2248

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Une erreur fréquente

Attention

On croit souvent que plus d’unités de calcul accélèrent n’importe quel programme. Si la mémoire limite le programme, ajouter du calcul ne change presque rien. Il faut déplacer moins d’octets, ou les lire de façon groupée.

Envoyer les données au GPU a un coût

Un GPU a sa propre mémoire. Les données viennent de celle du processeur par un lien plus lent que sa mémoire locale. Ce transfert s’ajoute au calcul.

Il vaut la peine si le temps gagné sur le calcul dépasse le temps de transfert. Pour une addition, ce n’est presque jamais le cas.

À propos de ce labo et de sa source: Lab de calcul parallèle : comment pense un GPU, sans GPU, dans JupyterLab

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.