Co sprawia, że ​​Fortran jest szybki?

41

Fortran zajmuje szczególne miejsce w programowaniu numerycznym. Z pewnością możesz tworzyć dobre i szybkie oprogramowanie w innych językach, ale Fortran nadal działa bardzo dobrze pomimo swojego wieku. Co więcej, łatwiej jest tworzyć szybkie programy w Fortran. Robiłem szybkie programy w C ++, ale musisz bardziej uważać na takie rzeczy, jak aliasing wskaźnika. Musi być więc powód i bardzo techniczny. Czy to dlatego, że kompilator może zoptymalizować więcej? Naprawdę chciałbym poznać szczegóły techniczne, więc jeśli użyję innego języka, mogę wziąć to pod uwagę.

Na przykład wiem - lub myślę - że jedna rzecz jest taka, że ​​standard określa, że ​​wskaźniki są ciągłe w pamięci, co oznacza szybszy dostęp do pamięci. Wierzę, że możesz to zrobić w C ++, podając kompilatorowi flagę. W ten sposób pomaga wiedzieć, co robi Fortran, więc jeśli używamy innego języka, możemy to naśladować.

jbcolmenares
źródło
7
Powiedziałbym, że może to być lepsze pytanie w przypadku przepełnienia stosu, chociaż wydaje mi się, że to dobre pytanie. Szybkie wyszukiwanie ( stackoverflow.com/search?q=fortran+fast ) prowadzi mnie do tego pytania, które może ci pomóc: stackoverflow.com/questions/146159/is-fortran-faster-than-c
Yann
3
Musisz określić, jakiego rodzaju fortu używasz. Istnieje znaczna różnica między 77 a 90+. Zakładam, że co najmniej 90, jeśli mówimy o wskaźnikach ...
qubyte
Zawsze czytam o tym, że Fortran jest szybszy niż C. Cóż, może, ale czy jest szybszy o 2%, czy raczej o 50%?
shuhalo,
4
To miejski mit. O ile kompilator nie może skorzystać ze specjalnych instrukcji, można ręcznie zoptymalizować prawie każdy program, niezależnie od kompilatora, aby wygenerować mniej więcej ten sam język maszynowy.
Mike Dunlavey

Odpowiedzi:

50

Projektanci języków stają przed wieloma wyborami. Ken Kennedy podkreślił dwa: (1) lepsze abstrakcje i (2) kod wyższego lub niższego poziomu (mniej lub więcej maszynowy). Podczas gdy języki funkcjonalne, takie jak Haskell i Scheme, koncentrują się na tych pierwszych, tradycyjne języki naukowo-komputerowe, takie jak Fortran i C / C ++, koncentrują się na tych pierwszych. Mówienie, że jeden język jest szybszy od drugiego, jest zwykle bardzo mylące: każdy język ma domenę problemową, dla której się wyróżnia. Fortran radzi sobie lepiej w dziedzinie kodów numerycznych opartych na tablicach niż w innych językach z dwóch podstawowych powodów: modelu tablic i jawności.

Model macierzy

Programiści Fortran w dużej mierze wykonują manipulacje tablicowe. W tym celu Fortran ułatwia kilka optymalizacji kompilatora, które nie są dostępne w innych językach. Najlepszym przykładem jest wektoryzacja: znajomość układu danych umożliwia kompilatorowi wywoływanie wewnętrznych elementów na poziomie zestawu w tablicy.

Jawność językowa

Choć wydaje się, że prostszy język powinien się kompilować „lepiej” niż bardziej złożony, tak naprawdę tak nie jest. Kiedy pisze się w języku asemblera , kompilator nie jest w stanie wiele zrobić: widzi tylko bardzo szczegółowe instrukcje. Fortran wymaga jawności (a więc więcej pracy programisty) tylko w przypadkach, które dają realne korzyści dla obliczeń opartych na macierzach. Fortran wykorzystuje proste typy danych, podstawowy przepływ sterowania i ograniczone przestrzenie nazw; z kolei nie informuje komputera, jak ładować rejestry (co może być konieczne w czasie rzeczywistym ). Tam, gdzie Fortran jest jawny, umożliwia takie rzeczy jak pełne wnioskowanie o typie, co pomaga początkującym w rozpoczęciu pracy. Pozwala to również uniknąć jednej rzeczy, która często spowalnia C:nieprzejrzyste wskaźniki .

