Ceci est une ancienne révision du document !
Outils de compilation
Pour choisir parmi les différentes versions de ces outils, il faut utiliser la commande module
- 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)
- Outils GNU: gcc (différentes versions suivant les machines), gfortran (s'installe très bien sur OSX (Leopard) voir le site http://hpc.sourceforge.net/)
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 |
Utilisation des compilateurs
- Linkers & Loaders document de 300 pages
Fortran
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 |
C
nemo-henry% cc -fast -xtarget=opteron -xarch=amd64 prog1.c -o prog1
C++
nemo-henry% CC -fast -xtarget=opteron -xarch=amd64 prog1.CC -o progr1
Remarques
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.
Options de compilation
Compilation 64 bits
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
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
flags utiles pour le C++
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.
flags pour le fortran
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
recompiler un logiciel sur nemo avec Sun Studio
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
utilisation de LD_LIBRARY_PATH
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
- outils installes sur nemo
Optimisation
utilisation de librairies optimisées
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…
Générer un core
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
debugger un programme compilé avec Mpich
<path_to_mpich>/bin/mpirun -dbg=dbx -np 2 ./code3d
Apres, il suffit de taper run, pour lancer l'exécution.
debugger un programme compilé avec Sun HPC
nemo-henry% mprun -np 1 dbx ./heat_1d_sparse
Apres, il suffit de taper run, pour lancer l'exécution.
debug avec dtrace
FPE (floating point exception)
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