Afficher la pageAnciennes révisionsLiens de retourHaut de page Cette page est en lecture seule. Vous pouvez afficher le texte source, mais ne pourrez pas le modifier. Contactez votre administrateur si vous pensez qu'il s'agit d'une erreur. ====== 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** <note> ^ 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 | </note> Pour le shell bash, rajouter la commande suivante dans .bashrc: <code> . /local/apps/Modules/3.2.6/init/bash </code> ===== 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 === <code> module load sunstudio </code> et pour changer vers gfortran: <code> module purge module load gfortran </code> 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 ==== <code> nemo-henry% cc -fast -xtarget=opteron -xarch=amd64 prog1.c -o prog1 </code> ==== C++ ==== <code> nemo-henry% CC -fast -xtarget=opteron -xarch=amd64 prog1.CC -o progr1 </code> * [[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 à: <code> /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:. </code> Sur nemo: <code> setenv PATH /opt/SUNWhpc/bin:${PATH} </code> permet d'utiliser le MPI de Sun (MPI-1 et 2) <code>setenv PATH /usr/local/mpich-1.2.7p1/ch_shmem/bin:${PATH}</code> permet d'utiliser MPICH (MPI-1 uniquement) Pour utiliser le fortran d'Intel sur shrek: <code> source /opt/intel/fc/9.0/bin/ifortvars.csh</code> 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: <code>setenv MALLOC_CHECK_ 1</code> L'édition de liens doit se faire en ajoutant les parametres suivants: <code>-R/usr/lib/gcc/i386-redhat-linux/4.0.1 -L/usr/lib/gcc/i386-redhat-linux/4.0.1 -lgcc_s</code> Par exemple: <code> 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 </code> Autres exemples: <code> 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 </code> 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. <code> 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 </code> 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) <del><code> -xarch=amd64 (ou meme -xtarget=opteron -xarch=amd64) </code> sinon <code> -xtarget=generic64 (devrait marcher aussi avec compilateurs gnu) </code></del> \\ __ 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: <code> -xO4 -xdepend -xcrossfile=1 -dalign -xinline=%auto </code> Une séquence d'optimisation éprouvée: <code> -xO1 -KPIC -xtarget=opteron -xarch=amd64 -xmodel=medium </code> sur nemo <note important> 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: <code> 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 </code> ici, c'est la lib UMFPACK qui n'a pas été compilée avec cette option! </note> <note tip>Tips: Sur nemo, ne pas utiliser --static pour gcc lors de l'edition de liens </note> On peut retrouver les options utilisées pour compiler un programme avec la commande dump: <code> 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 </code> 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: == <code> setenv MPICH_F90 "f90 -fast -xtarget=opteron -xarch=amd64" mpif90 -o pair_impair pair_impair.f90 mpirun -np 4 pair_impair </code> Avant d'executer, ne pas oublier de creer un fichier ~/.rhosts, contenant: <code> nemo:4 </code> == sur sparc == <code> 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 </code> ==== flags utiles pour le C++ ==== pour trouver certaines macros, ou comprendre pourquoi une compilation échoue: <code> -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 </code> Exemple: <code> 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. </code> ==== 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]]: <code> 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). </code> Utiliser les flags suivants pour compiler, sur nemo <code> -g -C -stackvar -fpover -ftrap=%none -e -fpp -m64 </code> sur calypso/mombasa: <code> -g -C -stackvar -xcheck=init_local -fpover -ftrap=%none -e -fpp -m64 </code> Par exmple, savoir si une variable n'est pas utilisée avant d'etre affectée: <code> -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. </code> mais Il y a une différence entre nemo et calypso/mombasa: <code> f90: Warning: The option -xcheck=init_local has no effect on x86 </code> 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: <code> setenv JDS_CBE_ENV_QUIET source /opt/jdsbld/bin/env.csh </code> Après, pour une version 32 bits: <code> ./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 </code> suivi de make: <code> make |& tee MAKE.LOG </code> et en 64 bits: <code> ./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 </code> ==== 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 <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: <code> limit unlimit coredumpsize </code> Lancer le programme: <code> /opt/SUNWhpc/bin/mprun -np 2 ./dsimpletest < input_simpletest_real </code> qui genere un core <code> dbx dsimpletest core </code> 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 ===== <code> <path_to_mpich>/bin/mpirun -dbg=dbx -np 2 ./code3d </code> Apres, il suffit de taper run, pour lancer l'exécution. ===== debugger un programme compilé avec Sun HPC ===== <code> nemo-henry% mprun -np 1 dbx ./heat_1d_sparse </code> 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: <code> </code> on peut utiliser le debugger pour trouver la cause. Il faut que le programme soit compilé avec l'option -g, puis on lance: <code> 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) </code> Il suffit de taper la commande "catch fpe": <code> 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 </code> Ici, la cause de l'exception est le dépassement de valeur pour x0 developpement.txt Dernière modification : 2017/08/25 09:56de 127.0.0.1