Commit ec060de9 authored by CHAMONT David's avatar CHAMONT David
Browse files

segregate docker stuff

parent 6a70f36e
FROM piscineri3/calculflottant
ADD . /work
WORKDIR /work
# Profilage numérique avec Verrou
C++ est statiquement et fortement typé : le programmeur doit préciser au compilateur
le type de toutes les variables qu'il utilise. C'est généralement considéré comme nécessaire
pour garantir le bon fonctionnement des programmes de très grande taille, mais cela peut
conduire à un code difficile à écrire comme à lire. Pour alléger la tâche du
programmeur sans renoncer au typage, C++11 autorise le compilateur à deviner
certains types dans les cas les moins ambigus. Ce mécanisme, appelé **inférence de type**,
s'appuie en C++ sur le mot-clef `auto`.
L’outil Verrou vise à faciliter le diagnostic et la correction des erreurs de calcul dans les outils de simulation industriels. Ces erreurs, dues aux propriétés de l’arithmétique flottante, peuvent être détectées et quantifiées grâce à l’Arithmétique en Arrondi Aléatoire. Verrou utilise cette arithmétique pour instrumenter les codes de calcul sans avoir besoin de les recompiler. Des fonctionnalités plus avancées permettent aussi de localiser dans le code source l’origine des erreurs, facilitant ainsi le déboguage numérique.
* prérequis : bases du calcul flottant.
* hauteur du plongeoir : 5m.
* préinstallation : Docker, image `piscineri3/calculverrou`.
* hauteur du plongeoir : 3m.
* préinstallation : Docker, image `piscineri3/calculverrou:1`.
* fichiers : https://gitlab.in2p3.fr/MaitresNageurs/PiscineJI/tree/master/CalculVerrou
* d'après : [Francois Fevotte & Bruno Lathuilière](https://github.com/edf-hpc/verrou).
* maître(s) nageur(s) : [David Chamont](http://informatique.in2p3.fr/?q=user/3).
* <img src="img/david.jpeg" height=50>
---
## Vérification de votre environnement de travail
Nous vous proposons de modifier vos fichiers de code au sein du système
d'exploitation natif de votre ordinateur portable, avec vos outils d'édition
habituels, et d'utiliser une machine Docker uniquement pour compiler et exécuter
le programme résultant.
Nous vous proposons d'expérimenter Verrou au sein du système d'exploitation natif de votre ordinateur portable,
avec vos outils d'édition habituels, et d'utiliser une machine Docker pour compiler et exécuter le programme résultant
en combinaison avec Verrou.
Vous devriez avoir déjà installé Docker et VirtualBox, conformément aux instructions
du [README.md](../README.md) principal de ce projet. Vous devriez également déjà
disposer de l'image `piscineri3/gcc61:3`. Si ce n'est pas le cas et que vous disposez
de réseau, tapez `docker pull piscineri3/gcc61:3`.
Vous devriez avoir déjà installé Docker, conformément aux instructions du [README.md](../README.md) principal de ce projet.
Vous devriez également déjà disposer de l'image `piscineri3/calculverrou:1`. Si ce n'est pas le cas et que vous disposez
de réseau, tapez `docker pull piscineri3/calculverrou:1`.
En partant de l'hypothèse que vous éditerez vos fichiers dans le répertoire
local <LOCAL>, nous vous proposons de monter ce répertoire en tant que
`/piscine` au sein de la machine Docker.
En partant de l'hypothèse que vous éditerez vos fichiers dans le répertoire local <LOCAL>, nous vous proposons de monter
ce répertoire en tant que `/work` au sein de la machine Docker.
Créez le programme suivant au sein de <LOCAL> :
```c++
// Fichier hello_world.cpp
// Fichier lost_precision.cpp
#include <iostream>
int main()
{
std::cout<<"Hello World !"<<std::endl ;
float pi { 3.14159f }, small { 0.00141421f } ;
float sum = pi+small ;
float diff = sum-pi ;
std::cout.precision(6) ;
std::cout
<<"pi : "<<pi<<'\n'
<<"small : "<<small<<'\n'
<<"pi+small : "<<sum<<'\n'
<<"(pi+small)-pi : "<<diff<<'\n'
<<std::flush ;
}
```
A présent, compilez le et exécutez le au sein d'une machine Docker
`piscineri3/gcc61:3` :
`piscineri3/calculverrou:1` :
```shell
> docker run --rm -it -v <LOCAL>:/piscine piscineri3/gcc61:3 /bin/bash
>> cd /piscine
>> g++ -std=c++14 hello_world.cpp -o hello_world.exe
>> ./hello_world.exe
Hello World !
> docker run --rm -it -v <LOCAL>:/work -w /work piscineri3/calculverrou:1
>> g++ -std=c++14 lost_precision.cpp -o lost_precision.exe
>> ./lost_precision.exe
pi : 3.14159
small : 0.00141421
pi+small : 3.143
(pi+small)-pi : 0.0014143
>> exit
```
A présent, tentons une exécution "verrouillée" :
```shell
> docker run --rm -it -v <LOCAL>:/work -w /work piscineri3/calculverrou:1
>> source /opt/verrou/1.1.0/env.sh
>> valgrind --tool=verrou --rounding-mode=random ./lost_precision.exe
==72== Verrou, Check floating-point rounding errors
==72== Copyright (C) 2014-2016, F. Fevotte & B. Lathuiliere.
==72== Using Valgrind-3.13.0+verrou-dev and LibVEX; rerun with -h for copyright info
==72== Command: ./lost_precision.exe
==72==
==72== First seed : 970074
==72== Simulating RANDOM rounding mode
==72== Instrumented operations :
==72== add : yes
==72== sub : yes
==72== mul : yes
==72== div : yes
==72== mAdd : yes
==72== mSub : yes
==72== cmp : no
==72== conv : no
==72== max : no
==72== min : no
==72== Instrumented scalar operations : no
pi : 3.14159
small : 0.00141421
pi+small : 3.143
(pi+small)-pi : 0.0014143
==72==
==72== ---------------------------------------------------------------------
==72== Operation Instruction count
==72== `- Precision
==72== `- Vectorization Total Instrumented
==72== ---------------------------------------------------------------------
==72== add 1 1 (100%)
==72== `- flt 1 1 (100%)
==72== `- llo 1 1 (100%)
==72== ---------------------------------------------------------------------
==72== sub 1 1 (100%)
==72== `- flt 1 1 (100%)
==72== `- llo 1 1 (100%)
==72== ---------------------------------------------------------------------
==72== cmp 8 0 ( 0%)
==72== `- dbl 8 0 ( 0%)
==72== `- scal 8 0 ( 0%)
==72== ---------------------------------------------------------------------
==72== conv 4 0 ( 0%)
==72== `- flt=>dbl 4 0 ( 0%)
==72== `- scal 4 0 ( 0%)
==72== ---------------------------------------------------------------------
==72== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
root@503c1d427cb6:/work#>> exit
```
Vous etes prêt.
......
FROM piscineri3/calculflottant:1
# So to avoid debconf interactive questions
#RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y libc6-dbg \
&& rm -rf /var/lib/apt/lists/*
ARG VALGRIND=3.13.0
ARG VERROU=1.1.0
ARG PREFIX=/opt/verrou/1.1.0
RUN wget https://github.com/edf-hpc/verrou/releases/download/v${VERROU}/valgrind-${VALGRIND}.verrou-${VERROU}.tar.bz2 -O valgrind-${VALGRIND}.verrou-${VERROU}.tar.bz2 \
&& tar -xvf valgrind-${VALGRIND}.verrou-${VERROU}.tar.bz2 \
&& rm -rf valgrind-${VALGRIND}.verrou-${VERROU}.tar.bz2
# For the moment, no FMA by default
RUN cd valgrind-${VALGRIND}+verrou-${VERROU} \
&& ./autogen.sh && ./configure --enable-only64bit --prefix=${PREFIX} --enable-verrou-fma=no \
&& make && make install
#!/bin/bash
docker build --no-cache -t piscineri3/calculverrou:1 . | tee docker_build.log
#!/bin/bash
docker run -it --rm -v $PWD:/work -w /work piscineri3/calculverrou:1
#!/bin/bash
docker build -t piscineri3/calculverrou .
// Fichier lost_precision.cpp
#include <iostream>
int main()
{
float pi { 3.14159f }, small { 0.00141421f } ;
float sum = pi+small ;
float diff = sum-pi ;
std::cout.precision(6) ;
std::cout
<<"pi : "<<pi<<'\n'
<<"small : "<<small<<'\n'
<<"pi+small : "<<sum<<'\n'
<<"(pi+small)-pi : "<<diff<<'\n'
<<std::flush ;
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment