Contenu ======= * Compilation de SimGrid * Compilation... * Utilisation * Tracé de courbes * Communications * Pour ajouter un nouvel algorithme d'équilibrage * Pour ajouter une nouvelle option au programme * Liste des fichiers ---------------------------------------------------------------------- Compilation de SimGrid ====================== Dans les sources : $ cmake -D CMAKE_INSTALL_PREFIX=/usr/local # par exemple $ make $ make install Compilation... ============== Il faut avoir un lien "simgrid-stable" vers le répertoire d'installation de SimGrid (par ex. /usr/local). Utilisation =========== Idée générale : on dispose d'une plate-forme (décrite dans le fichier XML qui va bien), et on déploie dessus une application. La notion de voisinage entre les processus est *liée à l'application*. Il faut évidemment que la plate-forme sous-jacente autorise les communications entre voisins... Pour avoir l'aide en ligne sur les différents paramètres : $ ./loba -h (ou -hh, ou -hhh, pour plus de détails) Pour changer le niveau de détail des affichages : --log=category.thres:level avec category : simu, main, depl, comm, proc, loba et level : trace, debug, verbose, info, warning, error, critical Pour plus de détail sur les options de logging : http://simgrid.gforge.inria.fr/doc/group__XBT__log.html#log_use Sorties ======= * pendant la simulation : [Bourassa 5.000000] [proc/INFO] (6:1) current load: 5 +------- +------- +-------- + + -----+--------- | | | | | | | | | | | \_ charge courante | | | | | | | | | \_ nombre d'itérations de calculs | | | | | | | \_ nombre d'itérations d'équilibrage | | | | | \_ catégorie de messages | | | \_ date courante (en secondes, dans la simulation) | \ nom du nœud * à la fin de la simulation : [Bourassa 108.886866] [proc/INFO] Final load after 107:4 iterations: 1.04113 +------- +--------- +-------- +-- + +------ | | | | | | | | | | | \_ charge | | | | | courante | | | | | | | | | \_ nombre d'itérations | | | | de calculs | | | | | | | \_ nombre d'itérations | | | d'équilibrage | | | | | \_ catégorie de messages | | | \_ date courante (en secondes, dans la simulation) | \ nom du nœud Tracé de courbes ================ Le script extract.pl permet d'extraire les données à partir des traces de simulation et de le présenter sous un format acceptable par gnuplot ou par graph (plotutils). Exemples: ./loba platform.xml 2>&1 | ./extract.pl | graph -CTX ./loba platform.xml 2>&1 | ./extract.pl | graph -CTX -y 0 250 ./loba platform.xml 2>&1 | ./extract.pl \ | gnuplot -p -e 'plot "-" using 1:2:(column(-2)) with lines lc variable' Communications ============== Pour communiquer, chaque processus écoute sur 2 mailboxes (sortes de ports) : - une pour les message de contrôle ; - une pour les transferts de charge. Ceci afin d'éviter de bloquer les échanges d'information pendant un transfert de charge. À la fin, chaque processus envoie un message "CLOSE" à tous ses voisins (sur chaque mailbox), et attends d'avoir reçu deux messages par voisin (un sur chaque mailbox). Ceci permet de synchroniser les processus à la terminaison (ça, à la rigueur, on s'en fout un peu), et surtout de s'assurer qu'il n'y a plus de communication qui « traîne » dans les canaux. Cela permet aussi de ne pas réarmer les communications non bloquantes qu'on ne sait pas annuler proprement (un manque dans SimGrid). Il ne faut bien sûr plus envoyer de message après avoir envoyé un "CLOSE". Attention : lors du déploiement de l'application, il faut s'assurer que la relation de voisinage est symétrique ! *Ce n'est pas vérifié par le programme.* Pour ajouter un nouvel algorithme d'équilibrage =============================================== 1. Imiter ce qui est fait pour loba_simple : - définir une nouvelle classe dérivant de process - attention, il faut construire le process explicitement - redéfinir la méthode load_balance qui : - peut récupérer la charge courante avec get_load() - peut utiliser et éventuellement réordonner le tableau process::pneigh ; - peut récupérer l'information de charge d'un voisin avec pneigh[i]->get_load() ; - définit la charge à envoyer avec send(pneigh[i], quantité) ; NB: le script new_loba.sh peut servir à créer les fichiers. 2. Ajouter l'algorithme dans la liste des options. Dans options.cpp : - faire le #include adéquat ; - ajouter une ligne NOL_INSERT(...) dans la liste existante (dans loba_algorithms_type::loba_algorithms_type()). Pour ajouter une nouvelle option au programme ============================================= 1. Ajouter une variable, déclarée dans options.h et définie dans options.cpp (classement plus ou moins thématique). 2. Toujours dans options.cpp, il faut : - compléter la fonction opt::parse_args(), normalement le 3e paramètre à getopt() et le switch..case qui suit (garder l'ordre alphabétique) ; - compléter la fonction opt::print() (avec le même ordre que en 1.) ; - compléter la fonction opt::usage() (avec le même ordre que en 1.). 3. Utiliser la nouvelle variable au(x) bon(s) endroit(s) ! Liste de fichiers ================= * fichiers de description de plates-formes Plat.xml cluster1000.xml machines1000.xml platform.xml * fichiers de description de déploiement (tests) Dep.xml à utiliser avec Plat.xml deployment.xml à utiliser avec platform.xml * fichiers sources communicator.h communicator.cpp la couche de communication cost_func.h cost_func.cpp fonctions de coût pour comm_cost et comp_cost deployment.h deployment.cpp génération automatique de déploiement hostdata.h gestion des boites de réception, par hôte hostdata.cpp loba_simple.h équilibrage simple loba_simple.cpp (à imiter pour ajouter d'autres algorithmes) loba_*.{h,cpp} autres algos d'équilibrage main.cpp le programme principal message.h file de messages reçus message.cpp misc.h divers trucs inclassables misc.cpp msg_thread.h creation de threads SG/MSG msg_thread.cpp named_object_list.h gestion d'une table de constructeurs avec des noms et des descriptions neighbor.h un voisin pour un processus neighbor.cpp options.h gestion des paramètres et options globaux options.cpp process.h classe de base pour un processus process.cpp simgrid_features.h macros pour détecter la version de SimGrid statistics.h pour calculer moyenne, variance, etc. synchro.h mutex, condition, etc. sync_queue.h lock-free synchronized queue timer.h gestion de timer tracing.h définitions liées au traçage version.h gestion de la version du programme version.cpp * scripts colorized-loba script pour exécuter loba en colorant les sorties extract.pl outil d'extraction des données à partir des traces, pour tracer des courbes new_loba.sh pour créer le squelette d'un nouvel algo d'équiblibrage loba_* setlocalversion calcule un numéro de version à partir du hash du dernier commit (git) * autres fichiers .gitignore liste des fichiers ignorés par git valgrind_suppressions liste de quelques suppressions pour valgrind avec SimGrid 3.5