OpenACC Tutorial - Profiling/fr: Difference between revisions

Updating to match new version of source page
(Updating to match new version of source page)
(Updating to match new version of source page)
Line 111: Line 111:
From the above output, the <code>matvec()</code> function is responsible for 83.5% of the execution time, and this function call can be found in the <code>main()</code> function.
From the above output, the <code>matvec()</code> function is responsible for 83.5% of the execution time, and this function call can be found in the <code>main()</code> function.


<div class="mw-translate-fuzzy">
==Renseignements sur le compilateur==
==Renseignements sur le compilateur==
Avant de travailler sur la routine, nous devons comprendre ce que fait le compilateur; posons-nous les questions suivantes&nbsp;:
Avant de travailler sur la routine, nous devons comprendre ce que fait le compilateur; posons-nous les questions suivantes&nbsp;:
Line 116: Line 117:
* Qu'est-ce qui a empêché d'optimiser davantage?
* Qu'est-ce qui a empêché d'optimiser davantage?
* La performance serait-elle affectée par les petites modifications?
* La performance serait-elle affectée par les petites modifications?
</div>


<div class="mw-translate-fuzzy">
Le compilateur PGI offre l'indicateur '''-Minfo'''  avec les options suivantes&nbsp;:
Le compilateur PGI offre l'indicateur '''-Minfo'''  avec les options suivantes&nbsp;:
* accel – liste des opérations du compilateur relativement à l'accélérateur
* accel – liste des opérations du compilateur relativement à l'accélérateur
Line 122: Line 125:
* intensity – renseignements sur l'intensité de la boucle
* intensity – renseignements sur l'intensité de la boucle
* ccff – ajout de renseignements aux fichiers objet pour utilisation future
* ccff – ajout de renseignements aux fichiers objet pour utilisation future
</div>


<div class="mw-translate-fuzzy">
<div class="mw-translate-fuzzy">
Line 131: Line 135:
* Effectuez un nouveau build.
* Effectuez un nouveau build.
</div>
</div>
* Rebuild
{{Command
{{Command
|make clean; make
|make clean; make
|result=
|result=
nvc++ -fast -Minfo=all,intensity,ccff   -c -o main.o main.cpp
...
nvc++ -fast -Minfo=all,intensity  -c -o main.o main.cpp
initialize_vector(vector &, double):
initialize_vector(vector &, double):
     20, include "vector.h"
     20, include "vector.h"
Line 143: Line 150:
           27, Intensity = 1.00
           27, Intensity = 1.00
               Generated vector simd code for the loop containing reductions
               Generated vector simd code for the loop containing reductions
              FMA (fused multiply-add) instruction(s) generated
          28, FMA (fused multiply-add) instruction(s) generated
waxpby(double, const vector &, double, const vector &, const vector &):
waxpby(double, const vector &, double, const vector &, const vector &):
     21, include "vector_functions.h"
     21, include "vector_functions.h"
Line 151: Line 158:
               Loop unrolled 2 times
               Loop unrolled 2 times
               FMA (fused multiply-add) instruction(s) generated
               FMA (fused multiply-add) instruction(s) generated
          40, FMA (fused multiply-add) instruction(s) generated
allocate_3d_poisson_matrix(matrix &, int):
allocate_3d_poisson_matrix(matrix &, int):
     22, include "matrix.h"
     22, include "matrix.h"
Line 158: Line 166:
               Loop not vectorized/parallelized: loop count too small
               Loop not vectorized/parallelized: loop count too small
           45, Intensity = 0.0
           45, Intensity = 0.0
              Loop unrolled 3 times (completely unrolled)
           57, Intensity = 0.0
           57, Intensity = 0.0
           59, Intensity = 0.0
           59, Intensity = 0.0
Line 164: Line 173:
     23, include "matrix_functions.h"
     23, include "matrix_functions.h"
           29, Intensity = (num_rows*((row_end-row_start)*        2))/(num_rows+(num_rows+(num_rows+((row_end-row_start)+(row_end-row_start)))))
           29, Intensity = (num_rows*((row_end-row_start)*        2))/(num_rows+(num_rows+(num_rows+((row_end-row_start)+(row_end-row_start)))))
              FMA (fused multiply-add) instruction(s) generated
           33, Intensity = 1.00
           33, Intensity = 1.00
               Loop not vectorized: non-stride-1 array reference
               Generated vector simd code for the loop containing reductions
              Loop not vectorized: mixed data types
          37, FMA (fused multiply-add) instruction(s) generated
              Loop unrolled 2 times
              FMA (fused multiply-add) instruction(s) generated
main:
main:
     38, allocate_3d_poisson_matrix(matrix &, int) inlined, size=41 (inline) file main.cpp (29)
     38, allocate_3d_poisson_matrix(matrix &, int) inlined, size=41 (inline) file main.cpp (29)
Line 177: Line 183:
               Loop not vectorized/parallelized: loop count too small
               Loop not vectorized/parallelized: loop count too small
           45, Intensity = 0.0
           45, Intensity = 0.0
              Loop unrolled 3 times (completely unrolled)
           57, Intensity = 0.0
           57, Intensity = 0.0
               Loop not fused: function call before adjacent loop
               Loop not fused: function call before adjacent loop
Line 188: Line 195:
     48, initialize_vector(vector &, double) inlined, size=5 (inline) file main.cpp (34)
     48, initialize_vector(vector &, double) inlined, size=5 (inline) file main.cpp (34)
           36, Intensity = 0.0
           36, Intensity = 0.0
               Loop not vectorized/parallelized: not countable
               Memory set idiom, loop replaced by call to __c_mset8
     49, initialize_vector(vector &, double) inlined, size=5 (inline) file main.cpp (34)
     49, initialize_vector(vector &, double) inlined, size=5 (inline) file main.cpp (34)
           36, Intensity = 0.0
           36, Intensity = 0.0
               Loop not vectorized/parallelized: not countable
               Memory set idiom, loop replaced by call to __c_mset8
     52, waxpby(double, const vector &, double, const vector &, const vector &) inlined, size=10 (inline) file main.cpp (33)
     52, waxpby(double, const vector &, double, const vector &, const vector &) inlined, size=10 (inline) file main.cpp (33)
           39, Intensity = 0.0
           39, Intensity = 0.0
Line 199: Line 206:
               Loop not fused: different loop trip count
               Loop not fused: different loop trip count
           33, Intensity = 1.00
           33, Intensity = 1.00
               Loop not vectorized: non-stride-1 array reference
               Generated vector simd code for the loop containing reductions
              Loop not vectorized: mixed data types
              Loop unrolled 2 times
     54, waxpby(double, const vector &, double, const vector &, const vector &) inlined, size=10 (inline) file main.cpp (33)
     54, waxpby(double, const vector &, double, const vector &, const vector &) inlined, size=10 (inline) file main.cpp (33)
           27, FMA (fused multiply-add) instruction(s) generated
           27, FMA (fused multiply-add) instruction(s) generated
           29, FMA (fused multiply-add) instruction(s) generated
           36, FMA (fused multiply-add) instruction(s) generated
          33, FMA (fused multiply-add) instruction(s) generated
           39, Intensity = 0.67
           39, Intensity = 0.67
               Loop not fused: different loop trip count
               Loop not fused: different loop trip count
Line 222: Line 226:
     65, dot(const vector &, const vector &) inlined, size=9 (inline) file main.cpp (21)
     65, dot(const vector &, const vector &) inlined, size=9 (inline) file main.cpp (21)
           27, Intensity = 1.00
           27, Intensity = 1.00
               Loop not fused: different loop trip count
               Loop not fused: different controlling conditions
               Generated vector simd code for the loop containing reductions
               Generated vector simd code for the loop containing reductions
     67, waxpby(double, const vector &, double, const vector &, const vector &) inlined, size=10 (inline) file main.cpp (33)
     67, waxpby(double, const vector &, double, const vector &, const vector &) inlined, size=10 (inline) file main.cpp (33)
Line 234: Line 238:
               Loop not fused: different loop trip count
               Loop not fused: different loop trip count
           33, Intensity = 1.00
           33, Intensity = 1.00
               Loop not vectorized: non-stride-1 array reference
               Generated vector simd code for the loop containing reductions
              Loop not vectorized: mixed data types
              Loop unrolled 2 times
     73, dot(const vector &, const vector &) inlined, size=9 (inline) file main.cpp (21)
     73, dot(const vector &, const vector &) inlined, size=9 (inline) file main.cpp (21)
           27, Intensity = 1.00
           27, Intensity = 1.00
Line 258: Line 260:
     91, free_vector(vector &) inlined, size=2 (inline) file main.cpp (29)
     91, free_vector(vector &) inlined, size=2 (inline) file main.cpp (29)
     92, free_matrix(matrix &) inlined, size=5 (inline) file main.cpp (73)
     92, free_matrix(matrix &) inlined, size=5 (inline) file main.cpp (73)
nvc++ main.o -o cg.x -fast -Minfo=all,intensity,ccff
}}
}}


<div class="mw-translate-fuzzy">
== Intensité computationnelle  ==
== Intensité computationnelle  ==
L'intensité computationnelle d'une boucle représente la quantité de travail accompli par la boucle en fonction des opérations effectuées en mémoire.
L'intensité computationnelle d'une boucle représente la quantité de travail accompli par la boucle en fonction des opérations effectuées en mémoire.
</div>


<div class="mw-translate-fuzzy">
'''intensité computationnelle = opérations de calcul / opérations en mémoire'''
'''intensité computationnelle = opérations de calcul / opérations en mémoire'''
</div>


<div class="mw-translate-fuzzy">
Une valeur de 1 ou plus indique que la boucle serait bien exécutée sur un processeur graphique (GPU).
Une valeur de 1 ou plus indique que la boucle serait bien exécutée sur un processeur graphique (GPU).
</div>


<div class="mw-translate-fuzzy">
== Comprendre le code  ==
== Comprendre le code  ==
Regardons attentivement le code suivant de <code>matrix_functions.h</code>&nbsp;:
Regardons attentivement le code suivant de <code>matrix_functions.h</code>&nbsp;:
<syntaxhighlight lang="cpp" line highlight="1,5,10,12">
</div>
for(int i=0;i<num_rows;i++) {
<syntaxhighlight lang="cpp" line start="29" highlight="1,5,10,12">
  double sum=0;
  for(int i=0;i<num_rows;i++) {
  int row_start=row_offsets[i];
    double sum=0;
  int row_end=row_offsets[i+1];
    int row_start=row_offsets[i];
  for(int j=row_start; j<row_end;j++) {
    int row_end=row_offsets[i+1];
    unsigned int Acol=cols[j];
    for(int j=row_start; j<row_end;j++) {
    double Acoef=Acoefs[j];  
      unsigned int Acol=cols[j];
    double xcoef=xcoefs[Acol];  
      double Acoef=Acoefs[j];  
    sum+=Acoef*xcoef;
      double xcoef=xcoefs[Acol];  
      sum+=Acoef*xcoef;
    }
    ycoefs[i]=sum;
   }
   }
  ycoefs[i]=sum;
}
</syntaxhighlight>  
</syntaxhighlight>  
<div class="mw-translate-fuzzy">
On trouvera les dépendances de données en se posant les questions suivantes&nbsp;:
On trouvera les dépendances de données en se posant les questions suivantes&nbsp;:
* Une itération en affecte-t-elle d'autres?
* Une itération en affecte-t-elle d'autres?
* Les itérations lisent-elles ou écrivent-elles à des endroits différents du même tableau?
* Les itérations lisent-elles ou écrivent-elles à des endroits différents du même tableau?
* Est-ce que sum est une dépendance?  Non, c'est une réduction.
* Est-ce que sum est une dépendance?  Non, c'est une réduction.
</div>


Maintenant que le code est analysé, nous pouvons ajouter des directives au compilateur.
Maintenant que le code est analysé, nous pouvons ajouter des directives au compilateur.


[[OpenACC Tutorial - Introduction/fr|<- Page précédente, ''Introduction'']] | [[OpenACC Tutorial/fr|^- Retour au début du tutoriel]] | [[OpenACC Tutorial - Adding directives/fr|Page suivante, ''Ajouter des directives'' ->]]
[[OpenACC Tutorial - Introduction/fr|<- Page précédente, ''Introduction'']] | [[OpenACC Tutorial/fr|^- Retour au début du tutoriel]] | [[OpenACC Tutorial - Adding directives/fr|Page suivante, ''Ajouter des directives'' ->]]
38,760

edits