Codeur JUNIOR confiné - Episode 6, mon premier cluster de calcul distribué : le multi-dé (partie 1)
Nouvelle application des micro:bits. Nouvelle expérience, aussi, celle de l'échec - parce que tout ne marche pas toujours comme on le souhaite et qu'il faut savoir réagir quand ça arrive...
On avait eu l'occasion avec les enfants de faire un dé. Concept simple : on secoue, ça tire un chiffre au hasard entre 1 et 6, et ça l'affiche.
Ce dimanche, on en a eu besoin d'un deuxième. Il fallait du coup secouer chacun des dés. Pas un problème mais bon : et si on faisait un ensemble de dés reliés entre eux plutôt ?
Plus précisément : un micro:bit principal, qu'on secoue, et qui va ensuite demander (par radio) à tous les "noeuds du cluster de calcul" (i.e. d'autres micro:bits) de tirer un nombre au hasard, de l'envoyer (toujours par radio), et il affiche la somme au final.
La conception
Comme d'habitude, un peu d'architecture avant de se lancer dans le vif du sujet.
En gros:
- Le "Master" commence par dénombrer combien de noeuds il a dans son cluster. On a fait simple: A=+1, B=on a fini 😁
- Ensuite, on secoue le master => il envoie aux noeuds l'ordre de procéder au tirage
- Il reçoit les réponses => il attend de toutes les avoir
- Ensuite, il fait la somme, et retour en attente.
L'implémentation
Le master
Je mets tout d'un coup, c'est pas si gros 😊
Bon alors, on a quoi ?
- une première étape avec A et B pour définir le nombre de noeuds.
- un mode "Secousse / Emission / Réception / Calcul / Affichage"
Plusieurs nouveautés tout de même, liées aux tableaux, qu'on va passer en revue.
Les tableaux
Mine de rien, c'est le premier programme qu'on fait qui utilise des tableaux (qui sont plus des listes chainées en fait, mais peu importe).
Expliqué aux enfants, ça donne ça:
Imagine un livre, avec des pages. Chaque page c'est une variable. Tu peux lire n'importe quelle page, tu peux même coller des pages où tu veux, et en arracher.
On peut aussi connaitre le nombre de page, chercher dedans, lire tout, ...
Et d'ailleurs, on va
- ajouter chaque réponse comme une nouvelle page dans le livre
- savoir si tout le monde a répondu en regardant le nombre de pages
- calculer la somme en parcourant tout le livre
Les noeuds
On ne fait pas plus simple. Par mesure de debug, on affiche le résultat partiel (= le tirage) sur chacun des noeuds, et basta.
La déception 😖
Allez, on y va, on lance le programme ! 4 puces, 3 noeuds + le master, c'est parti ! On secoue ! et rien 🧐
Plus exactement : les résultats s'affichent bien sur chacun des noeuds, mais rien au niveau principal.
On recommence : même problème.
Bon, on recommence avec un seul dé alors : ça marche.
Avec deux dés : ça marche. On réessaye : ben ça marche plus 😥 Ah si ! Ah non...
L'explication
J'avoue que j'ai eu du mal à la trouver. Le problème n'est pas dans le code a priori, il a l'air bon. Mais en pratique, les émissions radio se parasitent. Pas possible de recevoir trois nombres quasi-simultanément sur le même canal - et deux c'est limite. Après, pour l'expliquer aux enfants...
- Bon les enfants, tout le monde pense à un nombre entre 1 et 6. A trois, tout le monde me donne son chiffre en même temps. 1... 2... 3!
- 6! (en chœur) (suivi d'un chips-personal-soda-si-tu-parles-t-auras-un-gage-pas-le-droit-de-faire-hmmmmm)
- Bon on recommence. C'est pas le plus grand qui gagne ! 1... 2... 3 !
- ...brouhaha incompréhensible...
- Super ! Alors, qui a dit quoi ?
- Euh, on sait pas on n'a pas bien entendu
Ben là c'est pareil. Le groupe radio, c'est un tuyau pour se parler. Si tout le monde parle en même temps dans le tuyau, on n'entend rien.
Savoir rebondir
On ne s'est pas arrêté là. Bien au contraire : on a décidé de réfléchir à des solutions pour ça. Ca sera l'objet du prochain article.
Au final on aura quand même appris:
- le calcul distribué
- le fonctionnement des tableaux (listes chainées plutôt)
- les limitations du système radio
- les soucis de scalabilité d'une solution
- et le plus important AMHA : savoir rebondir en cas d'échec !