Reutilisabilité

5
eutilisabilit´ e enie Logiciel pour le Calcul Scientifique Caner Candan - [email protected] 6 mars 2011 esum´ e Le G´ enie Logiciel constitue l’ensemble des activit´ es permettant de d´ efinir la conception jusqu’` a la pro- duction d’un logiciel et la eutilisabilit´ e peut ˆ etre efinit comme une mani` ere de concevoir et r´ ealiser les composants de base des m´ ethodes num´ eriques de fa¸ con la plus r´ eutilisable possible. Pour les illustrer, nous utiliserons une m´ ethode it´ erative, qui contrairement aux m´ ethodes directes, se prˆ ete mieux aux matrices de grandes tailles. Elles permettent de r´ eduire la taille de la matrice en se limitant aux ´ el´ ements non-nuls. Il est ´ egalement important de noter que la m´ ethode it´ erative utilis´ ee est une m´ ethode de projection pour r´ esoudre de tr` es grandes tailles de probl` emes. Elle est constitu´ ee de 3 parties principales : la projection dans un sous-espace, la r´ esolution avec une m´ ethode classique et le retour dans l’espace de d´ epart. Nous rappelons, ci-dessous, les objectifs attendus du rapport : – se familiariser avec la eutilisabilit´ e equentielle/parall` ele ` a l’aide d’une biblioth` eque num´ erique orient´ ee composant, – utilisation des biblioth` eques PETSc, SLEPc, – impl´ ementation des op´ erations matricielles de base, de la m´ ethode it´ erative ERAM et de la m´ ethode hybride MERAM, – mise ` a l’´ echelle des exemples r´ ealis´ es en int´ egrant les composants de ces biblioth` eques dans l’environ- nement YML. 1 Installation et configuration de l’environnement Pr´ eambule Il est important, avant tout, de pr´ esenter les d´ emarches n´ ecessaires ` a l’installation et la configura- tion de l’environnement. Nous entendons principalement par environnement les librairies PETSc et SLEPc. Puis nous aborderons une m´ ethode de configuration d’un pro- jet utilisant ces librairies ` a l’aide d’outils comme CMake. Installation Utilisant un OS bas´ e sur “debian”, une “Ubuntu 10.10”, il est possible d’installer PETSc et SLEPc, sans qu’aucune compilation soit n´ ecessaire. En effet nous pouvons utiliser l’outil d’installation de pa- quets “aptitute”. Une rapide introduction est pr´ esent´ e en figure 1. $> sudo aptitude install libpetsc3.1 $> sudo aptitude install libpetsc3.1-dev $> sudo aptitude install petsc3.1-doc $> sudo aptitude install libslepc3.1 $> sudo aptitude install libslepc3.1-dev $> sudo aptitude install slepc3.1-doc Figure 1 – Commandes pour l’installation des librairies et des d´ ependances Configuration Puis pour ´ eviter les “Makefile” esordonn´ es et incompl` etes fournit dans les exemples des librairies ainsi que les variables d’environnement ` a efinir, nous pouvons faire appel ` a l’outil CMake 1 . Ce dernier facilite grandement la configuration d’un projet en PETSc 2 ou SLEPc et permet ainsi ` a quiconque une rapide prise en main des biblioth` eques utilis´ ees. De plus la configuration de CMake est multi-plateforme. Le code 1 illustre un exemple de fichier de configuration CMake pour un projet simple. Code 1 Fichier de configuration d’un projet pour le programme “hello world” en PETSc avec CMake CMAKE_MINIMUM_REQUIRED(VERSION 2.8) PROJECT(hello) FIND_PACKAGE(PETSc REQUIRED) INCLUDE_DIRECTORIES( ${PETSC_INCLUDES} ) ADD_EXECUTABLE(hello hello.cpp) TARGET_LINK_LIBRARIES(hello ${PETSC_LIBRARIES}) De la mˆ eme mani` ere il suffirait d’inclure le code 2 pour compiler un projet en SLEPc. 1. CMake : g´ en´ erateur et langage haut niveau de Makefile multi-plateforme 2. FindPETSc.cmake available from https://github.com/ jedbrown/cmake-modules/blob/master/FindPETSc.cmake 1

Transcript of Reutilisabilité

Page 1: Reutilisabilité

Reutilisabilite

Genie Logiciel pour le Calcul Scientifique

