====== Outils de compilation ====== Pour choisir parmi les différentes versions de ces outils, il faut utiliser la commande [[http://modules.sourceforge.net/|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/]]) * [[compilateurs_sun|Outils Sun]] (gratuit pour linux et solaris): Sun f90, f95, installé sur octopus, nemo, shrek (pour installer sur un portable linux: [[http://developers.sun.com/sunstudio/downloads/express_readme.html|Lien externe]]) * Outils Intel (non gratuit): Intel Fortran Compiler (ifc) , installé sur slatp et shrek (pour installer sur un portable linux: [[http://www.latp.univ-mrs.fr/%7Ehenry/fortran_90_intel.html|portable linux]]) ===== la commande module ===== 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 ===== Utilisation des compilateurs ===== * [[http://blogs.sun.com/BestPerf/entry/free_compiler_wins_nehalem_race|une doc pour comparer les options entre SunStudio et GCC ]] * [[http://norfs.sourceforge.net/linkers_and_loaders.pdf|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 | * [[http://docs.sun.com/app/docs/doc/819-5263|Sun Studio 12: Fortran User's Guide]] * [[http://docs.sun.com/app/docs/doc/819-5262|Sun Studio 12: Fortran Programming Guide]] ==== 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 * [[Autres exemples C++]] * [[http://math.nist.gov/~RPozo/c++class/| C++ Programming for Scientists]] ==== Remarques ==== __option -fast__ attention à l'utilisation de cette [[http://blogs.sun.com/run/entry/optimization_shortcut_with_fast|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) -xarch=amd64 (ou meme -xtarget=opteron -xarch=amd64) sinon -xtarget=generic64 (devrait marcher aussi avec compilateurs gnu) \\ __ autres possibilités__ \\ (une fois le programme débuggé, ajouter [[http://blogs.sun.com/run/entry/optimization_shortcut_with_fast|-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 \\ [[http://docs.sun.com/app/docs/doc/819-0690/chapter4-1?a=view|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 ==== 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[=] Display messages with tags; ={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/toot.cc", line 16: Error, badfunccp: The function "asinh" must have a prototype. 2 Error(s) detected. ==== flags pour le fortran ==== voir [[http://www.fortran-2000.com/ArnaudRecipes/CompilerTricks.html|Compiler and tools tricks]] et [[http://www.faqs.org/faqs/fortran-faq/ |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 ==== * [[http://prefetch.net/articles/linkers.badldlibrary.html|LD_LIBRARY_PATH workarounds]] ====== Mesures de temps, analyse de performances ====== Se reporter à ce [[http://www.metz.supelec.fr/~vialle/course/TRS-2/Chapitre-02-note-EJ-perf.pdf|document]] pour les définitions et le document [[http://www.obs.ujf-grenoble.fr/SCCI/index.php?option=com_content&task=view&id=6&Itemid=8|Déboguage et Analyse de programme]] de l'observatoire de Grenoble. \\ Pour utiliser les outils spécifiques à la machine nemo, lire le [[http://iusti.polytech.univ-mrs.fr/~jobic/dokuwiki/doku.php?id=profiling|document]] * [[calcul_pers_mes|outils]] installes sur nemo ====== Optimisation ====== ==== utilisation de librairies optimisées ==== Le {{:calcul:librairies.pdf|document}} conteint une étude d'un certain nombre de librairies optimisées. ====== parallélisme ====== ====== Quelques benches locaux ====== * [[benches]] ====== Le debug ====== * [[http://blogs.sun.com/dbx/entry/gdb_vs_dbx_commands_mapping|Gdb vs. dbx feature comparison]] * utiliser list pour voir le source * utiliser "stop at " pour poser un point d'arret à la 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 [[http://www.rz.rwth-aachen.de/computing/info/sun/primer/primer_V3.0.html#6.3.1.dbx|aussi]] ===== debugger un programme compilé avec 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. ([[http://technopark02.blogspot.com/2005/12/sun-studio-debugging-multi-threaded.html|Sun Studio: debugging a multi-threaded application w/ dbx]]) ===== debug avec dtrace ===== [[http://docs.sun.com/source/819-4131-10/Dtrace.html|Using the DTrace Utility With Sun MPI ]] ===== 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