Question

Est-il possible de boucle by-pass vectorisation en FORTRAN? J'écris aux normes de F77 pour un projet particulier, mais le gfortran GNU compile à travers FORTRANS modernes, comme F95. Est-ce que quelqu'un sait si certains vectorisation boucle normes FORTRAN évitées ou s'il y a des drapeaux / options gfortran désactiver cette fonction?

Mise à jour: Alors, je pense que la solution finale à mon problème spécifique doit « faire » avec le FORTRAN DO boucles ne permettant pas la mise à jour de la variable d'itération. La mention de ce qui peut être trouvée dans la réponse de @High Performance Mark sur ce fil lié ... boucle vectorisation et comment l'éviter

[Dans le FORT, RAN les noobs pour un abri.]

Était-ce utile?

La solution

Les normes Fortran sont généralement silencieux sur la façon dont la langue est à mettre en œuvre, en laissant que les écrivains du compilateur qui sont en meilleure position pour déterminer le meilleur, ou bien (et mauvais) des options pour la mise en œuvre des différentes fonctions de la langue sur quelle que soit l'architecture puce (s) ils sont en train d'écrire pour.

Que voulez-vous dire lorsque vous écrivez que vous voulez boucle by-pass vectorisation? Et dans la phrase suivante suggère que ce ne serait pas disponible pour FORTRAN77 programmes? Il est tout à fait normal pour un compilateur pour un CPU moderne pour générer des instructions vectorielles si le CPU est capable de les obéir. Cela est vrai quelle que soit la version de la langue du programme est écrit dans.

Si vous ne voulez vraiment pas générer des instructions vectorielles alors vous devrez examiner la documentation gfortran soigneusement - ce n'est pas un compilateur que j'utilise donc je ne peux pas vous diriger vers des options spécifiques ou des drapeaux. Vous voudrez peut-être regarder ses capacités de génération de code spécifique à l'architecture, en accordant une attention particulière au niveau SSE.

Vous pourriez être en mesure de forcer le compilateur en ne vectorisation boucles si toutes vos boucles sont explicites (donc pas les opérations tout-array) et si vous faites votre code difficile à vectoriser d'autres moyens (dépendances entre les itérations de la boucle par exemple). Mais un bon compilateur moderne, sans interférence, va essayer son damndest aux boucles de vectoriser pour votre propre bien.

Il semble plutôt pervers me pour tenter de forcer le compilateur à aller contre sa nature, vous pourriez peut-être expliquer pourquoi vous voulez faire cela plus en détail.

Autres conseils

haute performance Mark a écrit, le compilateur est libre de choisir les instructions de la machine pour mettre en œuvre votre code source aussi longtemps que les résultats suivent les règles de la langue. Vous ne devriez pas être en mesure d'observer une différence entre les valeurs de sortie en raison de la boucle vectorisation ... votre code devrait courir plus vite. Alors, pourquoi ça peut vous faire?

Parfois, les différences peuvent être observées entre les différents niveaux d'optimisation, par exemple, sur certaines architectures registres ont une précision supplémentaire.

L'endroit à la recherche de ces sortes d'optimisations compilateur est le manuel de gcc. Ils sont situés là-bas, car ils sont communs à la suite du compilateur gcc.

Avec la plupart des compilateurs modernes, l'option de ligne de commande -O0 doit désactiver tous les Optimisations, y compris vectorisation en boucle.

Je l'ai parfois trouvé que cela provoque des bugs à disparaître en apparence. Cependant cela signifie habituellement qu'il ya quelque chose de mal avec mon code si ce genre de chose se passe pour vous, alors vous avez certainement écrit un programme de buggy.

Il est théoriquement possible, mais beaucoup moins probable qu'il y ait un bogue dans le compilateur, vous pouvez facilement vérifier en compilant votre code dans un autre compilateur Fortran. (Par exemple gfortran ou G95).

gfortran ne pas automatiquement vectoriser à moins que vous avez défini ou -O3 -ftree-vectoriser. Il est donc facile d'éviter vectorisation. Vous aurez probablement besoin de lire (lait écrémé) le manuel gcc ainsi que celui gfortran.
Auto-vectorisation a été une caractéristique bien connue des compilateurs Fortran depuis plus de 35 ans, et même la définition Fortran 77 des boucles DO a été mis dans cet esprit (et aussi en raison de certains abus non portables connus de la norme F66). On ne pouvait pas compter sur la désactivation vectorisation comme un moyen de rendre le travail de code incorrect, bien qu'il puisse exposer les symptômes de code incorrect.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top