2016-12-08 13 views
6

Próbowałem przekazać tablicę do podprogramu, zadeklarowanego w podprocedurze jako przyjęta tablica kształtów. To dawało mi pewne problemy, które udało mi się rozwiązać, przekazując zamiast tego wskaźnik.Czy wskaźniki blokują optymalizacje kompilatora?

Ale jakiś użytkownik z wysokiej reputacji mówi mi w komentarzu:

Dodanie wskaźnika jest także rozsądny sposób mówienia Optymalizator kompilatorów, że nie ma dzisiaj robić żadnej pracy.

Czy ktoś może przedstawić krótkie wyjaśnienie na ten temat? Językiem jest Fortran 95, choć uważam, że dotyczy to innych języków.

+0

myślę PO odnosi się do tego [komentarz] (http://stackoverflow.com/questions/41009109/subroutine-not-returning-correct-numerical-values-in-assumed-shape-array-due-to # comment69272729_41032273). – 4castle

+1

To prawda. W przypadku karty SIMD trudno jest zagwarantować, że dane są sekwencyjne, niezależnie od tego, czy punkt jest indeksowany sekwencyjnie. Jest to prawdopodobnie bardziej prawdziwe w przypadku Fortranu niż w większości języków, ponieważ wiele Fortranu jest szczególnie ukierunkowanych na wektory/tablice. Ale wnętrzności kompilatorów ogólnie zbliżają się do asymptoty, gdzie zgromadzenie może być prawie identyczne między fortranem a c. Ogólnie oznacza pewne rzeczy, a trudniejszy kod wymaga więcej pracy. – Holmz

+1

@ 4castle Nie zamieściłem linku do oryginalnego komentarza celowo, ponieważ zawiera on wprowadzające w błąd informacje: (za pomocą wskaźnika) "nie można już przekazywać sekcji tablicy", co jest błędne. Nic nie jest łatwiejsze niż przypisanie wskaźnika do sekcji tablicowej przed przekazaniem jej jako argumentu do podprogramu. – Mephisto

Odpowiedz

4

Tak, kompilatory Fortran muszą zakładać, że wskaźniki mogą zawierać alias z innymi wskaźnikami i ze zmiennymi target.

Jeśli masz tablice wskaźnika a i b potem w

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

kompilator musi założyć, że te dwie macierze mogą częściowo się pokrywają i musi hamować pewne optymalizacje, ponieważ zmiana wartości a może zmienić pewne wartości b na jakimś nieznanym indeksie.

Zobacz także słowo kluczowe C i dużo bardziej szczegółową dyskusję pod adresem Is Fortran easier to optimize than C for heavy calculations?. Nie warto powtarzać wszystkich podniesionych punktów aliasingu wskaźnika.

Komentarz IanH był celowo może nieco zbyt silny, ale jest w nim dużo prawdy.

Powiązane problemy