%%\documentclass[11pt]{article}
\documentclass[a4paper,12pt]{article}
\usepackage{vmargin}
\usepackage{color}
%
% Start of Header
%
\usepackage[francais]{babel}
\usepackage{fancyhdr}
\usepackage{fancybox}
\renewcommand{\headrulewidth}{0.5pt}
\renewcommand{\footskip}{20pt}
\pagestyle{fancy}

\usepackage{verbatim}
\usepackage[latin1]{inputenc}
\usepackage[dvips]{graphicx}
\usepackage{afterpage}
\usepackage{amsmath,amssymb}
\usepackage{mathrsfs}

\newcommand{\DESC}{\item {\bf Description~:}}
\newcommand{\VERSION}{\item {\bf Version courante~:}}
\newcommand{\URLADDR}{\item {\bf Site web du projet~:}}
\newcommand{\URLDOWNLOAD}{\item {\bf Téléchargement~:}}
\newcommand{\USERGUIDE}{\item {\bf Documentation~:}}
\newcommand{\FORUM}{\item {\bf Forum de discussions~:}}
\newcommand{\APPLICATIONS}{\item {\bf Principales applications~:}}
\newcommand{\FAITSMARQUANTS}{\item {\bf Faits marquants~:}}
\newcommand{\FUNC}{\item {\bf Fonctionnalités~:}}

\begin{document}

\thispagestyle{empty}

\includegraphics{pastix_logo_small2_old.jpg} 

\begin{center}

\vspace*{\fill}

