developpement

Outils de compilation

Pour choisir parmi les différentes versions de ces outils, il faut utiliser la commande module

  • Outils GNU: gcc (différentes versions suivant les machines), gfortran (s'installe très bien sur MacOSX voir le site http://hpc.sourceforge.net/)
  • Outils Sun (gratuit pour linux et solaris): Sun f90, f95, installé sur octopus, nemo, shrek (pour installer sur un portable linux: Lien externe)
  • Outils Intel (non gratuit): Intel Fortran Compiler (ifc) , installé sur slatp et shrek (pour installer sur un portable linux: portable linux)

Elle est disponible sur les serveurs de calcul, pour le shell tcsh

Contexte Commande Commentaires
Quelles sont les possibilités ? module avail donne la liste des modules (softs) installés sur le calculateur
Quels modules sont chargés ? module list les modules déjà chargés
Changer de compilateurs, de versions, … module purge permet de nettoyer le path et les variables d'environnement
charger un soft module load matlab charge la version la plus récente
module load matlab/7.1.0 charge une version spécifique

Pour le shell bash, rajouter la commande suivante dans .bashrc:

. /local/apps/Modules/3.2.6/init/bash

choisir le compilateur

module load sunstudio 

et pour changer vers gfortran:

module purge
module load gfortran

Penser à module help pour obtenir des détails

Précision sunstudio gnu Commentaires
32 bits f90 -fast -fsimple=0 -fns=no -xnolibmopt -xmodel=medium -KPIC mat.f90 -M ../droniou/hsl2007 -o mat gfortran -O5 -fbackslash -fintrinsic-modules-path../droniou/hsl2007 -c mod_interface_hsl.f90 sunstudio: Il est recommandé de rajouter -fsimple=0 -fns=no -xnolibmopt pour ne pas avoir l'aliasing sur les données
64 bits f90 -fast -fsimple=0 -fns=no -xnolibmopt -xmodel=medium -KPIC -dalign -m64 mat.f90 -o mat gfortran -O5 -m64 -fbackslash -fintrinsic-modules-path../droniou/hsl2007 -c mod_interface_hsl.f90 sunstudio:Il est recommandé de rajouter -dalign pour le 64 bits
nemo-henry% cc -fast -xtarget=opteron -xarch=amd64 prog1.c -o prog1 
nemo-henry% CC -fast -xtarget=opteron -xarch=amd64 prog1.CC -o progr1 

option -fast attention à l'utilisation de cette option, surtout si le binaire doit tourner sur différentes machines

path Par défaut, le path est réduit à:

/usr/bin:/bin:/usr/sbin:/usr/ccs/bin:/usr/openwin/bin:/usr/dt/bin:/opt/SUNWspro/bin:/usr/sfw/bin:/opt/csw/bin:/usr/local/bin:.

Sur nemo:

 setenv PATH /opt/SUNWhpc/bin:${PATH} 

permet d'utiliser le MPI de Sun (MPI-1 et 2)

setenv PATH /usr/local/mpich-1.2.7p1/ch_shmem/bin:${PATH}

permet d'utiliser MPICH (MPI-1 uniquement)

Pour utiliser le fortran d'Intel sur shrek:

             source /opt/intel/fc/9.0/bin/ifortvars.csh

Pour utiliser le fortran de Sun sur shrek: A la date d'octobre 05, l'utilisation de ce compilateur nécessite quelques aménagements. La variable d'environnement MALLOC_CHECK_ doit etre positionnee a 1:

setenv MALLOC_CHECK_ 1

L'édition de liens doit se faire en ajoutant les parametres suivants:

-R/usr/lib/gcc/i386-redhat-linux/4.0.1 -L/usr/lib/gcc/i386-redhat-linux/4.0.1 -lgcc_s

Par exemple:

f90 STOK.f90 -R/usr/lib/gcc/i386-redhat-linux/4.0.1 -L/usr/lib/gcc/i386-redhat-linux/4.0.1 -lgcc_s

Autres exemples:

setenv HYPRE_DIR /local/henry/hypre-1.6.0-amd64
mpf77 -o matqb matqb.f -g -dalign -xtarget=opteron -xarch=amd64 \
-I/opt/SUNWhpc/include \
-L/opt/SUNWhpc/lib/amd64 \
-R/opt/SUNWhpc/lib/amd64 -lmpi_mt \
-L${HYPRE_DIR}/src/hypre/lib \
-lHYPRE_DistributedMatrix \
 -lHYPRE_DistributedMatrixPilutSolver -lHYPRE_Euclid -lHYPRE_FEI \
 -lHYPRE_IJ_mv  -lHYPRE_LSI -lHYPRE_MatrixMatrix -lHYPRE_ParaSails \
 -lHYPRE_blas -lHYPRE_parcsr_ls -lHYPRE_parcsr_mv -lHYPRE_seq_mv \
 -lHYPRE_sstruct_ls  -lHYPRE_sstruct_mv -lHYPRE_struct_ls \
 -lHYPRE_struct_mv -lHYPRE_superlu  -lHYPRE_utilities -lkrylov

Cette commande permet de compiler le programme matqb en Fortran 77, en utilisant le MPI de Sun, sur nemo. Il n'y a aucune optimisation.

setenv HYPRE_DIR /usr/local/hypre-1.6.0
setenv MPI_DIR /usr/local/mpich-1.2.7p1/ch_shmem
${MPI_DIR}/bin/mpif77 -o matqb matqb.f -dalign -xtarget=opteron -xarch=amd64 \
-I${MPI_DIR}/include \
-L${MPI_DIR}/lib \
-R${MPI_DIR}/lib \
-L${HYPRE_DIR}/lib \
-lHYPRE_DistributedMatrix \
 -lHYPRE_DistributedMatrixPilutSolver -lHYPRE_Euclid -lHYPRE_FEI \
 -lHYPRE_IJ_mv  -lHYPRE_LSI -lHYPRE_MatrixMatrix -lHYPRE_ParaSails \
 -lHYPRE_blas -lHYPRE_parcsr_ls -lHYPRE_parcsr_mv -lHYPRE_seq_mv \
 -lHYPRE_sstruct_ls  -lHYPRE_sstruct_mv -lHYPRE_struct_ls \
 -lHYPRE_struct_mv -lHYPRE_superlu  -lHYPRE_utilities -lkrylov

Cette commande permet de compiler le programme matqb en Fortran 77, en utilisant MPICH, sur nemo.

par défaut, la compilation se fait en 32 bits. Pour compiler en 64 bits avec les outils Sun, il faut ajouter: “-m64”. Ne pas oublier d'utiliser la dernière version du compilateur (module load ss12 sur nemo)

<code> -xarch=amd64 (ou meme -xtarget=opteron -xarch=amd64) </code> sinon <code> -xtarget=generic64 (devrait marcher aussi avec compilateurs gnu) </code>

autres possibilités
(une fois le programme débuggé, ajouter -fast, ou -fast -xO4 (car -fast se limite a O3) Par exemple:

-xO4 -xdepend -xcrossfile=1 -dalign -xinline=%auto

Une séquence d'optimisation éprouvée:

-xO1 -KPIC -xtarget=opteron -xarch=amd64 -xmodel=medium

sur nemo

Notes sur -KPIC
Position-Independent Code
si on tombe sur l'erreur:
ld.so.1: exe: fatal: relocation error: R_AMD64_32: file /net/Krill/mmg/minjeaud/PELICANS/PelicansRef/lib/nemo-CC/libpel0.so: symbol (unknown): value 0xfffffd7ffe800000 does not fit

ici, c'est la lib UMFPACK qui n'a pas été compilée avec cette option!

Tips: Sur nemo, ne pas utiliser –static pour gcc lors de l'edition de liens

On peut retrouver les options utilisées pour compiler un programme avec la commande dump:

nemo-henry% dump -c matqb
...
   <53732>      initfcmn.f
   <53743>      V=10.0;DBG_GEN=5.0.8;sn;backend;R=Sun Fortran 95 8.2 Patch 121020-03 2006/07/27;O
   <53825>      /local/henry/mumps+mpich/mpich-1.2.7p1/src/fortran/src/;/opt/SUNWspro/prod/bin/f90 -xO1 -KPIC -xtarget=opteron -xarch=amd64 -xmodel=medium -I/local/henry/mumps+mpich/mpich-1.2.7p1/src/fortran/src -c  initfcmn.f

Pour utiliser petsc (compilé avec MPICH 1.2.6), il faut ajouter le chemin de la façon suivante:

              source /etc/scripts/petsc.csh pour petsc en 64 bits
              source /etc/scripts/petsc32.csh pour petsc en 32 bits (nécessaire pour pelicans)

Exemples

sur nemo:
setenv MPICH_F90 "f90 -fast -xtarget=opteron -xarch=amd64"
mpif90 -o pair_impair pair_impair.f90
mpirun -np 4 pair_impair

Avant d'executer, ne pas oublier de creer un fichier ~/.rhosts, contenant:

nemo:4
sur sparc
hobbit-henry% cc -DRELEASE=\"1.6\" -fast -xO4 -xtarget=generic64  hexdump.c -o hexdump
cc: Warning: -xarch=generic64 is deprecated, use -m64 to create 64-bit programs
cc: Warning: illegal option -xtarget=generic64
"hexdump.c", line 195: warning: old-style declaration or incorrect type for: main
"hexdump.c", line 216: warning: implicit function declaration: exit

pour trouver certaines macros, ou comprendre pourquoi une compilation échoue:

 -v                    Same as -verbose=diags
-Xm                   Support dollar character in C++ identifiers 
-errtags[=<b>]        Display messages with tags; <b>={yes|no}
+w                    Print warnings about additional questionable constructs

Exemple:

nemo-henry% CC +w -v -Xm -xlibmopt -errtags=yes /tmp/toot.cc -library=stlport4 -lm
###     command line files and options (expanded):
### +w -v -features=iddollar -xlibmopt -errtags=yes /tmp/toot.cc -lm -library=no%Cstd,stlport4 
### CC: Note: NLSPATH = /opt/SUNWspro/prod/bin/../lib/locale/%L/LC_MESSAGES/%N.cat:/opt/SUNWspro/prod/bin/../../lib/locale/%L/LC_MESSAGES/%N.cat
/opt/SUNWspro/prod/bin/ccfe -y-o -ytoot.o +w -y-fbe -y/opt/SUNWspro/prod/bin/fbe -features=iddollar -y-xarch=generic -y-xtab -y-verbose -O0 -ptf /tmp/17052%1.%2 -ptx /opt/SUNWspro/prod/bin/CC -ptk "+w -v -Xm -xlibmopt -errtags=yes -library=stlport4  -xs " -D__SunOS_5_10 -D__SUNPRO_CC=0x580 -Dunix -Dsun -Di386 -D__i386 -D__unix -D__sun -D__BUILTIN_VA_ARG_INCR -D__SVR4 -D__SUNPRO_CC_COMPAT=5 -xdbggen=no%dwarf2+stabs -y-s -xdbggen=incl -I-xbuiltin -errtags -xldscope=global -instlib=/opt/SUNWspro/prod/lib/stlport4/libstlport.a -I/opt/SUNWspro/prod/include/CC/stlport4 -I/opt/SUNWspro/prod/include/CC -I/opt/SUNWspro/prod/include/CC/rw7 -I/opt/SUNWspro/prod/include/cc -y-comdat /tmp/toot.cc -s /tmp/ccfe.17052.0.s >&/tmp/ccfe.17052.1.err
rm /tmp/ccfe.17052.0.s
/opt/SUNWspro/prod/bin/stdlibfilt -stderr </tmp/ccfe.17052.1.err
"/tmp/toot.cc", line 7: Error, badinclfile: Could not open include file<math>.
"/tmp/toot.cc", line 16: Error, badfunccp: The function "asinh" must have a prototype.
2 Error(s) detected.

voir Compiler and tools tricks et aussi:

2.2.1) I have heard of fortran "lints" what are they, and where can
       I get one?
...
       Sun
          provides a syntax checking facility (triggered by Xlist)
          with their Fortran 77 product (3.0.1 and beyond).

Utiliser les flags suivants pour compiler, sur nemo

 -g -C -stackvar -fpover -ftrap=%none -e -fpp -m64

sur calypso/mombasa:

 -g -C -stackvar -xcheck=init_local -fpover -ftrap=%none -e -fpp -m64

Par exmple, savoir si une variable n'est pas utilisée avant d'etre affectée:

          -xcheck=init_local
              Perform special initialization of local variables.

              With this option the compiler initializes local
              variables to a value that is likely to cause an
              arithmetic exception if it is used before it is
              assigned by the program. Memory allocated by the
              ALLOCATE statement will also be initialized in this
              manner.

              SAVE variables, module variables, and variables in
              COMMON blocks are not initialized.  no%init_local
              disables this initialization and is the default.

mais Il y a une différence entre nemo et calypso/mombasa:

f90: Warning: The option -xcheck=init_local has no effect on x86

et donc, si on veut pouvoir faire cette vérification, il faut compiler sur calypso/mombasa

Les principaux problèmes viennent de ce que les headers de certaines librairies ne sont pas dans /usr/include, il faut donc ajouter des options au configure pour voir aboutir la procédure.

Sur nemo, bien respecter les opérations suivantes avant de recompiler un source:

setenv JDS_CBE_ENV_QUIET
source /opt/jdsbld/bin/env.csh

Après, pour une version 32 bits:

./configure \
CPPFLAGS="-I/usr/gnu/include -I/usr/gnu/include/ncurses" \
LDFLAGS="-R/usr/gnu/lib -L/usr/gnu/lib" \
LIBS="-lsunperf" | & tee CONFIGURE.LOG

suivi de make:

make |& tee MAKE.LOG

et en 64 bits:

./configure \
CXXFLAGS="-m64 -fast" \
CPPFLAGS="-I/usr/gnu/include -I/usr/gnu/include/ncurses" \
LDFLAGS="-R/usr/gnu/lib/amd64 -L/usr/gnu/lib/amd64" \
LIBS="-lsunperf" | & tee CONFIGURE.LOG

Mesures de temps, analyse de performances

Se reporter à ce document pour les définitions et le document Déboguage et Analyse de programme de l'observatoire de Grenoble.
Pour utiliser les outils spécifiques à la machine nemo, lire le document

Optimisation

Le document conteint une étude d'un certain nombre de librairies optimisées.

parallélisme

Quelques benches locaux

Le debug

  • utiliser list pour voir le source
  • utiliser “stop at <ligne>” pour poser un point d'arret à la ligne <ligne>
  • utiliser run pour démarrer l'exécution du programme
  • utiliser step pour passer à l'instruction suivante
  • utiliser cont pour continuer l'exécution jusqu'au prochain point d'arret
  • user (et abuser) de la commande print pour voir le contenu des variables
  • dans tous les cas, penser à utiliser la commande help…

en csh/tcsh:

limit
unlimit coredumpsize

Lancer le programme:

/opt/SUNWhpc/bin/mprun -np 2 ./dsimpletest < input_simpletest_real

qui genere un core

dbx dsimpletest core

Voir aussi

<path_to_mpich>/bin/mpirun -dbg=dbx -np 2 ./code3d

Apres, il suffit de taper run, pour lancer l'exécution.

nemo-henry% mprun -np 1 dbx ./heat_1d_sparse

Apres, il suffit de taper run, pour lancer l'exécution.

(Sun Studio: debugging a multi-threaded application w/ dbx)

Lorsque le code se termine par:



on peut utiliser le debugger pour trouver la cause. Il faut que le programme soit compilé avec l'option -g, puis on lance:

nemo-henry% dbx suchic
For information about new features see `help changes'
To remove this message, put `dbxenv suppress_startup_message 7.5' in your .dbxrc
Reading suchic
Reading ld.so.1
Reading libfui.so.2
Reading libfai.so.1
Reading libfsu.so.1
Reading libsunmath.so.1
Reading libmtsk.so.1
Reading libm.so.2
Reading libc.so.1
Reading libm.so.1
Reading libdl.so.1
Reading libpthread.so.1
(dbx) 

Il suffit de taper la commande “catch fpe”:

 catch fpe                                                              
(dbx) run     
Running: suchic 
(process id 27832)
...
t@1 (l@1) signal FPE (invalid floating point operation) in MAIN at line 116 in file "suchic.f90"
  116             if (x0>varitt) varitt = x0
(dbx) print x0
x0 = NaN

Ici, la cause de l'exception est le dépassement de valeur pour x0

  • developpement.txt
  • Dernière modification: 2017/08/25 09:56
  • (modification externe)