Caner Candan - [email protected]

6 mars 2011

Resume

Le Genie Logiciel constitue l’ensemble des activitespermettant de definir la conception jusqu’a la pro-duction d’un logiciel et la Reutilisabilite peut etredefinit comme une maniere de concevoir et realiser lescomposants de base des methodes numeriques de faconla plus reutilisable possible. Pour les illustrer, nousutiliserons une methode iterative, qui contrairementaux methodes directes, se prete mieux aux matrices degrandes tailles. Elles permettent de reduire la taille dela matrice en se limitant aux elements non-nuls. Il estegalement important de noter que la methode iterativeutilisee est une methode de projection pour resoudre detres grandes tailles de problemes. Elle est constituee de3 parties principales : la projection dans un sous-espace,la resolution avec une methode classique et le retourdans l’espace de depart.

Nous rappelons, ci-dessous, les objectifs attendus durapport :

– se familiariser avec la reutilisabilitesequentielle/parallele a l’aide d’une bibliothequenumerique orientee composant,

– utilisation des bibliotheques PETSc, SLEPc,– implementation des operations matricielles de base,

de la methode iterative ERAM et de la methodehybride MERAM,

– mise a l’echelle des exemples realises en integrantles composants de ces bibliotheques dans l’environ-nement YML.

1 Installation et configuration del’environnement

Preambule Il est important, avant tout, de presenterles demarches necessaires a l’installation et la configura-tion de l’environnement. Nous entendons principalementpar environnement les librairies PETSc et SLEPc. Puisnous aborderons une methode de configuration d’un pro-jet utilisant ces librairies a l’aide d’outils comme CMake.

Installation Utilisant un OS base sur “debian”, une“Ubuntu 10.10”, il est possible d’installer PETSc etSLEPc, sans qu’aucune compilation soit necessaire. En

effet nous pouvons utiliser l’outil d’installation de pa-quets “aptitute”. Une rapide introduction est presenteen figure 1.

$> sudo aptitude install libpetsc3.1

$> sudo aptitude install libpetsc3.1-dev

$> sudo aptitude install petsc3.1-doc

$> sudo aptitude install libslepc3.1

$> sudo aptitude install libslepc3.1-dev

$> sudo aptitude install slepc3.1-doc

Figure 1 – Commandes pour l’installation des librairieset des dependances

Configuration Puis pour eviter les “Makefile”desordonnes et incompletes fournit dans les exemplesdes librairies ainsi que les variables d’environnement adefinir, nous pouvons faire appel a l’outil CMake 1.

Ce dernier facilite grandement la configuration d’unprojet en PETSc 2 ou SLEPc et permet ainsi a quiconqueune rapide prise en main des bibliotheques utilisees. Deplus la configuration de CMake est multi-plateforme. Lecode 1 illustre un exemple de fichier de configurationCMake pour un projet simple.

Code 1 Fichier de configuration d’un projet pour leprogramme “hello world” en PETSc avec CMake

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

PROJECT(hello)

FIND_PACKAGE(PETSc REQUIRED)

INCLUDE_DIRECTORIES( ${PETSC_INCLUDES} )

ADD_EXECUTABLE(hello hello.cpp)

TARGET_LINK_LIBRARIES(hello ${PETSC_LIBRARIES})

De la meme maniere il suffirait d’inclure le code 2 pourcompiler un projet en SLEPc.

1. CMake : generateur et langage haut niveau de Makefilemulti-plateforme

2. FindPETSc.cmake available from https://github.com/

jedbrown/cmake-modules/blob/master/FindPETSc.cmake

1

Page 2: Reutilisabilité

2 DESIGN 2

Code 2 Configuration additionnel pour un projet enSLEPc

FIND_PACKAGE(SLEPC REQUIRED)

INCLUDE_DIRECTORIES( ${SLEPC_INCLUDES} )

TARGET_LINK_LIBRARIES(hello ${SLEPC_LIBRARIES})

2 Design

C vs C++ Les librairies PETSc 3 et SLEPc ont etedeveloppees principalement en langage C sans utilisationd’aucun paradigme de programmation. Nous avons doncchoisit de porter le code des librairies en C++ afin deprofiter du paradigme objet offert par ce dernier ainsique les concepts de meta-programmation. Deux projetsen decoulent : petsc-cxx 4 et slepc-cxx 5. Cela nous permetainsi d’utiliser ces librairies d’une maniere intuitive touten profitant d’un langage fortement type, beneficiant decontrats d’utilisation 6 et de couches d’abstraction.

