2016-12-08 1 views
6

J'essayais de passer un tableau à un sous-programme, déclaré dans le sous-programme comme un tableau de formes supposé. Cela m'a donné quelques problèmes que j'ai pu résoudre en passant un pointeur à la place.Les pointeurs empêchent-ils les optimisations du compilateur?

Mais certains utilisateurs avec une grande réputation me dit dans un commentaire:

Ajout pointeur est aussi une façon raisonnable de dire l'optimisateur compilateurs qu'il n'a pas à faire un travail aujourd'hui.

Quelqu'un peut-il offrir une courte explication à ce sujet? La langue est Fortran 95, bien que je crois que cela s'applique à d'autres langues.

+0

Je pense que l'OP fait référence à [ce commentaire] (http://stackoverflow.com/questions/41009109/subroutine-not-returning-correct-numerical-values-in-assumed-shape-array-due-to # comment69272729_41032273). – 4castle

+1

C'est vrai. Pour SIMD, il est difficile de garantir que les données sont séquentielles, que le point soit indexé séquentiellement. Il est probablement plus vrai pour Fortran que la plupart des langues, car beaucoup de Fortran cible spécifiquement les vecteurs/tableaux. Mais les tripes des compilateurs se rapprochent généralement toutes d'une asymptote où l'assemblage peut être presque identique entre fortran et c. Généralement signifie pour certaines choses, et le code plus difficile nécessite plus de travail. – Holmz

+1

@ 4castle Je n'ai pas inclus de lien exprès vers le commentaire original, car il contient des informations trompeuses: (en utilisant un pointeur) "vous n'êtes plus capable de passer des sections de tableau", ce qui est faux. Rien n'est plus facile que d'assigner un pointeur à une section de tableau avant de la passer en argument au sous-programme. – Mephisto

Répondre

4

Oui, les compilateurs Fortran doivent supposer que les pointeurs peuvent alias avec d'autres pointeurs et avec les variables target.

Si vous avez des tableaux de pointeurs a et b puis dans

a(i) = a(i) + b(i) 

le compilateur doit supposer que ces deux réseaux peuvent se chevaucher partiellement et il doit inhiber certaines optimisations, car la modification de la valeur de a peut changer une valeur de b à un indice inconnu.

Voir aussi le mot-clé C restrict et une discussion beaucoup plus approfondie au Is Fortran easier to optimize than C for heavy calculations?. Il ne vaut pas la peine de répéter tous les points relatifs à l'alias de pointeur qui y sont évoqués.

Le commentaire de IanH était intentionnellement peut-être un peu trop fort, mais il y a beaucoup de vrai dedans.