Fortran może być powolny

Fortran nie jest szybki do każdego zadania: dlatego niewiele osób używa go do tworzenia GUI, a nawet do wysoce nieustrukturyzowanych obliczeń naukowych. Gdy opuścisz świat tablic dla wykresów, drzew decyzyjnych i innych dziedzin, ta przewaga prędkości szybko zanika. Zobacz testy porównawcze języków komputerowych, aby znaleźć przykłady i liczby.

aterrel
źródło
7
Problemy z GUI / IO można łatwo rozwiązać, pakując chrupanie Fortrana w języku „bardziej ogólnego przeznaczenia”. Często używam do tego celu R.
Mbq
2
shootout.alioth.debian.org nie jest już dostępny! A nowa wersja ma znacznie mniej informacji :(
astrojuanlu
23

Konstrukcja Fortran pozwala kompilatorowi na wykonanie silniejszych optymalizacji w niektórych przypadkach, które nie są ogólnie dostępne dla C.

Jednym znanym przykładem jest obsługa aliasingu . W Fortran można uzyskać dostęp do określonego obszaru pamięci tylko przez określony symbol powiązany z tym obszarem pamięci. Ta wiedza umożliwia kompilatorowi stosowanie inteligentnych sztuczek, gdy nadejdzie czas buforowania: wie, czy wartość mogła się zmienić, czy nie. Do F90 było to łatwo weryfikowane. Kiedy wprowadzono Fortran 90 pointers, założenie nie było już prawdziwe: można było uzyskać dostęp do tego samego obszaru pamięci za pomocą dwóch (lub więcej) symboli. To jest powód, dla którego musisz określić targettablice, które chcesz adresować za pomocą wskaźników.

Innym interesującym faktem jest to, że wiele konstrukcji umożliwia kompilatorowi wykonywanie równoległości bez interwencji użytkownika. Taki luksus jest możliwy dzięki względnemu „platformowemu agnostycyzmowi” Fortranu jako języka.

Istnieje wiele innych podobnych sztuczek. Ponadto należy pamiętać, że nikt obecnie nie używa Fortran, z wyjątkiem obliczeń numerycznych, co oznacza, że ​​podstawową cechą i zaletą kompilatorów Fortran jest wynikowa szybkość kodu. W rezultacie dostawcy skupili się na tym.

Niemniej jednak możesz tworzyć kod wykonawczy również w innych językach. Może to jednak wymagać szczególnej opieki lub interwencji człowieka. Ogólna kwestia polega jednak na tym, że wydajność nie stanowi problemu, dopóki nie pojawi się problem, a czas człowieka jest znacznie droższy niż czas komputerowy. Dlatego praktyki kodowania powinny skupiać się na oszczędzaniu czasu ludzkiego, a nie czasu komputerowego.

Stefano Borini
źródło
2
Kiedy twoje komputery osiągają wartość> 100 milionów dolarów, ludzie (studenci) przestają w porównaniu wyglądać tak drogo.
Phil Miller,
6
@Novelocrat: ilość kodu, który działa na $ 100 milionów komputer został napisany przez niezliczonych roboczogodzin, które wykraczają daleko poza $ mln 100 znak, nawet grad cenie studenckiej. Pamiętaj, że koszty osoby stanowią dwukrotność jej dochodu. Reszta idzie na podatki i jest skorelowana. Ponadto komputer nie ulega wypaleniu. Osoba robi i zmieni pracę.
Stefano Borini,
1
@StefanoBorini Mam długą historię komputerów, które doświadczyły wypalenia ...
N74
1
„Ponadto należy pamiętać, że nikt obecnie nie używa Fortranu, z wyjątkiem obliczeń numerycznych,” Fortran = „FORmula TRANslation”. Fortran był zawsze przede wszystkim wykorzystywany i przeznaczony do obliczeń numerycznych. Fortran ma dużą część czasu komputerów o wysokiej wydajności.
user21387,
Dziś, jak zawsze, Fortran jest wykorzystywany do tego samego celu - obliczeń numerycznych.
sekwencja
12

Nie sądzę, aby Fortran był tak blisko metalu (zobacz inną odpowiedź), ale ma tendencję do bardzo łatwej optymalizacji. Pętle są proste, a język z łatwością obsługuje rozszerzenia wektoryzacji (okej, kiedy użyłem go w mojej pierwszej pracy, celowaliśmy w szeroki zakres wektorów dużych żelaza).

Istnieje również duży czynnik bezwładności. Wiele kodów numerycznych znajduje się w Fortran, więc twórcy wysokiej klasy serwerów i superkomputerów upewniają się, że piszą dobre optymalizujące kompilatory Fortran. Kompilatory są dobre (nawet na komputerach ze względnie brakiem wysokiej jakości kompilatorów), więc użytkownicy nadal korzystają z Fortran, a nawet piszą w nim nowy kod. Konstruktorzy upewniają się, że ich następna generacja ma dobre kompilatory itp.

winwaed
źródło
8

Uważaj tutaj na miejskie mity. Jeśli dwa kompilatory wygenerują ten sam kod zestawu, wówczas powstałe programy będą miały tę samą wydajność.

Dla dowolnej logiki istnieje program w języku asemblera, który minimalizuje czas jego wykonywania. Ten program nie dba o to, który kompilator go wygenerował.

To powiedziawszy, istnieją skompilowane języki, aby ułatwić życie programistom. Część tego kosztuje to, że mogą skusić użytkownika do korzystania z funkcji, które nie skutkują minimalnym czasem wykonania. Najlepszym tego przykładem jest newC ++. (Jak wolno to może być - to tylko trzy postacie?) Praktycznie prosi cię o dynamiczne przydzielanie pamięci i nie zwracanie uwagi na koszt środowiska wykonawczego. Jeśli to właśnie chcesz zrobić, to wspaniale, ale Fortran może być szybszy tylko dlatego, że nie wciągnęło cię w to.

Ale poza tym nigdy nie widziałem programu, który, jak napisano po raz pierwszy, nie miał większego miejsca na poprawę wydajności w rodzaju, którego kompilator nigdy nie mógłby dla ciebie wyczyścić. Jako jeden przykład, spędzanie dużej części czasu na telefonowaniu expi / lub logpowtarzaniu z tym samym argumentem. Jako kolejny przykład, wywoływanie DGEMM w celu pomnożenia macierzy i stwierdzenie, że duża część czasu zajmuje wywołanie LSAME tylko po to, aby rozszyfrować argumenty znaków wejściowych.

Jest to w tym samym czasie, gdy ludzie mówią, że Fortran jest szybszy z powodu aliasingu wskaźnika lub rozwijania pętli. To tak, jakby powiedzieć, że autobus wyprodukowany przez Porsche byłby z pewnością szybszy niż autobus wyprodukowany przez Chevroleta. Trzeba trochę zdrowego rozsądku.

Mike Dunlavey
źródło
4
Nie sądzę, że to tylko miejski mit. Wsparcie Fortrana dla operacji na całej tablicy, funkcji PURE / ELEMENTAL itp. Może pomóc kompilatorom w łatwej optymalizacji / wektoryzacji, a nawet równoległości. Na przykład zobacz thinkingparallel.com/2007/08/14/… . To, co faktycznie robią kompilatory, to inna historia (zależy od dostawcy).
stali
@stali: To zależy od więcej niż dostawcy. To zależy od kompilowanego programu. Widziałem ludzi uogólniających od „istnieje program, który Fortran może szybko uruchomić” na „Fortran jest szybszy w każdym programie”. Jeśli zwrócisz na to uwagę, ludzie mogą zacząć obinąć, owłosić i podzielić włosy, a to, co tak naprawdę sprowadza się do końca, to w zasadzie nic więcej niż to, co ludzie chcą myśleć.
Mike Dunlavey,