Bureaucrats, cc_docs_admin, cc_staff, rsnt_translations
2,837
edits
(Created page with "Dans le résultat, la fonction <code>matvec()</code> utilise 83.5 % du temps d'exécution; son appel se trouve dans la fonction <code>main()</code>.") |
No edit summary |
||
(14 intermediate revisions by one other user not shown) | |||
Line 52: | Line 52: | ||
Une fois l'exécutable <code>cg.x</code> créé, nous allons profiler son code source. Le profileur mesure les appels des fonctions en exécutant et en surveillant ce programme. | Une fois l'exécutable <code>cg.x</code> créé, nous allons profiler son code source. Le profileur mesure les appels des fonctions en exécutant et en surveillant ce programme. | ||
'''Important :''' Cet exécutable utilise environ 3Go de mémoire et un cœur CPU | '''Important :''' Cet exécutable utilise environ 3Go de mémoire et un cœur CPU presque à 100 %. '''L'environnement de test devrait donc avoir 4Go de mémoire disponible et au moins deux (2) cœurs CPU'''. | ||
{{Callout | {{Callout | ||
Line 92: | Line 92: | ||
======== Data collected at 100Hz frequency | ======== Data collected at 100Hz frequency | ||
}} | }} | ||
Dans le résultat, la fonction <code>matvec()</code> utilise 83.5 % du temps d'exécution; son appel se trouve dans la fonction <code>main()</code>. | Dans le résultat, la fonction <code>matvec()</code> utilise 83.5 % du temps d'exécution; son appel se trouve dans la fonction <code>main()</code>. | ||
==Renseignements sur le compilateur== | ==Renseignements sur le compilateur== | ||
Line 100: | Line 100: | ||
* La performance serait-elle affectée par les petites modifications? | * La performance serait-elle affectée par les petites modifications? | ||
Le compilateur NVIDIA offre l'indicateur <code>-Minfo</code> avec les options suivantes : | |||
Le compilateur | * <code>all</code>, pour imprimer presque tous les types d'information, incluant | ||
* accel | ** <code>accel</code> pour les opérations du compilateur en rapport avec l'accélérateur | ||
* | ** <code>inline</code> pour l'information sur les fonctions extraites et alignées | ||
* | ** <code>loop,mp,par,stdpar,vect</code> pour les renseignements sur l'optimisation et la vectorisation des boucles | ||
* | * <code>intensity</code>, pour imprimer l'information sur l'intensité des boucles | ||
</ | * (aucune option) produit le même résultat que l'option <code>all</code>, mais sans l'information fournie par <code>inline</code>. | ||
== Obtenir les renseignements sur le compilateur == | == Obtenir les renseignements sur le compilateur == | ||
* | * Modifiez le Makefile. | ||
CXX=nvc++ | |||
CXXFLAGS=-fast -Minfo=all,intensity | |||
LDFLAGS=${CXXFLAGS} | |||
* Effectuez un nouveau build. | * Effectuez un nouveau build. | ||
{{Command | {{Command | ||
|make clean; make | |make clean; make | ||
Line 243: | Line 240: | ||
}} | }} | ||
== Interpréter le résultat == | |||
== | 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, soit | ||
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 | |||
<math>\mbox{ | <math>\mbox{intensité computationnelle} = \frac{\mbox{opérations de calcul}}{\mbox{opérations en mémoire}}</math> | ||
< | Dans le résultat, une valeur supérieure à 1 pour <code>Intensity</code> indique que la boucle serait bien exécutée sur un processeur graphique (GPU). | ||
== Comprendre le code == | == Comprendre le code == | ||
Line 271: | Line 264: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
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? | ||
* | ** par exemple, quand une '''[https://fr.wikipedia.org/wiki/Suite_de_Fibonacci suite de Fibonacci]''' est générée, chaque nouvelle valeur dépend des deux valeurs qui la précèdent. Il est donc très difficile, sinon impossible, d'implémenter un parallélisme efficace. | ||
* | * L'accumulation des valeurs dans <code>sum</code> est-elle une dépendance? | ||
** Non, c'est une''' [https://en.wikipedia.org/wiki/Reduction_operator réduction]'''! Et les compilateurs modernes optimisent bien ce genre de réduction. | |||
* Est-ce que les itérations de boucle écrivent et lisent dans les mêmes vecteurs de sorte que les valeurs sont utilisées ou écrasées par d'autres itérations? | |||
** Heureusement, ceci ne se produit pas dans le code ci-dessus. | |||
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'' ->]] |