Sujet énergie pour Systèmes Embarqués

Système Embarqué - Énergie

Accès à Grid5000

Host g5k
  User login
  Hostname access.grid5000.fr
  ForwardAgent no

Host *.g5k
  User login
  ProxyCommand ssh g5k -W "$(basename %h .g5k):%p"
  ForwardAgent no
  • Commande pour sélectionner un noeud sur le cluster Gros à Nancy
ssh nancy.g5k
oarsub -I -l walltime=2:0:0 -p "cluster='gros'"

Séance 1 et 2 : Slides et prise en main MojitO/S

  1. Installer MojitO/S (monitoring système) : https://gitlab.irit.fr/sepia-pub/mojitos
    • Tester MojitO/S pour obtenir la charge système (system load) de votre machine pendant 10s
./mojitos -u -t 10 -f 5
- Tester MojitO/S pour obtenir la consommation de base de votre machine pendant 10s
    - Capteur RAPL : Consommation mémoire et processeur (en micro-joules)
sudo ./mojitos -r -t 10 -f 5
  1. Consommation d’une application
    • Préparer un script (bash ou python) pour obtenir les données pendant l’exécution d’un programme
sudo ./mojitos -r -f 10 -o /tmp/data.csv & pid=$! ; sleep 5; sudo kill $pid
  1. Consommation du tri
    • Comparez les algorithmes de tri dans plusieurs langages, options de compilation
    • Les trois métriques sont le temps, la puissance moyenne, l’énergie

Exemple d’outil pour lire le fichier de sortie de MojitO/S

import pandas as pd
import matplotlib.pyplot as plt

def _read_csv(filename):
    df = pd.read_csv(filename, sep=' ', skipinitialspace=True)
    if df.columns[-1].startswith('Unnamed'):
        df.drop(columns=df.columns[-1:], axis=1, inplace=True)
    return df

def show_csv(filename, norm=False):
    a = _read_csv(filename)
    a['#timestamp'] = a['#timestamp']-a['#timestamp'][0]
    if norm:
        tmp = (a/a.max())
        tmp['#timestamp'] = a['#timestamp']
        a = tmp
    a.plot(x='#timestamp')


show_csv('/tmp/data.csv', norm=False)
plt.show(block=True)

Séance 3 : Levier : Fréquence du processeur

  1. Écrire un script (en bash, python, C, rust) qui prends en argument une ligne de commande et qui affiche
  • Le temps d’exécution (en seconde)
  • L’énergie consommée par le processeur et la mémoire (en Joules)
  • La puissance moyenne (l’énergie divisée par le temps) en Watts

Exemple

$ ./mon_script.sh sleep 10
10.01 1322 132.1

Quelques fichiers utiles:

fmin=`cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq`
boost=`cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq`
echo $freq | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq
  1. Impact de la fréquence sur l’énergie, le temps, la puissance moyenne
  2. Lien avec les compteurs de performance (processeur/mémoire)

Séance 4 et 5: Projet d’optimisation

Ensemble de Julia

# Code modified from https://frederic-junier.org/MPS2014/MPS-2017-Fractales-Seance4.pdf

import matplotlib.pyplot as plt
import numpy as np

taille = 200
xmin, xmax = -1, 1
ymin, ymax = -1, 1
iterationmax = 100

a = -0.8
b = 0.156

pixels = np.zeros((taille, taille, 3), dtype='i')

for line in range(taille):
    for col in range(taille):
        i = 1
        x = xmin+col*(xmax-xmin)/taille
        y = ymax-line*(ymax-ymin)/taille
        while i<=iterationmax and (x**2+y**2)<=4:

            x, y = x**2-y**2+a, 2*x*y+b
            i += 1
            if i>iterationmax and (x**2+y**2)<=4:
                pixels[col,line] = (0,0,0)
            else:
                pixels[col,line] = ((4*i)%256,2*i,(6*i)%256)

plt.imshow(pixels)
plt.show(block=True)           
  • Implémentez dans le langage de votre choix (en sauvegardant le fichier plutôt qu’en l’affichant). Le but est de minimiser

    • Le temps d’exécution
    • L’énergie consommée
    • La puissance moyenne
  • Vous utiliserez les deux configurations suivantes:

    • Rapide (langages compilés) Image 10000x10000 avec 1000 itérations
    • Lent (langages interprétés) Image 900x900 avec 100 itérations

Les codes (incluant le code permettant de charger et d’afficher l’image) seront à soumettre sous moodle et les résultats dans le tableau partagé (lien vers le tableau sur Moodle) sous la forme suivante (sur les machines de la salle de TPs pour que les comparaisons soient possibles). Vous pouvez changer la fréquence, mais il faudra toujours au moins soumettre une version avec la fréquence maximum. Vous pouvez utiliser des bibliothèques d’appoint tant qu’il ne s’agit pas d’un appel direct à une fonction calculant julia et que les bibliothèques sont open-source, et pérennes.

NomLangageLigne de commandeLigne de compilationFréquenceTemps (s)Énergie (J)Puissance moyenne (W)
GeoPythonmpirun -n 2 python3 code.pyN/A1.4GHz17300128
GeoC./codegcc code.c -O3 -o code1.4GH2215066

Rendu final

A déposer sur moodle, vos codes dans un zip pour la partie julia, ainsi qu’un document de 2 pages en pdf avec le contenu suivant:

  • une demi page maximal : Le tableau avec vos résultats (voir ci dessus)
  • une section d’analyse de l’ensemble de vos résultats expliquant à votre avis ce qui a impacté le temps, l’énergie et la puissance maximale
  • une section expliquant votre méthodologie d’expérimentation, ie comment vous avez décidé quels expériences faire, comment vous les avez réalisées

Le rendu sera à faire au plus tard pour 7 jours après le dernier TP