Yotta
Projet tutoré :
Librairie de calcul distribué
Guillaume Abadie
Thierry Cantenot
De quoi allons-nous vous parler ?
- Dossier d'initialisation
- Travail distribué et parallélisé
- Architecture répondant à un besoin
- Dossier bilan
- Des threads
- Et des processus !!!
Calcul distribué

Un projet
- Yotta = 10^24
- 3 mois de dev
- ~500 commits (Git)
- Deux produits principaux
- Librairie statique C
- Daemon Python
- Inspiration
- Git
- OpenCL
Travail au long des jours

Oui mais un projet coordonné !

Oups !... L'habitude ...
Toute ressemblance avec des enseignements existant
ou ayant existé ne serait que pure coïncidence.
Application & Daemon

Librairie statique C
- Orienté objet
- Standard POSIX
- Compatible Linux & Mac OS
- Full 64 bits
- Support IPv4 et IPv6
- ~14000 lignes de code (88% du code)
- ~1300 lignes de makefile (8% du code)
- +120 fichiers de code
Daemon Python
- Un daemon par ordinateur esclave
- Utilisation de la librairie réseau Twisted
- Tests avec Pytest
- Prêt à l'emploi
> sudo pip install twisted
> git clone git@github.com/gabadie/yotta.git yotta
> python yotta/src_daemon/daemon.py --port 5000
- ~600 lignes de code (4% du code)
Dictate
Communication Master - Daemon
-
Récupération des infos du daemon
-
Envoi du binaire au daemon
-
Démarrage de l'exécutable chez le client
-
Récupération des erreurs du daemon
Protocole indépendant de la version
Déploiement

Whisper
Communication Master - Slave
- Lancement des commandes de massive dispatch
- Push de zones mémoires
- Fetch de zones mémoires (FETCH REQUEST, FETCH ANSWER)
- Arrêt d'un processus esclave
Vers l'infini et l'au-delà ...
Lancement d'une commande
void
hello_world(foo_t const * bar);
int
main()
{
// [...]
foo_t bar;
bar.what = ever;
yotta_context_massive(&context, hello_world, sizeof(bar), &bar);
// [...]
}
Problème : les adresses de fonctions
sont incompatibles entre processus ...
(Une chance sur 2^64 que cela fonctionne)
(si ça marche, jouez au loto)
Adresses de fonctions relatives

Ajoutez y du Git !...
(Mais pas de SVN ...)
Transferts mémoires

Blocs mémoires

Exemple de transferts
void
hello_world(yotta_addr_t master_ptr)
{
foo_t bar;
yotta_sync_t fetch_done;
yotta_sync_t push_done;
yotta_fetch_package(master_ptr, sizeof(bar), &bar, &fetch_done);
yotta_sync_wait(&fetch_done);
bar.what = ever;
yotta_push_package(master_ptr, sizeof(bar), &bar, &push_done);
yotta_sync_wait(&push_done);
}
Spaghetti de threads ....
(Mais ceci n'est pas de la cuisine ...)
(La communauté italienne remarquera que nous n'avons pas écrit "spaghettis" (avec un "s"))
Thread dispatching
void
hello_world(foo_t * bar);
void
main()
{
// [...]
foo_t bar;
bar.what = ever;
yotta_dispatch(hello_world, &bar);
// [...]
}
Problème : Démarre les threads dans le processus courant...
Calcul de masse

Calcul de masse distribué

Démo
Bilan d'un développement système
- Incrémentations indispensables
- Cycle en V inutilisable
- Assertions dynamiques primordiales
- Spécifications OCL inutiles
- Tests unitaires progressifs indispensables
- Modèles du concept, protocole (etc ...) inutiles
- Diagrammes UML très utiles
- Aucune paperasse de chef de projet
- Discussion régulière
Bref ...
Merci à tous !
Merci à Lionel Brunie de nous avoir offert une occasion dans
la 4IF de faire quelque chose qui nous plait, essentiel pour le
moral des troupes mis à rude épreuve par notre formation.
Questions ?
Yotta
By hexamome
Yotta
- 640