petsc-cxx Pour situer le contexte de la librairie, nousutilisons l’espace de nom 7 petsc_cxx. Ainsi toutes lesclasses se situent dans ce meme contexte. Les codes 3 et 4illustrent quelques differences entre les librairies PETScet petsc-cxx.

Code 3 Exemple de code en PETSc

#include <petscsys.h>

static char help[] = "Introductory example of "

"code using PETSc.\n\n";

int main(int ac, char** av)

{

PetscInitialize(&ac, &av, (char *)0, help);

// YOUR CODE

PetscFinalize();

return 0;

}

Dans le cas de petsc-cxx le simple fait d’inclure le fi-chier d’en-tete petsc_cxx/petsc_cxx est suffisant. Il esteventuellement possible d’inclure uniquement des classesspecifiques afin d’alleger le code. Autre point, il n’estplus necessaire de faire appel a une fonction tel quePetscFinalize() a la fin du programme, ceci est faitde maniere implicite lors de la sortie du contexte dela fonction main depuis la classe petsc_cxx::Context.Cette classe, prenant en parametre un objet de typepetsc_cxx::Parser, doit etre appelee au debut duprogramme pour situer le contexte PETSc. La classe

3. Why is PETSc programmed in C, instead of For-tran or C++ ? : http://www.mcs.anl.gov/petsc/petsc-as/

documentation/faq.html#why-c

4. petsc-cxx : https://github.com/canercandan/petsc-cxx5. slepc-cxx : https://github.com/canercandan/slepc-cxx6. Interface7. Namespace

Code 4 Exemple de code en petsc-cxx

#include <petsc_cxx/petsc_cxx>

using namespace petsc_cxx;

int main(int ac, char** av)

{

Parser parser(ac, av, "Introductory "

"example "

"of code using "

"petsc-cxx.");

Context context(parser);

// YOUR CODE

return 0;

}

petsc_cxx::Parser, quant a elle indique que l’on uti-lise le gestionnaire de parametres de PETSc.

slepc-cxx Nous savons que la librairie SLEPc estdependante de PETSc, cela va de meme pour la librai-rie slepc-cxx et petsc-cxx. Nous utilisons egalement unespace de nom pour slepc-cxx, il s’agit de slepc_cxx. Lecode 5 illustre l’initialisation d’un programme en slepc-cxx. D’autres exemples vont suivre.

Code 5 Exemple de code en slepc-cxx

#include <slepc_cxx/slepc_cxx>

int main(int ac, char** av)

{

slepc_cxx::Parser parser(ac, av,

"Introductory "

"example "

"of code using "

"slepc-cxx.");

petsc_cxx::Context context(parser);

// YOUR CODE

return 0;

}

Comme nous le disions, slepc-cxx depend depetsc-cxx, c’est la raison pour laquelle nous utili-sons la classe petsc_cxx::Context avec la classeslepc_cxx::Parser. La classe slepc_cxx::Parser

permet d’utiliser le gestionnaire de parametres deSLEPc.

Fonction objet Ce nouveau design est centre autourde ce que l’on nomme des foncteurs ou encore fonctionobjet. Il s’agit d’utiliser une classe comme fonction, in-troduite en langage procedurale, tout en profitant desfonctionnalites apportees par la programmation objet.Ainsi il est possible de deleguer l’appel a une fonction ob-jet. L’instanciation du foncteur s’effectuant avant l’ap-pel, il est ainsi possible de passer des parametres a sa

Page 3: Reutilisabilité

3 IMPLEMENTATION 3

construction a travers le constructeur et d’effectuer en-suite l’appel.

Operations La classe principale que l’on nommerapetsc_cxx::BO 8, est une classe abstraite representanttoutes les operations binaires prenant 3 parametres al’appel (2 en entree et 1 en sortie). Il s’agit d’une inter-face de foncteurs. Elle impose l’implementation d’unemethode representative de la fonction d’appel.

Les classes d’operations qui heritent de la classepetsc_cxx::BO sont multiples, ci-dessous une liste non-exhaustive.

– petsc_cxx::MultiplyMatVec, pour la resolutiondu systeme lineaire Ax = b

