Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
Dernière révisionLes deux révisions suivantes
documentation:tools:testspgi [2015/04/28 13:21] – [Tests de fonctionnement et performance pgi et cuda fortran] cicalugadocumentation:tools:testspgi [2020/08/25 15:58] – modification externe 127.0.0.1
Ligne 1: Ligne 1:
-====== Tests de fonctionnement et performance pgi et CUDA fortran ======+====== Tests de fonctionnement et performance PGI et CUDA Fortran ======
  
-{{INLINETOC}} 
-===== Benchmarks ===== 
  
-Plusieurs tests de fonctionnement et de performance de ces cartes sont présentés : +===== PGI 15.1 sur les systèmes Debian =====
  
-==== Tests de détection matériel et logiciel ====+La version de PGI à utiliser sur les systèmes Debian est la 15.1.
  
-Avec la commande linux lspci (qui affiche la liste de périphériques PCIdont les cartes GPU) :+==== Environnement de travail ==== 
 + 
 +Pour pouvoir utiliser PGI 15.1il faut d'abord charger l'environnement correspondant 
  
 <code bash>  <code bash> 
-c82gpgpu34:~> lspci -v | grep -i nvidia +e5-2670comp3:~> source /usr/local/modeles/pgi-15.
-05:00.0 3D controller: NVIDIA Corporation GK110GL [Tesla K20m] (rev a1) +
- Subsystem: NVIDIA Corporation Device 1015 +
- Kernel driver in use: nvidia +
-83:00.0 3D controller: NVIDIA Corporation GK110GL [Tesla K20m] (rev a1) +
- Subsystem: NVIDIA Corporation Device 1015 +
- Kernel driver in use: nvidia+
 </code> </code>
  
-Cette commande ne retourne rien si lancée sur les serveurs de compilations (p.ex. e5-2670comp1puisqu'il n'y a pas de carte GPU installée+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).
  
-La sortie précédente est obtenue sur un noeud de calcul qui dispose de cartes GPU (dans cet exemple il s'agit du noeud c82gpgpu34 qui dispose de 2 cartes Tesla K20). +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 :
- +
-La commande linux lsmod affiche l'état et la liste de modules chargés du noyau Linux :+
  
 <code bash>  <code bash> 
-c82gpgpu34:~> lsmod | grep nvidia +e5-2670comp3:~> which pgfortran 
-nvidia_uvm             33340  0  +/softs/pgi/linux86-64/15.1/bin/pgfortran
-nvidia              10492298  nvidia_uvm +
-i2c_core               23876  4 i2c_algo_bit,igb,i2c_i801,nvidia +
-</code>+
  
-Pour afficher la version du driver CUDA installé : +e5-2670comp3:~> pgfortran -V 
-<code bash>  +pgfortran 15.1-0 64-bit target on x86-64 Linux -tp sandybridge  
-c82gpgpu34:~> cat /proc/driver/nvidia/version +The Portland Group - PGI Compilers and Tools 
-NVRM version: NVIDIA UNIX x86_64 Kernel Module  340.65  Tue Dec  2 09:50:34 PST 2014 +Copyright (c) 2015, NVIDIA CORPORATION All rights reserved
-GCC version:  gcc version 4.6.3 (Debian 4.6.3-14) +
 </code> </code>
  
-Pour afficher la version du CUDA Toolkit installé :+==== Compilateurs et autres outils ==== 
 + 
 +Les compilateurs et les autres binaires fournis par SGI se trouvent dans le répertoire bin de l'installation : 
 <code bash>  <code bash> 
-c82gpgpu34:~> nvcc - +e5-2670comp3:~> ls /softs/pgi/linux86-64/15.1/bin/ 
-nvcc: NVIDIA (R) Cuda compiler driver +acc1rc    pgacclnk   pgf901     pgnvvm 
-Copyright (c) 2005-2013 NVIDIA Corporation +acclin8664rc    pgappend   pgf902     pgobjinfo 
-Built on Wed_Jul_17_18:36:13_PDT_2013 +CcffReader.jar    pgasm   pgf90_ex     pgocld 
-Cuda compilation tools, release 5.5, V5.5.0+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
 </code> </code>
  
-nvcc est le compilateur fourni dans le driver pour compiler des programmes CUDA (il appelle le compilateur gcc pour compiler le code C) +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 | 
  
-**Uns autre possibilité** (hors commandes Linux) pour détecter la présence et le type de GPUS NVIDIA est de faire appel au programme deviceQuery dont le source .cpp est contenu dans la suite NVIDIA_GPU_Computing_SDK (devenue NVIDIA_CUDA-x.y_Samples dans les versions x.y récentes). Après compilation, ce programme détecte les périphériques "CUDA-capable" du système. Ci-après le output de cette exécution sur un noueud avec des GPUs NVIDIA K20 :+==== Options de compilation ====
  
-<code bash>  +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) :
-c82gpgpu34:~> cd NVIDIA_GPU_Computing_SDK +
-c82gpgpu34:~/NVIDIA_GPU_Computing_SDK~> ./C/bin/linux/release/deviceQuery+
  
