Computer Parts in French - Les parties de l'ordinateur.pptx
Reutilisabilité
1. R´utilisabilit´
e e
G´nie Logiciel pour le Calcul Scientifique
e
Caner Candan - caner@candan.fr
6 mars 2011
R´sum´
e e effet nous pouvons utiliser l’outil d’installation de pa-
quets “aptitute”. Une rapide introduction est pr´sent´
e e
Le G´nie Logiciel constitue l’ensemble des activit´s
e e en figure 1.
permettant de d´finir la conception jusqu’` la pro-
e a
duction d’un logiciel et la R´utilisabilit´ peut ˆtre
e e e $> sudo aptitude install libpetsc3.1
d´finit comme une mani`re de concevoir et r´aliser les
e e e $> sudo aptitude install libpetsc3.1-dev
composants de base des m´thodes num´riques de fa¸on
e e c $> sudo aptitude install petsc3.1-doc
la plus r´utilisable possible. Pour les illustrer, nous
e
utiliserons une m´thode it´rative, qui contrairement
e e $> sudo aptitude install libslepc3.1
aux m´thodes directes, se prˆte mieux aux matrices de
e e $> sudo aptitude install libslepc3.1-dev
grandes tailles. Elles permettent de r´duire la taille de
e $> sudo aptitude install slepc3.1-doc
la matrice en se limitant aux ´l´ments non-nuls. Il est
ee
´galement important de noter que la m´thode it´rative
e e e
utilis´e est une m´thode de projection pour r´soudre de
e e e Figure 1 – Commandes pour l’installation des librairies
tr`s grandes tailles de probl`mes. Elle est constitu´e de
e e e et des d´pendances
e
3 parties principales : la projection dans un sous-espace,
la r´solution avec une m´thode classique et le retour
e e
dans l’espace de d´part.
e
Configuration Puis pour ´viter les “Makefile”
e
Nous rappelons, ci-dessous, les objectifs attendus du d´sordonn´s et incompl`tes fournit dans les exemples
e e e
rapport : des librairies ainsi que les variables d’environnement `
a
d´finir, nous pouvons faire appel ` l’outil CMake 1 .
e a
– se familiariser avec la r´utilisabilit´
e e
s´quentielle/parall`le ` l’aide d’une biblioth`que
e e a e Ce dernier facilite grandement la configuration d’un
num´rique orient´e composant,
e e projet en PETSc 2 ou SLEPc et permet ainsi ` quiconque
a
– utilisation des biblioth`ques PETSc, SLEPc,
e une rapide prise en main des biblioth`ques utilis´es. De
e e
– impl´mentation des op´rations matricielles de base,
e e plus la configuration de CMake est multi-plateforme. Le
de la m´thode it´rative ERAM et de la m´thode
e e e code 1 illustre un exemple de fichier de configuration
hybride MERAM, CMake pour un projet simple.
– mise ` l’´chelle des exemples r´alis´s en int´grant
a e e e e
les composants de ces biblioth`ques dans l’environ-
e Code 1 Fichier de configuration d’un projet pour le
nement YML. programme “hello world” en PETSc avec CMake
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
1 Installation et configuration de PROJECT(hello)
l’environnement FIND_PACKAGE(PETSc REQUIRED)
INCLUDE_DIRECTORIES( ${PETSC_INCLUDES} )
Pr´ambule Il est important, avant tout, de pr´senter ADD_EXECUTABLE(hello hello.cpp)
e e
les d´marches n´cessaires ` l’installation et la configura- TARGET_LINK_LIBRARIES(hello ${PETSC_LIBRARIES})
e e a
tion de l’environnement. Nous entendons principalement
par environnement les librairies PETSc et SLEPc. Puis
nous aborderons une m´thode de configuration d’un pro-
e De la mˆme mani`re il suffirait d’inclure le code 2 pour
e e
jet utilisant ces librairies ` l’aide d’outils comme CMake. compiler un projet en SLEPc.
a
1. CMake : g´n´rateur et langage haut niveau de Makefile
e e
Installation Utilisant un OS bas´ sur “debian”, une
e multi-plateforme
“Ubuntu 10.10”, il est possible d’installer PETSc et 2. FindPETSc.cmake available from https://github.com/
SLEPc, sans qu’aucune compilation soit n´cessaire. En
e jedbrown/cmake-modules/blob/master/FindPETSc.cmake
1
2. 2 DESIGN 2
Code 2 Configuration additionnel pour un projet en Code 4 Exemple de code en petsc-cxx
SLEPc
#include <petsc_cxx/petsc_cxx>
FIND_PACKAGE(SLEPC REQUIRED) using namespace petsc_cxx;
INCLUDE_DIRECTORIES( ${SLEPC_INCLUDES} ) int main(int ac, char** av)
TARGET_LINK_LIBRARIES(hello ${SLEPC_LIBRARIES}) {
Parser parser(ac, av, "Introductory "
"example "
"of code using "
2 Design "petsc-cxx.");
Context context(parser);
C vs C++ Les librairies PETSc 3 et SLEPc ont ´t´ ee
// YOUR CODE
d´velopp´es principalement en langage C sans utilisation
e e
return 0;
d’aucun paradigme de programmation. Nous avons donc
}
choisit de porter le code des librairies en C++ afin de
profiter du paradigme objet offert par ce dernier ainsi
que les concepts de m´ta-programmation. Deux projets
e
en d´coulent : petsc-cxx 4 et slepc-cxx 5 . Cela nous permet petsc_cxx::Parser, quant ` elle indique que l’on uti-
e a
ainsi d’utiliser ces librairies d’une mani`re intuitive tout lise le gestionnaire de param`tres de PETSc.
e e
en profitant d’un langage fortement typ´, b´n´ficiant de
e e e
contrats d’utilisation 6 et de couches d’abstraction.
slepc-cxx Nous savons que la librairie SLEPc est
d´pendante de PETSc, cela va de mˆme pour la librai-
e e
petsc-cxx Pour situer le contexte de la librairie, nous
7 rie slepc-cxx et petsc-cxx. Nous utilisons ´galement un
e
utilisons l’espace de nom petsc_cxx. Ainsi toutes les
espace de nom pour slepc-cxx, il s’agit de slepc_cxx. Le
classes se situent dans ce mˆme contexte. Les codes 3 et 4
e
code 5 illustre l’initialisation d’un programme en slepc-
illustrent quelques diff´rences entre les librairies PETSc
e
cxx. D’autres exemples vont suivre.
et petsc-cxx.
Code 3 Exemple de code en PETSc Code 5 Exemple de code en slepc-cxx
#include <petscsys.h> #include <slepc_cxx/slepc_cxx>
static char help[] = "Introductory example of " int main(int ac, char** av)
"code using PETSc.nn"; {
int main(int ac, char** av) slepc_cxx::Parser parser(ac, av,
{ "Introductory "
PetscInitialize(&ac, &av, (char *)0, help); "example "
// YOUR CODE "of code using "
PetscFinalize(); "slepc-cxx.");
return 0; petsc_cxx::Context context(parser);
} // YOUR CODE
return 0;
}
Dans le cas de petsc-cxx le simple fait d’inclure le fi-
chier d’en-tˆte petsc_cxx/petsc_cxx est suffisant. Il est
e
´ventuellement possible d’inclure uniquement des classes
e Comme nous le disions, slepc-cxx d´pend de
e
sp´cifiques afin d’all´ger le code. Autre point, il n’est
e e petsc-cxx, c’est la raison pour laquelle nous utili-
plus n´cessaire de faire appel ` une fonction tel que
e a sons la classe petsc_cxx::Context avec la classe
PetscFinalize() ` la fin du programme, ceci est fait
a slepc_cxx::Parser. La classe slepc_cxx::Parser
de mani`re implicite lors de la sortie du contexte de
e permet d’utiliser le gestionnaire de param`tres de
e
la fonction main depuis la classe petsc_cxx::Context. SLEPc.
Cette classe, prenant en param`tre un objet de type
e
petsc_cxx::Parser, doit ˆtre appel´e au d´but du
e e e Fonction objet Ce nouveau design est centr´ autour e
programme pour situer le contexte PETSc. La classe de ce que l’on nomme des foncteurs ou encore fonction
3. Why is PETSc programmed in C, instead of For- objet. Il s’agit d’utiliser une classe comme fonction, in-
tran or C++ ? : http://www.mcs.anl.gov/petsc/petsc-as/ troduite en langage proc´durale, tout en profitant des
e
documentation/faq.html#why-c fonctionnalit´s apport´es par la programmation objet.
e e
4. petsc-cxx : https://github.com/canercandan/petsc-cxx
5. slepc-cxx : https://github.com/canercandan/slepc-cxx
Ainsi il est possible de d´l´guer l’appel ` une fonction ob-
ee a
6. Interface jet. L’instanciation du foncteur s’effectuant avant l’ap-
7. Namespace pel, il est ainsi possible de passer des param`tres ` sa
e a
3. 3 ´
IMPLEMENTATION 3
construction ` travers le constructeur et d’effectuer en-
a La variable A est instanci´e avec la classe Matrix<T>.
e
suite l’appel. La variable x est instanci´e avec la classe Vector<T>.
e
Tous deux utilisent le type Scalar. Puis le produit de
A et x est assign´ ` la variable b. De mani`re implicite
ea e
Op´rations La classe principale que l’on nommera
e
8 des routines sont appel´es en PETSc pour r´aliser le
e e
petsc_cxx::BO , est une classe abstraite repr´sentant
e
produit. Les param`tres pass´s ` l’instance de la matrice
e e a
toutes les op´rations binaires prenant 3 param`tres `
e e a
sont respectivement le nombre de lignes, le nombre de
l’appel (2 en entr´e et 1 en sortie). Il s’agit d’une inter-
e
colonnes et la valeur initiale pour tous les ´l´ments de
ee
face de foncteurs. Elle impose l’impl´mentation d’une
e
la matrice.
m´thode repr´sentative de la fonction d’appel.
e e
Les classes d’op´rations qui h´ritent de la classe
e e
petsc_cxx::BO sont multiples, ci-dessous une liste non- 3 Impl´mentation
e
exhaustive.
– petsc_cxx::MultiplyMatVec, pour la r´solution e Dans cette section nous allons voir comment
du syst`me lin´aire Ax = b
e e impl´menter des op´rations matricielles de bases puis
e e
– petsc_cxx::AdditionMatrix, pour l’addition de nous aborderons une impl´mentation de la m´thode
e e
deux matrices it´rative ERAM et de la m´thode hybride MERAM.
e e
– petsc_cxx::Dot, pour le produit scalaire de deux
vecteurs Op´rations matricielles Le code 7 illustre le produit
e
– petsc_cxx::Scal, pour la mise ` l’´chelle d’un vec- matrice-vecteur sur le sous-espace de Krylov.
a e
teur
Code 7 Exemple de code illustrant le produit matrice-
Structure de donn´es Plusieurs types de structures vecteur sur le sous-espace de Krylov
e
de donn´es ont ´t´ port´es ` ce nouveau design, ci-
e ee e a
#include <petsc_cxx/petsc_cxx>
dessous une liste non-exhaustive.
using namespace petsc_cxx;
– petsc_cxx::Scalar, repr´sente le type scalaire
e
int main(int ac, char** av)
– petsc_cxx::Int, repr´sente un entier
e
{
– petsc_cxx::Real, repr´sente un r´el
e e
Parser parser(ac, av);
– petsc_cxx::Truth, repr´sente un bool´en
e e
Context context(parser);
– petsc_cxx::Matrix, classe repr´sentant une ma-
e
const Int N = 4;
trice PETSc
Matrix< Scalar > A(N,N,10);
– petsc_cxx::Vector, classe repr´sentant un vecteur
e
Vector< Scalar > x(N,2);
PETSc
Vector< Scalar > b(N);
Krylov< Scalar > ksp;
Surcharge d’op´rateurs Le langage C++ nous offre
e ksp(A,x,b);
´galement la possibilit´ de surcharger les diff´rents
e e e return 0;
op´rateurs. Il est ainsi possible d’impl´menter un pro- }
e e
duit matrice-vecteur avec un code proche de l’´quation
e
math´matique Ax = b. Un exemple est illustr´ dans le
e e
code 6. Nous utilisons la classe Krylov<T> impl´ment´ dans
e e
la librairie petsc-cxx. Cette classe appelle les fonctions de
Code 6 Exemple de code illustrant le produit matrice- la structure KSP disponible dans PETSc. Nous passons
vecteur en petsc-cxx a
` l’instance ksp de la classe, la matrice A et les vecteurs
x et b. Le r´sultat ´tant sauvegard´ dans le vecteur b.
e e e
#include <petsc_cxx/petsc_cxx>
using namespace petsc_cxx; EPS La librairie SLEPc introduit une famille de
int main(int ac, char** av) fonctions, appel´ EPS 9 , pour le calcul des valeurs
e
{ propres. Il est indispensable de d´finir la m´thode de
e e
Parser parser(ac, av); r´solution ` utiliser parmi celles disponible :
e a
petsc_cxx::Context context(parser);
const Int N = 4; – “power”,
Matrix< Scalar > A(N,N,10); – “subspace”,
Vector< Scalar > x(N,2); – “arnoldi”,
Vector< Scalar > b = A * b; – “lanczos”,
return 0; – “krylovschur”,
} – “lapack”
– “arpack”
8. Binary Operation 9. EPS : Eigen Problem Solver
4. 3 ´
IMPLEMENTATION 4
– “blzpack”, L’algorithme 10 illustre les diff´rentes ´tapes que
e e
– “trlan”, constitue ERAM.
– “blopex”,
– “primme” Code 10 Algorithme ERAM (in :
A, n, s, l, M, V, T ol; out : 1s , Us , Rhos )
Nous utiliserons dans notre cas la m´thode d’Arnoldi.
e
1. Choix de m, V, T ol 12
La projection d’Arnoldi Nous ne pourrons aborder 2. Algorithme M A(in : A, n, s, m, V ; out : λs , Us )
la m´thode d’Arnoldi sans d´crire sa m´thode de pro-
e e e 3. Si rho_i = || A~u_i - ~lambda_i ~u_i ||
jection. L’algorithme 8 illustre ainsi la m´thode de pro-
e > Tol pour i = 1 ` s alors
a
jection d’Arnoldi aussi appel´ r´duction d’Arnoldi.
e e V = sum^s_{i=1} alpha_i . ~u_i et
aller ` l’´tape 2.
a e
Code 8 Algorithme RA (in : A, n, m, V, out : Hm, V m) Sinon Stop
1. Phase d’initialisation : Choix de m et de V (V1 =
V
||V || ) La m´thode de r´solution d’Arnoldi, int´gr´ ` SLEPc
e e e ea
2. Phase de Projection : est une m´thode ERAM. Le code 11 pr´sente un exemple
e e
d’impl´mentation de la m´thode ERAM en slepc-cxx.
e e
Pour j = 1 ` m faire
a
z = AV_j
Pour i = 1 ` m faire
a Code 11 Impl´mentation de ERAM en slepc-cxx
e
h_ij = (z,v_i) //
#include <slepc_cxx/slepc_cxx>
dot = Sigma(n,i=1)(x_i * y_i)
typedef petsc_cxx::Scalar T;
z = z - h_ij * v_i
int main(int ac, char** av)
Fin pour i
{
slepc_cxx::Parser parser(ac, av);
h_j+1,j = || z ||
petsc_cxx::Context context(parser);
v_j+1 = z / h_j+1,j
const Int N = 30;
Fin pour j
petsc_cxx::Matrix<T> A(N);
3. Hmyi = λi yi , i|m, 1
4. ui = Vm ∗ yi , i|m, 1 // Quelques routines de remplissage
// de la matrice creuse A
// ` l’aide des fonctions SLEPC.
a
Hm est une matrice d’Hessenberg inf´rieur. 10
e
slepc_cxx::EPSolver<T> eps(EPSARNOLDI);
M´thode d’Arnoldi L’algorithme 9 illustre les
e eps(A);
diff´rentes ´tapes que constitue la m´thode d’Arnoldi.
e e e
return 0;
Code 9 Algorithme MA (in : A, n, s, m, V ; out : λs , Us ) }
1. Algorithme RA(in : A, n, m, V ; out : λm , Um )
2. R´solution du probl`me de valeur propre :
e e
Hm .yi = λi .yi pour i = 1 ` m et s´lection de s
a e
M´thode hybride MERAM Une m´thode hybride
e e
valeurs propres d´sir´es
e e
est une m´thode d´finie par un ensemble de m´thodes
e e e
3. Retour dans l’espace de d´part : Ui = Vm .yi pour it´ratives qui collaborent afin d’acc´l´rer la convergence
e e ee
i=1`s a d’une entre elles.
SLEPc fournit un panel d’options pour les diff´rentes
e MERAM 13 est une m´thode hybride d´finie par un
e e
m´thodes de r´solution notamment pour Arnoldi. Il est
e e ensemble d’instances d’une mˆme m´thode it´ratives
e e e
par exemple possible d’utiliser la m´thode d’Arnoldi en
e (co-m´thodes) qui collaborent afin d’acc´l´rer la conver-
e ee
mode diff´r´ avec l’option -eps_arnoldi_delayed.
ee gence d’une entre elles.
M´thode it´rative ERAM Il 11 s’agit d’un bon
e e L’algorithme 12 illustre les diff´rentes ´tapes que
e e
repr´sentant des m´thodes it´ratives d’alg`bre lin´aire.
e e e e e constitue MERAM.
Elle contient toutes les op´rations ´l´mentaires des
e ee
m´thodes it´ratives de Krylov.
e e On cherche s valeurs et vecteurs propres d’une matrice
creuse A d’ordre n.
10. http://fr.wikipedia.org/wiki/Matrice_de_Hessenberg
11. ERAM : Explicitely Restarted Arnoldi Method 13. MERAM : Multi-ERAM
5. 4 CONCLUSION 5
Code 12 Algorithme MERAM (in : t´l´charg´ 14 , utilis´ et modifi´.
ee e e e
A, n, s, l, M, V, T ol; out : 1s , Us , Rhos )
1. Projection
2. Resolution dans le sous-espace
3. Retour dans l’espace de d´part
e
Le code 13 pr´sente un exemple d’impl´mentation de
e e
la m´thode MERAM en slepc-cxx.
e
Code 13 Impl´mentation de MERAM en slepc-cxx
e
#include <slepc_cxx/slepc_cxx>
typedef petsc_cxx::Scalar T;
int main(int ac, char** av)
{
slepc_cxx::Parser parser(ac, av);
petsc_cxx::Context context(parser);
const Int N = 30;
petsc_cxx::Matrix<T> A(N);
// Quelques routines de remplissage
// de la matrice creuse A
// ` l’aide des fonctions SLEPC.
a
slepc_cxx::EPSolver<T> eps(EPSARNOLDI);
slepc_cxx::MERAM<T> meram(eps);
meram(A);
return 0;
}
En reprenant le code d’impl´mentation de la m´thode
e e
ERAM nous incluons l’appel ` la classe MERAM dans
a
la librairie slepc-cxx effectuant les diff´rentes ´tapes cit´s
e e e
pr´c´demment.
e e
4 Conclusion
Le concept de r´utilisabilit´ a ´t´ int´gr´ en partie
e e ee e e
grˆce au librairie petsc-cxx et slepc-cxx. Nous recon-
a
naissons toutefois que la conception algorithmique
des composants de base des m´thodes num´riques
e e
reste une ´tape laborieuse. Cela explique le peu de
e
param`tres dans ces nouvelles librairies. Nous avons
e
ainsi pu aborder toute au long de ce rapport les ´tapes
e
d’installation et de configuration de l’environnement
de travail, le nouveau design pour la r´utilisabilit´ des
e e
composants de base, l’impl´mentation des op´rations
e e
de base d’alg`bre lin´aire mais aussi et surtout les
e e
m´thodes de calcul des valeurs propres en d´taillant la
e e
m´thode d’Arnoldi ainsi que les it´ratives ERAM et
e e
MERAM.
Ce papier suit les termes de la licence “GNU Free
Documentation License 1.3” et peut ˆtre librement
e 14. https ://github.com/canercandan/reusability