Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1086 connectés 

  FORUM HardWare.fr
  Programmation
  ASM

  Déroulage de boucles et aléas

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Déroulage de boucles et aléas

n°1185038
Pandinus2k​4
Posté le 26-08-2005 à 11:47:52  profilanswer
 

Bonjour à tous,
 
 
J'ai un petit problème de compréhension sur certaines choses en Assembleur. En effet j'ai étudié l'Assembleur DLX et j'ai quelques notions qui me posent problème.
 
Tout d'abord, je ne comprends pas l'intérêt du "déroulage de boucle" ? De plus de façon générale, comment distinguer efficacement les différents types d'aléas au sein d'un code assembleur afin d'en améliorer l'exécution ?
 
Ceci étant purement à but d'apprentissage :)
 
Merci d'avance !

mood
Publicité
Posté le 26-08-2005 à 11:47:52  profilanswer
 

n°1185178
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 26-08-2005 à 13:01:53  profilanswer
 

le déroulage de boucle te permet d'éviter les instructions de saut. sur des grosses boucles, ça procure un gain assez significatif


---------------
J'ai un string dans l'array (Paris Hilton)
n°1185223
Pandinus2k​4
Posté le 26-08-2005 à 13:44:54  profilanswer
 

Merci pour ta réponse :) Quelles sont les méthodes principales pour dérouler une boucle ?

n°1185329
blackgodde​ss
vive le troll !
Posté le 26-08-2005 à 14:47:48  profilanswer
 

recopier chaque itération de la boucle linérairement dans le code


---------------
-( BlackGoddess )-
n°1185419
Pandinus2k​4
Posté le 26-08-2005 à 15:30:50  profilanswer
 

Ok merci c'est bien ce que je pensais aussi.  
 
D'un point de vue théorique, on parle de réordonnancer le code pour éviter les différents aléas (Lecture après Ecriture ...) et ainsi permettre d'éviter des cycles de latence.  
 
Y aurait t-il une technique pour repérer ces problèmes rapidement ?  
 

n°1185440
jan0
Posté le 26-08-2005 à 15:37:02  profilanswer
 

utiliser un profiler de code peut-être

n°1185538
Pandinus2k​4
Posté le 26-08-2005 à 16:16:12  profilanswer
 

En fait c'est sur le plan purement théorique, c'est pour des révisions que je me renseigne car c'est du code sur papier :(

n°1191497
christophe​_d13
L'efficacité à tout prix.
Posté le 04-09-2005 à 09:00:08  profilanswer
 

Sur le plan purement théorique (et pratique)
- Le saut vide le pipe.
- L'AGI stall recommence à zéro.
 
l'exemple simple...

Code :
  1. loop:
  2. mov eax, [ebx+esi]
  3. ...
  4. sub esi, 4
  5. jnz loop


 
Dans cet exemple, on va avoir un AGI stall sur mov eax, [esi+ebx] Sa durée est de 2 à 3 cycles (parfois plus suivant la distance à laquelle se trouve la donnée).
 
 
Le fait de dérouler une boucle permet de multipler la vitesse dans des cas utilisant la mémoire de façon linéaire et intensive (FFT, copy, transfert, échange) :

Code :
  1. loop:
  2. movq mm0, [esi+eax]
  3. movq mm1, [esi+eax+8]
  4. movq [edi+eax+8], mm0
  5. movq [edi+eax], mm1
  6. add eax, 16
  7. js loop


Si on déroule...

Code :
  1. loop:
  2. movq mm0, [esi+eax]
  3. movq mm4, [esi+eax+32]
  4. movq mm2, [esi+eax+16]
  5. movq mm6, [esi+eax+48]
  6. movq mm1, [esi+eax+8]
  7. movq mm5, [esi+eax+40]
  8. movq mm3, [esi+eax+24]
  9. movq mm7, [esi+eax+56]
  10. movq [edi+eax],    mm1
  11. movq [edi+eax+8],  mm0
  12. movq [edi+eax+16], mm3
  13. movq [edi+eax+24], mm2
  14. ...
  15. movq [edi+eax+56], mm6
  16. add eax, 64
  17. js loop


