38,760
edits
(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 : | Avant de travailler sur la routine, nous devons comprendre ce que fait le compilateur; posons-nous les questions suivantes : | ||
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 : | Le compilateur PGI offre l'indicateur '''-Minfo''' avec les options suivantes : | ||
* 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 | ... | ||
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 | ||
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))))) | ||
33, Intensity = 1.00 | 33, Intensity = 1.00 | ||
Generated vector simd code for the loop containing reductions | |||
37, 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 | ||
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 | ||
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 | ||
Generated vector simd code for the loop containing reductions | |||
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 | ||
36, 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 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 | ||
Generated vector simd code for the loop containing reductions | |||
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) | ||
}} | }} | ||
<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> : | Regardons attentivement le code suivant de <code>matrix_functions.h</code> : | ||
<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"> | ||
for(int i=0;i<num_rows;i++) { | |||
double sum=0; | |||
int row_start=row_offsets[i]; | |||
int row_end=row_offsets[i+1]; | |||
for(int j=row_start; j<row_end;j++) { | |||
unsigned int Acol=cols[j]; | |||
double Acoef=Acoefs[j]; | |||
double xcoef=xcoefs[Acol]; | |||
sum+=Acoef*xcoef; | |||
} | |||
ycoefs[i]=sum; | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div class="mw-translate-fuzzy"> | |||
On trouvera les dépendances de données en se posant les questions suivantes : | On trouvera les dépendances de données en se posant les questions suivantes : | ||
* 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'' ->]] |