-./C/bin/linux/release/deviceQuery Starting...+^ 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 analysisCan be very time consuming toperformThis flag should also be used in both compilation and linking steps | 
 +| -Mconcur | Enables autoparallelizationAdditional 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 |
  
- CUDA Device Query (Runtime API) version (CUDART static linking) 
  
-Found 2 CUDA Capable device(s)+==== Tests de performance ====
  
-Device 0: "Tesla K20m" +Des exemples type de codes source pour évaluer les capacité du compilateur PGI sont disponibles dans le répertoire /softs/pgi/common/EXAMPLES (des nouveaux exemples n'ont pas été fournis avec la version PGI 2015) :
-  CUDA Driver Version Runtime Version          6.5 5.5 +
-  CUDA Capability Major/Minor version number:    3.5 +
-  Total amount of global memory:                 4800 MBytes (5032706048 bytes) +
-MapSMtoCores SM 3.5 is undefined (please update to the latest SDK)! +
-MapSMtoCores SM 3.5 is undefined (please update to the latest SDK)! +
-  (13) Multiprocessors x (-1) CUDA Cores/MP:     -13 CUDA Cores +
-  GPU Clock Speed:                               0.71 GHz +
-  Memory Clock rate:                             2600.00 Mhz +
-  Memory Bus Width:                              320-bit +
-  L2 Cache Size:                                 1310720 bytes +
-  Max Texture Dimension Size (x,y,z            1D=(65536), 2D=(65536,65536), 3D=(4096,4096,4096) +
-  Max Layered Texture Size (dim) x layers        1D=(16384) x 2048, 2D=(16384,16384) x 2048 +
-  Total amount of constant memory              65536 bytes +
-  Total amount of shared memory per block:       49152 bytes +
-  Total number of registers available per block: 65536 +
-  Warp size:                                     32 +
-  Maximum number of threads per block:           1024 +
-  Maximum sizes of each dimension of a block:    1024 x 1024 x 64 +
-  Maximum sizes of each dimension of a grid:     2147483647 x 65535 x 65535 +
-  Maximum memory pitch:                          2147483647 bytes +
-  Texture alignment:                             512 bytes +
-  Concurrent copy and execution:                 Yes with 2 copy engine(s) +
-  Run time limit on kernels:                     No +
-  Integrated GPU sharing Host Memory:            No +
-  Support host page-locked memory mapping:       Yes +
-  Concurrent kernel execution:                   Yes +
-  Alignment requirement for Surfaces:            Yes +
-  Device has ECC support enabled:                Yes +
-  Device is using TCC driver mode:               No +
-  Device supports Unified Addressing (UVA):      Yes +
-  Device PCI Bus ID / PCI location ID:           5 / 0 +
-  Compute Mode: +
-     < Exclusive Process (many threads in one process is able to use ::cudaSetDevice() with this device) >+
  
-Device 1: "Tesla K20m" +<code bash>  
-  CUDA Driver Version Runtime Version          6.5 5.5 +e5-2670comp3:~> ls -l /softs/pgi/common/EXAMPLES 
-  CUDA Capability Major/Minor version number:    3.5 +dr-xr-xr-x 3 root root 4096 mars    2012 fftpde 
-  Total amount of global memory:                 4800 MBytes (5032706048 bytes) +dr-xr-xr-x 4 root root 4096 mars    2012 linpack 
-MapSMtoCores SM 3.5 is undefined (please update to the latest SDK)! +dr-xr-xr-x 2 root root 4096 mars    2012 matmul 
-MapSMtoCores SM 3.5 is undefined (please update to the latest SDK)! +dr-xr-xr-x 8 root root 4096 mars    2012 MPI 
-  (13) Multiprocessors x (-1) CUDA Cores/MP:     -13 CUDA Cores +-r--r--r-- 1 root root  659 mars    2012 README 
-  GPU Clock Speed:                               0.71 GHz +</code>
-  Memory Clock rate:                             2600.00 Mhz +
-  Memory Bus Width:                              320-bit +
-  L2 Cache Size:                                 1310720 bytes +
-  Max Texture Dimension Size (x,y,z)             1D=(65536), 2D=(65536,65536), 3D=(4096,4096,4096) +
-  Max Layered Texture Size (dim) x layers        1D=(16384) x 2048, 2D=(16384,16384) x 2048 +
-  Total amount of constant memory:               65536 bytes +
-  Total amount of shared memory per block:       49152 bytes +
-  Total number of registers available per block: 65536 +
-  Warp size:                                     32 +
-  Maximum number of threads per block:           1024 +
-  Maximum sizes of each dimension of a block:    1024 1024 x 64 +
-  Maximum sizes of each dimension of a grid:     2147483647 x 65535 x 65535 +
-  Maximum memory pitch:                          2147483647 bytes +
-  Texture alignment:                             512 bytes +
-  Concurrent copy and execution:                 Yes with copy engine(s) +
-  Run time limit on kernels:                     No +
-  Integrated GPU sharing Host Memory:            No +
-  Support host page-locked memory mapping:       Yes +
-  Concurrent kernel execution:                   Yes +
-  Alignment requirement for Surfaces:            Yes +
-  Device has ECC support enabled:                Yes +
-  Device is using TCC driver mode:               No +
-  Device supports Unified Addressing (UVA):      Yes +
-  Device PCI Bus ID PCI location ID:           131 / 0 +
-  Compute Mode: +
-     < Exclusive Process (many threads in one process is able to use ::cudaSetDevice() with this device) >+
  
-deviceQueryCUDA Driver = CUDART, CUDA Driver Version = 6.5, CUDA Runtime Version = 5.5, NumDevs = 2, Device = Tesla K20m, Device = Tesla K20m+Pour tester ces benchmarksil faut copier ces répertoires sur le compte utilisateur.
  
 +Exemplifions ici l'utilisation du benchmark matmul (multiplication de deux matrices) :
 +
 +<code bash> 
 +e5-2670comp3:~> ls -l /softs/pgi/common/EXAMPLES/matmul
 +-r-xr-xr-x 1 root root   54 mars    2012 buildf77
 +-r-xr-xr-x 1 root root   51 mars    2012 buildf77mp
 +-r-xr-xr-x 1 root root   62 mars    2012 buildf90
 +-r-xr-xr-x 1 root root   59 mars    2012 buildf90mp
 +-r-xr-xr-x 1 root root   64 mars    2012 buildhpf
 +-r--r--r-- 1 root root 2556 mars    2012 matmul.F
 +-r--r--r-- 1 root root 6464 mars    2012 README
 </code> </code>
  
-==== Test de la bande passante ====+Le code source Fortran 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).
  
-Un autre test fourni avec NVIDIA_GPU_Computing_SDK est le programme bandwidthTestAprès la compilation du programme source .cpp, son exécution donne la largeur de la bande pour trois transferts qui doivent être pris en compte dans le développement de codes CUDA +<code bash>  
-  * transfert depuis CPU sur le GPU +e5-2670comp3:~> cat /softs/pgi/common/EXAMPLES/matmul/buildf77 
-  * transfert depuis GPU sur le CPU +pgf77 -fast -Mconcur -Minfo matmul.F -o matmul_f77 -V 
-  * transfert depuis GPU sur le GPU (intra GPU) +e5-2670comp3:~> cat /softs/pgi/common/EXAMPLES/matmul/buildf90 
-Ci-dessous la sortie complète de ce programme sur le même noeud que précédemment :+pgf90 -fast -Mconcur -Minfo -DPGF90 matmul.F -o matmul_f90 -V 
 +e5-2670comp3:~> cat /softs/pgi/common/EXAMPLES/matmul/buildf90mp 
 +pgf90 -fast -mp -Minfo -DPGF90 matmul.F -o matmul_f90mp -V 
 +e5-2670comp3:~> cat /softs/pgi/common/EXAMPLES/matmul/buildf77mp 
 +pgf77 -fast -mp -Minfo matmul.F -o matmul_f77mp -V 
 +e5-2670comp3:~> cat /softs/pgi/common/EXAMPLES/matmul/buildhpf 
 +pghpf -fast -Mautopar -Minfo -DPGF90  matmul.F -o matmul_hpf -V 
 +</code>
  
 +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)
 <code bash>  <code bash> 