{\huge{PaStiX : principales fonctionnalités}} \\
\vspace*{2.5cm}
\huge{http://pastix.gforge.inria.fr}
\vspace*{\fill}

\today
\end{center}

\newpage

\tableofcontents

\newpage

\section{PASTIX}

\begin{description}

\DESC

\begin{itemize}
\item La bibliothèque scientifique PaStiX
implémente un solveur parallèle hautes performances pour la résolution
de très grands systèmes linéaires creux utilisant une algorithmique
par bloc. 

\item Ce solveur est basé sur une méthode directe supernodale et
propose également des factorisations incomplètes de type $ILU(k)$.

\item Il supporte à la fois des factorisations de type $LL^t$, $LDL^t$ et
$LU$ (pour des matrices à structure symétrique) et utilise une
technique de type ``pivotage statique'' couplée à plusieurs
types de solveurs itératifs (CG, GMRES, ...). 

\item Les arithmétiques
flottantes et complexes sont disponibles en simple et double précision.
Une programmation hybride MPI+Thread a été développée pour s'adapter
le plus efficacement possible aux nouvelles architectures de type
clusteur de n\oe uds SMP ou multic\oe urs.

\item La bibliothèque PaStiX est distribuée sous la licence INRIA
CeCILL. Les bibliothèques BLAS, MPI et Thread POSIX sont requises pour
son installation.
\end{itemize}

\VERSION ~5.1.1

\URLADDR
\begin{itemize}
\item {\tt http://pastix.gforge.inria.fr}
\end{itemize}

\URLDOWNLOAD
\begin{itemize}
\item {\tt http://gforge.inria.fr/frs/?group\_id=186}
\end{itemize}

\USERGUIDE
\begin{itemize}
\item {\tt http://gforge.inria.fr/docman/index.php?group\_id=186}
\end{itemize}

\FORUM
\begin{itemize}
\item {\tt http://gforge.inria.fr/forum/?group\_id=186}
\end{itemize}

\APPLICATIONS

Initialement le solveur PaStiX été développé pour le ``Commissariat
à l'Energie Atomique'' (CEA/DAM/CESTA) dans le contexte d'un code de
mécanique des structures puis pour des applications en
électro-magnétisme.
Depuis, il est également utilisé dans le logiciel FLUIDBOX pour des
applications en mécanique des fluides et dans le code de
magnéto-hydro-dynamique JOREK autour du projet ITER.

\FAITSMARQUANTS

La version directe du solveur PaStiX a permis au
CEA/CESTA de résoudre un système linéaire de plus de 83 millions
d'inconnues dans le contexte d'un code d'électro-magnétisme 3D en
variable complexe. Sur le supercalculateur TERA-10 du CEA, la
résolution de ce système, nécessitant environ 5 Petaflops, a été
obtenue en 5 heures sur 768 processeurs. A notre connaissance, il
s'agit du plus grand système résolu à ce jour par une méthode directe
pour ce type de problème.

\section%[Fonctionnalités]
{Principales fonctionnalités}

\subsection%[MPI+Thread]
{Parallélisme MPI + Thread}

Le solveur PaStiX utilise une programmation hybride MPI+Thread particulièrement adaptée aux nouvelles architectures de type clusteur de n\oe uds SMP ou multic\oe urs. Il s'agit, à notre connaissance, du premier solveur direct utilisant pleinement ce modèle de programmation.

Il s'agit certainement de la fonctionnalité du solveur qui permet d'obtenir les gains les plus importants en performance mais surtout en économie mémoire.
Il faut cependant noter que ce modèle peut poser des problèmes lors de l'intégration d'une bibliothèque de ce type avec un code utilisateur n'utilisant pas ce modèle de programmation.

D'une manière idéale, l'utilisateur doit réserver et placer un processus MPI par n\oe ud SMP ou multic\oe ur. C'est le solveur qui s'occupe de créer, d'exécuter puis de terminer des threads dans chaque processus MPI lors de la factorisation et de la résolution numérique. Le nombre de thread est fixé à l'aide de l'option {\tt IPARM\_THREAD\_NBR} et devrait correspondre au nombre de processeurs ou de c\oe urs physiques présents sur le n\oe ud. 

\subsection%[ILU(k)]
{Factorisation incomplète de type ILU(k)}

Le solveur PaStiX a été initialement développé pour implémenter un solveur parallèle basé sur une méthode directe supernodale. Mais il a été dérivé pour pouvoir être utilisé comme un préconditionneur, basé sur une factorisation incomplète de type ILU(k), couplé avec des méthodes itératives.

L'objectif est de trouver un compromis entre une diminution
importante de la taille mémoire pour stocker la matrice factorisée par une
méthode directe, et une conservation d'une certaine dose de
remplissage (les blocs conservés seront toujours considérés comme
pleins) pour exploiter suffisamment les effets super-scalaires dans les
calculs BLAS3 du préconditionneur et atteindre globalement de bonnes
performances en temps. Bien sûr, cette méthode conserve les techniques de
renumérotation et de distribution/ordonnancement 
%(cette dernière étant nécessairement adaptée au calcul incomplet de la matrice par blocs du préconditionneur) 
pour avoir une implémentation parallèle efficace
du calcul par blocs du préconditionneur et des itérés.

Il est nécessaire d'activer cette option à l'aide du paramètre {\tt IPARM\_INCOMPLETE}, puis de régler le niveau de remplissage $k$ avec le paramètre {\tt IPARM\_LEVEL\_OF\_FILL}, et enfin augmenter la valeur par défaut du niveau d'amalgamation ou choisir une amalgamation automatique avec le paramètre {\tt IPARM\_AMALGAMATION\_LEVEL}.

Plusieurs types de raffinement itératifs sont implémentés en interne~:
\begin{itemize}
\item Gradient Conjugué, pour des systèmes symétriques.
\item GMRES, pour des systèmes non-symétriques. Il est possible de définir la taille maximale de l'espace de Krylov ainsi que le critère d'arrêt et le nombre d'itérations maximum.
\end{itemize}

\subsection%[Out-of-Core]
{Implémentation Out-of-Core}
Une version ``Out-of-Core'' de notre solveur a été implémentée. 
Les supern\oe uds et les blocs de
contributions sont stockés sur disque en anticipant de manière optimale
les opérations d'entrée/sortie pour recouvrir les temps d'accès aux
disques par des calculs.
Les mécanismes de pagination ont été implémentés en utilisant des primitives standards d'entrée/sortie mais, il est envisagé, dans les évolutions futures, d'utiliser des appels bas niveau plus performants.

Pour utiliser cette fonctionnalité, il faut compiler le solveur avec l'option {\tt -DOOC}. Ensuite, il est nécessaire de fixer la taille mémoire maximale disponible (exprimée en Mo) à l'aide de l'option {\tt IPARM\_OOC\_LIMIT}.
%Ensuite, il est possible de choisir le nombre de threads d'entrée/sortie à l'aide de l'option {\tt IPARM\_OOC\_THREAD}.

Dans la version courante, le fonctionnement ``Out-of-Core'' est instable sur certaines architectures avec un parallélisme de type MPI. C'est pourquoi il est recommandé de n'utiliser cette fonctionnalité qu'avec la version séquentielle ou multi-threads du solveur.

\subsection%[Interface parallèle]
{Interface parallèle}
Dans le cadre de la parallélisation des étapes de prétraitement, 
l'utilisateur a la possibilité d'appeler notre
solveur en donnant une matrice distribuée (assemblée ou non) et de
tirer avantage de l'utilisation des outils de renumérotation
parallèles (PT-Scotch ou Par-Metis). 
L'interface utilisateur est fonctionnelle mais la parallélisation de l'étape de
factorisation symbolique par bloc est encore en développement.

Pour utiliser cette fonctionnalité, il est nécessaire de compiler le solveur avec l'option {\tt -DDISTRIBUTED}. De même que pour la version avec une matrice centralisée, le graphe de la matrice est donné en paramètre en utilisant le format CSC. La distribution de la matrice sur les processeurs est spécifiée à l'aide d'un vecteur supplémentaire ({\tt loc2glob}) qui exprime la correspondance entre les indices des colonnes locales et globales.

\section%[Renumérotation]
{Adapter la renumérotation}

Il est critique de régler les paramètres de la bibliothèque (externe) de renuméro\-ta\-tion (SCOTCH ou METIS par exemple). La bibliothèque SCOTCH est nécessaire à l'installation du solveur PaStiX (la bibliothèque METIS est optionnelle), et il est possible d'ajuster, à travers l'interface du solveur, quelques paramètres pouvant influencer la qualité de la renumérotation pour le parallélisme et le remplissage.
%\begin{itemize}
%\item {\tt switch} : donne la taille 
%\item {\tt cmin} :
%\item {\tt cmax} :
%\item {\tt frat} :
%\end{itemize}

Pour remplacer l'appel à SCOTCH (par défaut) par un appel à METIS il suffit de compiler le solveur avec l'option {\tt -DMETIS}.

\section%[Performance]
{Optimisations de la performance}

Dans cette section, nous donnons, dans {\bf un ordre à priori décroissant d'influence}, les paramètres ayant un impact sur la performance.

\subsection%[Blocage]
{Choisir le facteur de blocage}

Cette option correspond aux paramètres {\tt IPARM\_MIN\_BLOCKSIZE} et {\tt IPARM\_MAX\_ BLOCKSIZE}. Ils permettent de choisir la taille minimale et maximale des blocs denses. Le facteur de blocage dépend essentiellement de la bibliothèque BLAS utilisée. La valeur 60 est couramment utilisée.

\subsection%[Allocation]
{Allouer les données au plus près du processeur}

Cette option de compilation ({\tt -DNUMA\_ALLOC}) est activée par défaut.
Elle a été principalement développée dans le cadre des travaux sur l'adaptation aux architectures NUMA (Non Uniform Memory Acces). Elle apporte un gain de l'ordre de 5\% sur une machine cible avec des accès homogènes à la mémoire (n\oe uds SMP) et de plus de 15\% pour des machines NUMA.

\subsection%[Thread Bind]
{Associer une thread à un processeur}

Suivant les architectures, le système d'exploitation aura tendance à ``visser'' les threads POSIX sur des processeurs ou au contraire les faire migrer d'un processeur à un autre suivant sa charge. Dans un cadre normal de fonctionnement du solveur, il devrait y avoir une thread de calcul par processeur ou c\oe ur physique; il est donc souhaitable de ne pas autoriser le système d'exploitation à migrer les threads en affectant une thread à un processeur ou à un c\oe ur.

Cette option correspond au paramètre {\tt IPARM\_THREAD\_COMM\_MODE}.
%Il est possible de spécifier un des modes suivants~:
%\begin{itemize}
%\item {\tt API\_BIND\_AUTO} :
%\item {\tt API\_BIND\_TAB} :
%\end{itemize}
Dans certains cas particulier (comme l'utilisation du solveur pour résoudre des systèmes distincts en parallèle avec des communicateurs MPI différents), il est nécessaire de spécifier un vecteur de placement (à l'aide de la fonction {\tt pastix\_setBind}) indiquant quelle thread doit être associée à quel processeur ou c\oe ur.

\subsection%[Thread de communication]
{Utiliser une ou plusieurs threads dédiées aux communications}

Dans le cadre de travaux sur le ré-ordonnancement dynamique interne du solveur, un nouveau mode de communication a été implémenté. Par défaut, chaque tâche de calcul est responsable de l'envoi et de la réception de ses données. 
Ce nouveau schéma, utilise une (ou plusieurs) thread de communication supplémentaire qui prend en charge, au niveau du processus MPI, la réception (et l'ajout des contributions associées), et s'occupe également de faire progresser les communications.

Pour activer cette option, il est nécessaire de compiler le solveur avec l'option {\tt -DTHREAD\_COMM}. 
%Il est ensuite utile de spécifier un des modes suivant~:
%\begin{itemize}
%\item {\tt API\_THCOMM\_ONE} :
%\item {\tt API\_THCOMM\_DEFINED} :
%\item {\tt API\_THCOMM\_NBPROC} :
%\end{itemize}
Dans ce cas, les échanges de données utilisent des communications persistantes.
Autrement, il est possible d'activer l'utilisation des réceptions non bloquantes avec l'option de compilation {\tt -DTEST\_IRECV}.

\subsection%[Modèle]
{Adapter les modèles}

Il est possible d'ajuster les modèles de calcul BLAS ainsi que des modèles des échanges sur le réseaux et en mémoire partagée.
Ces modèles sont utilisés par l'ordonnancement statique du solveur.
Cette procédure d'adaptation n'est pas automatique, mais des scripts sont disponibles pour effectuer des mesures sur l'architecture cible et générer les modèles correspondants.

%\subsection%[ABS]
%{ABS}

%\subsection%[ESP]
%{ESP}

\section%[Mémoire]
{Optimisations de la mémoire}

Dans cette section, nous donnons, dans {\bf un ordre à priori décroissant d'influence}, les paramètres ayant un impact sur la mémoire.

\subsection%[Amalgamation]
{Régler le niveau d'amalgamation}

Cette option correspond au paramètre {\tt IPARM\_AMALGAMATION\_LEVEL}.
Le réglage de ce paramètre est particulièrement important si le solveur est utilisé comme préconditionneur avec une factorisation incomplète.
Généralement, il est conseillé d'utiliser une valeur autour de 5\% dans le cas d'une factorisation directe et autour de 40\% pour des factorisations incomplètes (ou une valeur négative pour utiliser un critère automatique).

\subsection%[Gestion interne]
{Gestion des données internes}

Il est possible d'indiquer au solveur qu'il peut dés-allouer~:
\begin{itemize}
\item la matrice CSC de l'utilisateur (option {\tt IPARM\_FREE\_CSCUSER}), à la fin de l'initialisation des coefficients dans les structures internes du solveur.
\item la matrice CSC interne du solveur (option {\tt IPARM\_FREE\_CSCPASTIX}), mais dans ce cas, il ne sera pas possible d'appliquer un raffinement itératif sur la solution.
\end{itemize}

\section%[Restrictions MPI]
{Restrictions MPI}

%\subsection%[MPI Thread]
%{Support des threads par MPI}

L'option de compilation {\tt -DPASTIX\_FUNNELED} permet d'activer un mode dégradé des échanges de message à utiliser si la bibliothèque MPI ne supporte pas le mode {\tt MPI\_THREAD\_MULTIPLE}.

%\subsection%[MPI Type]
%{Support des types par MPI}

L'option de compilation {\tt -DNO\_MPI\_TYPE} permet de supprimer l'utilisation des types MPI pour la construction des messages. 

\end{description}

\end{document}

\section%[Numérique]
{Optimisations numériques}

\subsection%[Prétraitement]
{Appliquer un prétraitement numérique}

Le solveur PaStiX ne propose pas, en interne, de prétraitement numérique.
Mais il est connu que renforcer

\subsection%[Raffinement]
{Activer et choisir un raffinement itératif}

Le solveur PaStiX implémente, en interne, plusieurs types de raffinement itératifs~:
\begin{itemize}
\item Gradient Conjugué, pour des systèmes symétriques.
\item GMRES, pour des systèmes non-symétriques. Il est possible de définir la taille de l'espace de Krylov ainsi que le critère d'arrêt et le nombre d'itérations maximum.
\end{itemize}

\subsection%[Pivotage statique]
{Régler le pivotage statique}

Cette option correspond au paramètre {\tt DPARM\_EPSILON\_REFINEMENT}.

\section%[Divers]
{Options diverses}

\subsection%[Type de factorisation]
{Choix du type de factorisation}

Il est possible de choisir à l'exécution le type de factorisation souhaitée.

\subsection%[Arithmétique]
{Choix de l'arithmétique}

Il est possible de choisir à la compilation le type d'arithmétique souhaité.

\subsection%[Verbosité]
{Choix du niveau verbosité}

Cette option correspond au paramètre {\tt IPARM\_VERBOSE}. Il est possible de choisir un des mode suivants~:
\begin{itemize}
\item {\tt API\_VERBOSE\_NOT} :
\item {\tt API\_VERBOSE\_NO} :
\item {\tt API\_VERBOSE\_YES} :
\end{itemize}


\end{description}

\end{document}
