Contenu ======= * Compilation de SimGrid * Compilation... * Utilisation * 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 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 : - reçoit en paramètre la charge à prendre en compte ; - 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 pneigh[i]->set_to_send(quantité) ; - retourne la somme des quantités définies avec set_to_send, éventuellement à l'aide de la méthode process::sum_of_to_send() qui clacule cette somme. 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 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 misc.h divers trucs inclassables misc.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 simple_async.cpp un simple programme de test timer.h gestion de timer version.h gestion de la version du programme version.cpp * fichiers auto-générés misc_autogen.h définition des macros XCLOG(...) * scripts colorized-loba script pour exécuter loba en colorant les sorties 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_3.5 liste de quelques suppressions pour valgrind avec SimGrid 3.5