2010-12-13 37 views
2

boucle vectorisation est lorsque toutes les expressions côté main droite sont calculées au début. Je viens de découvrir que mes boucles sont vectorisées (dans FORTRAN 77 ... ne demandez pas). J'ai besoin que ma variable de condition de boucle soit mise à jour à chaque itération, mais comment puis-je réécrire pour contourner cette vectorisation?boucle vectorisation et comment éviter

Dans un related post, je cherche un moyen de désactiver cette "fonctionnalité" d'optimisation spécifiquement dans FORTRAN, mais ici je cherche une solution plus algorithmique au cas général.

+1

Je ne suis pas sûr que votre commentaire deux questions connexes est vous aider à obtenir une réponse claire à votre question sous-jacente. Cela me déroute! –

+0

Mes excuses. J'ai pensé ouvrir la question à un cas général et un public général pourrait être une bonne chose et que garder les détails spécifiques à FORTRAN dans l'autre thread pour FORTRANnies pourrait aussi être bon. Cependant, je vais faire une référence croisée à ce fil d'en bas. –

+0

Parlez-vous du déroulement de la boucle? – ja72

Répondre

5

Ce n'est pas ce que la boucle vectorisation pour moi. Pour moi, la phrase signifie que le compilateur va générer du code qui peut tirer parti de toutes les capacités de calcul vectoriel du matériel. Sur simple Intel Xeon cela pourrait vouloir dire générer des instructions SSE4 pour manipuler simultanément quelques éléments de tableau adjacents, sur un Cray il peut y avoir beaucoup plus disponible en termes d'exécution simultanée de la même opération sur les registres vectoriels.

Comment pensez-vous que toutes les expressions sont RHS «calculées au début? Je ne suis pas sûr de ce que vous voulez dire par là. Pourriez-vous poster du code pour expliquer? Si vous voulez dire que le nombre de déplacements dans la boucle est calculé à l'entrée de la première itération, alors c'est correct. C'est une fonctionnalité très utile quand il s'agit d'optimiser le code et pas la plupart des programmes Fortran auraient intérêt à éviter.

Si vous écrivez des boucles DO en Fortran mettre à jour la variable d'itération est interdite par la norme, et a toujours été si je me souviens bien. Votre compilateur pourrait vous laisser partir mais je ne ferais pas confiance à un programme Fortran dans lequel cela est arrivé.

+0

Tous bien reçus, et oui, ce sont des boucles DO, donc là doit être mon problème! Je suppose que je pourrais faire un combo IF/THEN/GOTO à la place. –

+2

Si vous postez du code, nous pourrons peut-être vous aider à démêler les dépendances. Si c'est possible, il est toujours bon d'éviter les conditions, pour l'optimisation si ce n'est pour rien d'autre. Et si vous écrivez une déclaration GOTO, vous avez aussi la permission de vous tirer dans l'autre pied :-) –