-c82gpgpu34:~> cd NVIDIA_GPU_Computing_SDK +setenv NCPUS 2 
-c82gpgpu34:~.C//bin/linux/release/bandwidthTest +</code>
  
-./C/bin/linux/release/bandwidthTest Starting...+- pour la parallelisation avec OpenMP (matmul_f77mp, matmul_f90mp) 
 +<code bash>  
 +setenv OMP_NUM_THREADS 2 
 +</code>
  
-Running on...+- pour HPF : rajouter -pghpf -np 2 au moment de l'exécution.
  
- Device 0: Tesla K20m +Voici le résultat de ces exécutions pour 1 et 2 processeurs : 
- Quick Mode+ 
 +<code bash>  
 +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     
  
- Host to Device Bandwidth, Device(s), Paged memory +e5-2670comp3:~/Tests/tests_PGI/matmul> setenv NCPUS 1 
-   Transfer Size (Bytes) Bandwidth(MB/s) +e5-2670comp3:~/Tests/tests_PGI/matmul> ./matmul_f90 
-   33554432 3819.7+   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     
  
- Device to Host Bandwidth1 Device(s)Paged memory +e5-2670comp3:~/Tests/tests_PGI/matmul> setenv NCPUS 1 
-   Transfer Size (Bytes) Bandwidth(MB/s) +e5-2670comp3:~/Tests/tests_PGI/matmul> ./matmul_f77mp  
-   33554432 3381.9+   2.0000001E-03  0.0000000E+00  9.9999998E-03  9.9999998E-03 
 + M =         200N =         200P =         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     
  
- Device to Device Bandwidth, Device(s) +e5-2670comp3:~/Tests/tests_PGI/matmul> setenv OMP_NUM_THREADS 1 
-   Transfer Size (Bytes) Bandwidth(MB/s) +e5-2670comp3:~/Tests/tests_PGI/matmul> ./matmul_f90mp 
-   33554432 143586.3+   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       
 </code> </code>