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              la couche de communication
    communicator.cpp

    cost_func.h                 fonctions de coût pour comm_cost et comp_cost
    cost_func.cpp

    deployment.h                génération automatique de déploiement
    deployment.cpp

    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