Message édité par christophe_d13 le 06-09-2005 à 10:59:03

---------------
http://www.ikalizer.fr
n°1191727
Taz
bisounours-codeur
Posté le 04-09-2005 à 19:33:25  profilanswer
 

Harkonnen a écrit :

sur des grosses boucles, ça procure un gain assez significatif

petites

n°1193069
christophe​_d13
L'efficacité à tout prix.
Posté le 06-09-2005 à 10:59:40  profilanswer
 

Taz+Harko> ça dépend du l'algo.
Mais même sur des grosses boucles (pas trop quand même), le gain est significatif.
Les meilleurs gains sont toujours obtenus sur des boucles occupant énormément la mémoire.
 
A l'inverse, trop dérouler une boucle (courte ou longue) peut la ralentir. Tout est une histoire de contexte, de CPU, dépendances...
 
L'idéal restant de faire plusieurs routines critiques et de choisir la plus rapide selon le contexte (test).


---------------
http://www.ikalizer.fr
mood
Publicité
Posté le 06-09-2005 à 10:59:40  profilanswer
 

n°1193110
Taz
bisounours-codeur
Posté le 06-09-2005 à 11:51:28  profilanswer
 

non ça dépend pas. C'est juste une histoire de cache et de si le coût du saut est significatif par rapport à l'exécution du corps de la boucle.

n°1193196
olivthill
Posté le 06-09-2005 à 14:24:24  profilanswer
 

C'est un peu plus compliqué que ça, cher Taz, car les micro-processeurs avancés de notre génération sont très sophistiqués. Par exemple, ils utilisent une méthode appellé "prefectching" qui fait qu'un même saut peut être plus ou moins rapide selon que le CPU a deviné que le saut allait avoir lieu ou pas. Autre chose, le parallelisme. Puisque le microprocesseur possède un certain niveau de parallèlisme, il lui arrive d'exécuter plus ou moins rapidement une instruction en fonction de l'instruction qui la précède ou qui la suit. Donc, de nos jours, il devient quasiment impossible de faire des calculs théoriques justes du temps d'exécution. Il faut tester.


Message édité par olivthill le 06-09-2005 à 14:25:39
n°1193206
christophe​_d13
L'efficacité à tout prix.
Posté le 06-09-2005 à 14:26:51  profilanswer
 

Taz> Il n'y a pas que le coût du saut, il y a aussi les problèmes d'AGI et de parallélisation qui peuvent être améliorés voire résolus en déroulant partiellement les boucles.
 
Dans tous les cas, je ne déroule jamais totalement les boucles, c'est plus néfaste qu'autre chose, et cela salit le code-cache.
 
Souvent un déroulement x2 à x8 est suffisant.
 
Edit:
Taz> En fait tout dépend les algos. Je parle de ma propre expérience et toi de la tienne. Deux points de vue différents puisque l'on ne fait pas les mêmes choses.
 
Re-Edit:

Citation :

il devient quasiment impossible de faire des calculs théoriques justes du temps d'exécution. Il faut tester.


Oui il faut tester, mais il n'est pas impossible de faire des calculs théoriques. Il faut seulement avoir les bonnes docs et les connaissances.
 
Au fait, un processeur ne devine rien, il analyse suivant des algo complexes mais mathématiquement transposable. C'est bien plus pratique.


Message édité par christophe_d13 le 06-09-2005 à 14:31:44

---------------
http://www.ikalizer.fr

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  ASM

  Déroulage de boucles et aléas

 

Sujets relatifs
Deux boucles whileboucles en SQL
vo mieux voir le dernier msg de ce topic pour comprendre le 1er ??Boucles while - newbie
objets et les bouclesBoucles
[Java] optimisation boucles for[PHP] doubles boucles conditionnelles
Les boucles...Algo du plus court chemin avec des boucles dans le graphe
Plus de sujets relatifs à : Déroulage de boucles et aléas


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR