Ceci est une ancienne révision du document !
La version de PGI à utiliser sur les systèmes Debian est la 15.1.
Pour pouvoir utiliser PGI 15.1, il faut d'abord charger l'environnement correspondant :
e5-2670comp3:~> source /usr/local/modeles/pgi-15.1
Cette commande redéfinit les variables d'environnement PATH, LD_LIBRARY_PATH et MANPATH pour contenir les chemins vers les répertoires des binaires PGI (compilateurs, debugger, profiler, …), des libraires PGI et respectivement des manuels en ligne d'utilisation (les man pages).
Pour vérifier que cette étape s'est bien effectuée, on peut par exemple chercher si la commande pgfortran est reconnue et voir si elle concerne bien la version 15.1 :
e5-2670comp3:~> which pgfortran /softs/pgi/linux86-64/15.1/bin/pgfortran e5-2670comp3:~> pgfortran -V pgfortran 15.1-0 64-bit target on x86-64 Linux -tp sandybridge The Portland Group - PGI Compilers and Tools Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
Les compilateurs et les autres binaires fournis par SGI se trouvent dans le répertoire bin de l'installation :
e5-2670comp3:~> ls /softs/pgi/linux86-64/15.1/bin/ acc1rc pgacclnk pgf901 pgnvvm acclin8664rc pgappend pgf902 pgobjinfo CcffReader.jar pgasm pgf90_ex pgocld ccrc pgc pgf90rc pgocld64rc change-pgi-hostid pgc++ pgf95 pgocldlinrc cppcurc pgcc pgfortran pgocldrc cpprc pgCC pgftnc pgoffcl c++rc pgc_ex pgftn_ex pgoprun fnativerc pgcollect pgftnrc pgprepro ganymed-ssh2-build251.jar pgcollectrc pggdecode pgprof iparc pgcollin64rc pggpp1 pgprofrc jide-common.jar pgcollinrc pggpp2 pgroupd jide-dock.jar PGcomp.jar pggpp2ex pgsampt jpgdbg.jar pgcpp pghpf pgserv Jpgprof.jar pgcpp1 pghpf1 pgsize libamdocl64.so pgcpp2 pghpf1_ex pgsmart lin8664rc pgcpp2ex pghpf2 pgsupport lin86rc pgcpuid pghpfrc pgtjavarc llvm-as pgcudainit pgicg pgtlinrc llvm-link pgdbg pgi_license_tool pgtoolsrc lmborrow pgdbglinrc pgimport pgtxwinrc lmgrd pgdbgrc pgipa pgunzip lmgrd.rc pgdebug PGlaf.jar PGutil.jar lmutil pgdecode pgmicd pgzip localrc pgdisasm pgmicd64rc rsyntaxtextarea.jar makelocalrc pgevtofq pgmicdlinrc sqlite4java.jar mpirun_dbg.pgdbg pgexplain.xml pgmicdrc versionrc nativerc pgextract pgnvd x8664rc optopgprof pgf77 pgnvd64rc x86rc pgaccelerror pgf77rc pgnvdlinrc pgaccelinfo pgf90 pgnvdrc
Notons les binaires suivants :
Binaire | Description |
---|---|
pgfortran | compilateur Fortran 2003 capable OpenMP et auto-parallélisation |
pgcc | compilateur ANSI C capable OpenMP et auto-parallélisation |
pgc++ | compilateur ANSI C++ capable OpenMP et auto-parallélisation |
pgprof | profileur graphique MPI, OpenMP et multi-thread |
pgdbg | débogueur graphique MPI, OpenMP et multi-thread |
Parmi les options des compilateurs, notons les plus courrantes (pour une liste complète de ces options ou pour plus de détails pour chaque option, consulter la page de manuel, p.ex. man pgfortran) :
Option | Description |
---|---|
-c | Generate intermediate object file but does not attempt to link |
-g | Adds information for debugging to the object file and/or executable |
-I <directory> | Tells the preprocessor to search in directory for include or module files |
-L <directory> | Tells the linker to search in directory for libraries |
-r8 | Promotes REALs from the default size of 4 bytes to 8 bytes |
-i8 | Promotes INTEGERs from the default size of 4 bytes to 8 bytes |
-O3 | Higher level of optimization than -O2 (the default optimization level) |
-fast | Higher optimization level than -O3 |
-Mipa | Tells the compiler to perform interprocedural analysis. Can be very time consuming toperform. This flag should also be used in both compilation and linking steps |
-Mconcur | Enables autoparallelization. Additional options can be used with -Mconcur to provide morefine-grained control of autoparallelization |
-Minfo | Instructs the compiler to report optimizations that are made |
-Mneginfo | Instructs the compiler to report optimizations that are not made |
-mp | Enables parallelization via OpenMP directives |
Des exemples type de codes source pour évaluer les capacité du compilateur PGI sont disponibles dans le répertoire /softs/pgi/common/EXAMPLES.
e5-2670comp3:~> ls -l /softs/pgi/common/EXAMPLES dr-xr-xr-x 3 root root 4096 mars 9 2012 fftpde dr-xr-xr-x 4 root root 4096 mars 9 2012 linpack dr-xr-xr-x 2 root root 4096 mars 9 2012 matmul dr-xr-xr-x 8 root root 4096 mars 9 2012 MPI -r--r--r-- 1 root root 659 mars 9 2012 README
Pour tester ces benchmarks, il faut copier ces répertoires sur le compte utilisateur.
Exemplifions ici l'utilisation du benchmark matmul (multiplication de deux matrices) :
e5-2670comp3:~> ls -l /softs/pgi/common/EXAMPLES/matmul -r-xr-xr-x 1 root root 54 mars 9 2012 buildf77 -r-xr-xr-x 1 root root 51 mars 9 2012 buildf77mp -r-xr-xr-x 1 root root 62 mars 9 2012 buildf90 -r-xr-xr-x 1 root root 59 mars 9 2012 buildf90mp -r-xr-xr-x 1 root root 64 mars 9 2012 buildhpf -r--r--r-- 1 root root 2556 mars 9 2012 matmul.F -r--r--r-- 1 root root 6464 mars 9 2012 README
Le code source Fortran est donné est contenu dans le fichier matmul.F, alors que les scripts build* contiennent la commande de compilation pour plusieurs modes (compilateurs pgf77, pgf90, pghpf avec ou sans auto-parallélisation/OpenMP).
Le lancement de ces scripts génère les exécutables correspondants : matmul_f77, matmul_f77mp, matmul_f90, matmul_f90mp,matmul_hpf.
Leur exécution peut alors être faite. Par défaut, on utilise un seul processeur. Le nombre de processeurs utilisés peut être modifié par :
- pour l'auto-parallelisation (matmul_f77, matmul_f90)
setenv NCPUS 2
- pour la parallelisation avec OpenMP (matmul_f77mp, matmul_f90mp)
setenv NCPUS 2
- pour HPF : rajouter -pghpf -np 2 au moment de l'exécution.
Voici le résultat de ces exécutions pour 1 et 2 processeurs :
e5-2670comp3:~/Tests/tests_PGI/matmul> ./matmul_f77 2.0000001E-03 0.0000000E+00 9.9999998E-03 9.9999998E-03 M = 200, N = 200, P = 200 MFLOPS = 7980.000 c(1,1) = 200.0000000000000 e5-2670comp3:~/Tests/tests_PGI/matmul> setenv NCPUS 2 e5-2670comp3:~/Tests/tests_PGI/matmul> ./matmul_f77 4.0000002E-03 0.0000000E+00 2.0000000E-02 2.0000000E-02 M = 200, N = 200, P = 200 MFLOPS = 3990.000 c(1,1) = 200.0000000000000 e5-2670comp3:~/Tests/tests_PGI/matmul> setenv NCPUS 1 e5-2670comp3:~/Tests/tests_PGI/matmul> ./matmul_f90 2.0000001E-03 0.000000 9.9999998E-03 9.9999998E-03 M = 200 , N = 200 , P = 200 MFLOPS = 7980.000 c(1,1) = 200.0000000000000 e5-2670comp3:~/Tests/tests_PGI/matmul> setenv NCPUS 2 e5-2670comp3:~/Tests/tests_PGI/matmul> ./matmul_f90 4.0000002E-03 0.000000 2.0000000E-02 2.0000000E-02 M = 200 , N = 200 , P = 200 MFLOPS = 3990.000 c(1,1) = 200.0000000000000 e5-2670comp3:~/Tests/tests_PGI/matmul> setenv NCPUS 1 e5-2670comp3:~/Tests/tests_PGI/matmul> ./matmul_f77mp 2.0000001E-03 0.0000000E+00 9.9999998E-03 9.9999998E-03 M = 200, N = 200, P = 200 MFLOPS = 7980.000 c(1,1) = 200.0000000000000 e5-2670comp3:~/Tests/tests_PGI/matmul> setenv OMP_NUM_THREADS 2 e5-2670comp3:~/Tests/tests_PGI/matmul> ./matmul_f77mp 4.0000002E-03 0.0000000E+00 2.0000000E-02 2.0000000E-02 M = 200, N = 200, P = 200 MFLOPS = 3990.000 c(1,1) = 200.0000000000000 e5-2670comp3:~/Tests/tests_PGI/matmul> setenv OMP_NUM_THREADS 1 e5-2670comp3:~/Tests/tests_PGI/matmul> ./matmul_f90mp 2.0000001E-03 0.000000 9.9999998E-03 9.9999998E-03 M = 200 , N = 200 , P = 200 MFLOPS = 7980.000 c(1,1) = 200.0000000000000 e5-2670comp3:~/Tests/tests_PGI/matmul> setenv OMP_NUM_THREADS 2 e5-2670comp3:~/Tests/tests_PGI/matmul> ./matmul_f90mp 2.0000001E-03 0.000000 9.9999998E-03 9.9999998E-03 M = 200 , N = 200 , P = 200 MFLOPS = 7980.000 c(1,1) = 200.0000000000000 e5-2670comp3:~/Tests/tests_PGI/matmul> setenv NCPUS 1 e5-2670comp3:~/Tests/tests_PGI/matmul> setenv OMP_NUM_THREADS 1 e5-2670comp3:~/Tests/tests_PGI/matmul> ./matmul_hpf 2.0000001E-03 0.000000 9.9999998E-03 9.9999998E-03 M = 200 , N = 200 , P = 200 MFLOPS = 7980.000 c(1,1) = 200.0000000000000 e5-2670comp3:~/Tests/tests_PGI/matmul> ./matmul_hpf -pghpf -np 2 4.0000002E-03 0.000000 2.0000000E-02 2.0000000E-02 M = 200 , N = 200 , P = 200 MFLOPS = 3990.000 c(1,1) = 200.0000000000000