Combien gagne-t-on avec plus de machines ?
Le calcul parallèle répartit un travail entre plusieurs unités de calcul qui avancent en même temps. La loi d’Amdahl dit de combien ce travail accélère, et pourquoi le gain a toujours une limite.
Un entrepôt prépare 400 colis. Des préparateurs en plus emballent plus vite, mais une seule personne peut établir la liste des tournées. Le labo de ce module n’a pas de GPU, c’est-à-dire pas de carte graphique : il montre le modèle sur lequel un GPU est construit.
À la fin de cette leçon
Remarque
Je peux estimer l’accélération obtenue avec plusieurs unités de calcul.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Parallèle | plusieurs parties d’un travail faites en même temps |
| Unité de calcul | un cœur ou un processus qui fait une part du travail |
| Partie sérielle | la part du travail qui doit se faire dans l’ordre |
| Accélération | combien de fois le travail va plus vite qu’avec une seule unité |
| Efficacité | l’accélération divisée par le nombre d’unités |
| Loi d’Amdahl | la règle qui fixe la limite de l’accélération |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une partie du travail ne se partage pas
Certaines étapes se font dans l’ordre : on lit un fichier avant de le traiter. C’est la partie sérielle, notée s. Si la liste des tournées prend 25 % du temps et ne se partage pas, alors s vaut 0,25.
Le reste, 75 %, se partage entre n unités de calcul. Avec une seule unité, tout dure comme avant.
Exemple : s = 0,25 avec 4 unités
| Étape | Calcul | Résultat |
|---|---|---|
| Part qui se partage | 1 - 0,25 | 0,75 |
| Cette part sur 4 unités | 0,75 / 4 | 0,1875 |
| Durée relative totale | 0,25 + 0,1875 | 0,4375 |
| Accélération | 1 / 0,4375 | environ 2,29 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Calculer un tableau d’accélérations
# Accélération pour une part sérielle de 25 % (0,25 en Python).
part_serielle = 0.25
for unites in [1, 2, 4, 8, 16]:
acceleration = 1 / (part_serielle + (1 - part_serielle) / unites)
print(unites, "unités :", round(acceleration, 2))
# Changez la part sérielle en 0.5 et relancez : le plafond baisse.
Le labo calcule la même formule
Le script amdahl.py du labo calcule ce tableau pour trois parts sérielles : 10 %, 25 % et 50 %, avec 1, 2, 4 et 8 unités. Il ne mesure aucun temps : c’est la formule, donc il affiche la même chose à chaque fois.
Le script affiche des mots en anglais : « workers » veut dire unités de calcul, et « percent » veut dire pour cent.
Lancer le tableau d’Amdahl du labo
docker exec jupyter python3 steps/amdahl.pyAffiché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 : ce que le script affiche
| Part sérielle | 1 unité | 2 unités | 4 unités | 8 unités |
|---|---|---|---|---|
| 10 % | 1,0 | 1,82 | 3,08 | 4,71 |
| 25 % | 1,0 | 1,6 | 2,29 | 2,91 |
| 50 % | 1,0 | 1,33 | 1,6 | 1,78 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
L’accélération a un plafond
Même avec un nombre d’unités sans fin, la partie sérielle dure toujours autant. Le plafond est donc 1 divisé par s : 10,0 pour 10 %, 4,0 pour 25 %, 2,0 pour 50 %.
L’efficacité est l’accélération divisée par n. Avec 8 unités et 10 % de partie sérielle, elle vaut 4,71 / 8, soit 0,59. Chaque unité est utile un peu plus de la moitié du temps.
Une erreur fréquente
Attention
On croit souvent que 8 unités de calcul rendent le travail 8 fois plus rapide. C’est vrai seulement si rien ne doit se faire dans l’ordre. Dès qu’une partie reste sérielle, elle fixe un plafond : ajoutez des unités seulement si le gain restant en vaut le prix.