2010-11-29 6 views
3

J'essaie de trouver des articles, des livres ou tout ce qui concerne la programmation sans sauts (arc x86). Je sais que généralement c'est impossible mais j'essaye d'éviter les sauts mais gcc même avec la fonction inline utilise des sauts plusieurs fois. Le codage que dans l'Assemblée est une sorte de solution, mais l'écriture équivalente de 1000 lignes dans C est comme la fête de l'enfer à mes yeux ..Programmation sans sauts

+3

Pouvez-vous nous dire pourquoi vous voulez faire cela? Il y a eu beaucoup de discussions historiques sur 'goto' dans les langages de programmation supérieurs, mais en évitant les sauts en tant que tels? Je ne peux pas avoir beaucoup de sens à partir de ça. –

+0

... Pourquoi exactement vous l'avez encore voulu? –

+1

Pourquoi voulez-vous éviter les sauts? À moins que ce soit pour un exercice académique, cela ne sert à rien. –

Répondre

7

À moins que vos sauts ne soient vraiment aléatoires, la prédiction de branchement devrait éliminer la plupart des frais généraux impliqués. Je voudrais consacrer plus d'efforts à l'optimisation des modèles d'accès à la mémoire afin d'améliorer la localité et de réduire les échecs de mémoire cache. Ces jours-ci, la latence de la mémoire est le principal goulot d'étranglement à la performance.

Une autre bonne direction est d'améliorer le parallélisme (en utilisant à la fois des instructions SIMD vectorisées et, si possible, plus d'un cœur).

1

Il n'est pas impossible à code sans sauts, mais il semble inutile d'essayer.

En fin de compte si vous avez besoin de faire quelque chose de plus d'une fois alors vos choix sont:

  • boucle déroulant (à savoir répéter le code au lieu de mise en boucle).
  • Obtenir le pointeur d'instruction pour visiter le même code plus d'une fois.

La première approche nécessite de connaître le nombre d'itérations à l'avance et non d'échelle et la seconde implique une sorte de saut.

2

Optimiser les performances que le code critique, et seulement une fois que vous savez vraiment la performance est critique. N'essayez pas d'optimiser les sauts uniquement parce que vous avez lu un cas de performance. Tout provoque un coup de performance, et le code le plus rapide possible est le code qui ne fait rien. Il y a d'autres choses bien pires que les sauts. Si vous montrez un exemple particulier d'un saut dans le code généré, il y a des chances qu'il y ait un moyen de l'éviter, mais il est plus probable que le code que vous montrerez contienne encore des problèmes plus sérieux.

Une façon particulière d'éviter les branches consiste à utiliser des instructions de "mouvement conditionnel". Ils peuvent être utilisés par exemple. pour calculer max ou min. Si vous autorisez le compilateur à utiliser l'architecture SSE, il suppose que le CPU supporte aussi les instructions CMOV/FCOMI/FCOMIP/FUCOMI/FUCOMIP et les utilisera (attention: parfois il peut être difficile de faire en sorte que le compilateur fasse ce que vous voulez, voir par exemple this gamedev.net discussion).

+0

oui je sais que je ne veux pas optimiser la journalisation ou l'impression;) Mais ce 1000 lignes est mon code critique moyen. – Xamael

+2

Si vous pouvez montrer un morceau de code, vous obtiendrez une meilleure réponse. – Suma

+0

Comme la réponse que vous avez acceptée montre, vous ne savez toujours pas que vous voulez vraiment optimiser les sauts. Si vous vous intéressez vraiment aux optimisations comme celle-ci, utilisez un profileur de niveau d'instruction comme VTune ou AMD Code Analyst - il vous montrera exactement quelles instructions prennent le plus de temps, et plus encore. – Suma

0

Ne sachant pas à quoi ressemble votre code, il est difficile de donner des conseils. Mais je vais essayer.

Avant de commencer l'optimisation, exécutez un outil de profilage pour localiser les zones problématiques. Après l'optimisation, réexécutez l'outil de profilage pour voir si vous l'avez fait plus rapidement.

Il est difficile de supprimer réellement des branches, mais vous pouvez les réduire en les déroulant en boucle.Quelqu'un a mentionné les instructions de mouvement conditionnel, il y a beaucoup d'instructions conditionnelles sur l'architecture ARM, mais si elles ne sont pas exécutées, elles se traduiront par un NOP et prendront chacune un cycle. Je ne sais pas comment ils fonctionnent sur x86. Il peut en fait devenir plus lent, puis utiliser une simple branche en fonction de la durée du pipeline.

Il y a beaucoup d'autres astuces d'optimisation que vous pouvez essayer avant de supprimer des branches.

Questions connexes