– petsc_cxx::AdditionMatrix, pour l’addition dedeux matrices

– petsc_cxx::Dot, pour le produit scalaire de deuxvecteurs

– petsc_cxx::Scal, pour la mise a l’echelle d’un vec-teur

Structure de donnees Plusieurs types de structuresde donnees ont ete portees a ce nouveau design, ci-dessous une liste non-exhaustive.

– petsc_cxx::Scalar, represente le type scalaire– petsc_cxx::Int, represente un entier– petsc_cxx::Real, represente un reel– petsc_cxx::Truth, represente un booleen– petsc_cxx::Matrix, classe representant une ma-

trice PETSc– petsc_cxx::Vector, classe representant un vecteurPETSc

Surcharge d’operateurs Le langage C++ nous offreegalement la possibilite de surcharger les differentsoperateurs. Il est ainsi possible d’implementer un pro-duit matrice-vecteur avec un code proche de l’equationmathematique Ax = b. Un exemple est illustre dans lecode 6.

Code 6 Exemple de code illustrant le produit matrice-vecteur en petsc-cxx

#include <petsc_cxx/petsc_cxx>

using namespace petsc_cxx;

int main(int ac, char** av)

{

Parser parser(ac, av);

petsc_cxx::Context context(parser);

const Int N = 4;

Matrix< Scalar > A(N,N,10);

Vector< Scalar > x(N,2);

Vector< Scalar > b = A * b;

return 0;

}

8. Binary Operation

La variable A est instanciee avec la classe Matrix<T>.La variable x est instanciee avec la classe Vector<T>.Tous deux utilisent le type Scalar. Puis le produit deA et x est assigne a la variable b. De maniere implicitedes routines sont appelees en PETSc pour realiser leproduit. Les parametres passes a l’instance de la matricesont respectivement le nombre de lignes, le nombre decolonnes et la valeur initiale pour tous les elements dela matrice.

3 Implementation

Dans cette section nous allons voir commentimplementer des operations matricielles de bases puisnous aborderons une implementation de la methodeiterative ERAM et de la methode hybride MERAM.

Operations matricielles Le code 7 illustre le produitmatrice-vecteur sur le sous-espace de Krylov.

Code 7 Exemple de code illustrant le produit matrice-vecteur sur le sous-espace de Krylov

#include <petsc_cxx/petsc_cxx>

using namespace petsc_cxx;

int main(int ac, char** av)

{

Parser parser(ac, av);

Context context(parser);

const Int N = 4;

Matrix< Scalar > A(N,N,10);

Vector< Scalar > x(N,2);

Vector< Scalar > b(N);

Krylov< Scalar > ksp;

ksp(A,x,b);

return 0;

}

Nous utilisons la classe Krylov<T> implemente dansla librairie petsc-cxx. Cette classe appelle les fonctions dela structure KSP disponible dans PETSc. Nous passonsa l’instance ksp de la classe, la matrice A et les vecteursx et b. Le resultat etant sauvegarde dans le vecteur b.

EPS La librairie SLEPc introduit une famille defonctions, appele EPS 9, pour le calcul des valeurspropres. Il est indispensable de definir la methode deresolution a utiliser parmi celles disponible :

– “power”,– “subspace”,– “arnoldi”,– “lanczos”,– “krylovschur”,– “lapack”– “arpack”

9. EPS : Eigen Problem Solver

Page 4: Reutilisabilité

3 IMPLEMENTATION 4

– “blzpack”,– “trlan”,– “blopex”,– “primme”

Nous utiliserons dans notre cas la methode d’Arnoldi.

La projection d’Arnoldi Nous ne pourrons aborderla methode d’Arnoldi sans decrire sa methode de pro-jection. L’algorithme 8 illustre ainsi la methode de pro-jection d’Arnoldi aussi appele reduction d’Arnoldi.

Code 8 Algorithme RA (in : A,n,m, V, out : Hm,V m)

1. Phase d’initialisation : Choix de m et de V (V1 =V

||V || )

2. Phase de Projection :

Pour j = 1 a m faire

z = AV_j

Pour i = 1 a m faire

h_ij = (z,v_i) //

dot = Sigma(n,i=1)(x_i * y_i)

z = z - h_ij * v_i

Fin pour i

h_j+1,j = || z ||

v_j+1 = z / h_j+1,j

Fin pour j

3. Hmyi = λiyi, i|m, 14. ui = Vm ∗ yi, i|m, 1

Hm est une matrice d’Hessenberg inferieur. 10

Methode d’Arnoldi L’algorithme 9 illustre lesdifferentes etapes que constitue la methode d’Arnoldi.

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. Resolution du probleme de valeur propre :Hm.yi = λi.yi pour i = 1 a m et selection de svaleurs propres desirees

3. Retour dans l’espace de depart : Ui = Vm.yi pouri = 1 a s

SLEPc fournit un panel d’options pour les differentesmethodes de resolution notamment pour Arnoldi. Il estpar exemple possible d’utiliser la methode d’Arnoldi enmode differe avec l’option -eps_arnoldi_delayed.

Methode iterative ERAM Il 11 s’agit d’un bonrepresentant des methodes iteratives d’algebre lineaire.Elle contient toutes les operations elementaires desmethodes iteratives de Krylov.

10. http://fr.wikipedia.org/wiki/Matrice_de_Hessenberg

11. ERAM : Explicitely Restarted Arnoldi Method

L’algorithme 10 illustre les differentes etapes queconstitue ERAM.

Code 10 Algorithme ERAM (in :A,n, s, l,M, V, Tol; out : 1s, Us, Rhos)

1. Choix de m,V, Tol 12

2. Algorithme MA(in : A,n, s,m, V ; out : λs, Us)

3. Si rho_i = || A~u_i - ~lambda_i ~u_i ||\

> Tol pour i = 1 a s alors

V = sum^s_{i=1} alpha_i . ~u_i et\

aller a l’etape 2.

Sinon Stop

La methode de resolution d’Arnoldi, integre a SLEPcest une methode ERAM. Le code 11 presente un exempled’implementation de la methode ERAM en slepc-cxx.

Code 11 Implementation de ERAM en slepc-cxx

#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

// a l’aide des fonctions SLEPC.

slepc_cxx::EPSolver<T> eps(EPSARNOLDI);

eps(A);

return 0;

}

Methode hybride MERAM Une methode hybrideest une methode definie par un ensemble de methodesiteratives qui collaborent afin d’accelerer la convergenced’une entre elles.

MERAM 13 est une methode hybride definie par unensemble d’instances d’une meme methode iteratives(co-methodes) qui collaborent afin d’accelerer la conver-gence d’une entre elles.

L’algorithme 12 illustre les differentes etapes queconstitue MERAM.

On cherche s valeurs et vecteurs propres d’une matricecreuse A d’ordre n.

13. MERAM : Multi-ERAM

Page 5: Reutilisabilité

4 CONCLUSION 5

Code 12 Algorithme MERAM (in :A,n, s, l,M, V, Tol; out : 1s, Us, Rhos)

1. Projection

2. Resolution dans le sous-espace

3. Retour dans l’espace de depart

Le code 13 presente un exemple d’implementation dela methode MERAM en slepc-cxx.

Code 13 Implementation de MERAM en slepc-cxx

#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

// a l’aide des fonctions SLEPC.

slepc_cxx::EPSolver<T> eps(EPSARNOLDI);

slepc_cxx::MERAM<T> meram(eps);

meram(A);

return 0;

}

En reprenant le code d’implementation de la methodeERAM nous incluons l’appel a la classe MERAM dansla librairie slepc-cxx effectuant les differentes etapes citesprecedemment.

4 Conclusion

Le concept de reutilisabilite a ete integre en partiegrace au librairie petsc-cxx et slepc-cxx. Nous recon-naissons toutefois que la conception algorithmiquedes composants de base des methodes numeriquesreste une etape laborieuse. Cela explique le peu deparametres dans ces nouvelles librairies. Nous avonsainsi pu aborder toute au long de ce rapport les etapesd’installation et de configuration de l’environnementde travail, le nouveau design pour la reutilisabilite descomposants de base, l’implementation des operationsde base d’algebre lineaire mais aussi et surtout lesmethodes de calcul des valeurs propres en detaillant lamethode d’Arnoldi ainsi que les iteratives ERAM etMERAM.

Ce papier suit les termes de la licence “GNU FreeDocumentation License 1.3” et peut etre librement

telecharge 14, utilise et modifie.

14. https ://github.com/canercandan/reusability