Czy Fortran jest łatwiejszy do optymalizacji niż C w przypadku ciężkich obliczeń?

Od czasu do czasu czytałem, że Fortran jest lub może być szybszy niż C dla ciężkich obliczeń. Czy to prawda? Muszę przyznać, że prawie nie znam Fortrana, ale kod Fortrana, który widziałem do tej pory, nie pokazał, że język ma cechy, których C nie ma.

Jeśli to prawda, proszę powiedz mi dlaczego. Proszę, nie mów mi, jakie języki lub libs są dobre do chrupania numerów, nie zamierzam pisać aplikacji lub lib do tego, jestem po prostu ciekaw.

Author: Martin Broadhurst, 2008-09-28

23 answers

Języki mają podobne zestawy funkcji. Różnica w wydajności wynika z faktu, że Fortran mówi, że aliasing nie jest dozwolony, chyba że użyto Oświadczenia o równoważności. Każdy kod, który ma aliasing, nie jest poprawny w Fortran, ale to programista, a nie kompilator, powinien wykryć te błędy. W ten sposób Kompilatory Fortran ignorują możliwe aliasowanie wskaźników pamięci i pozwalają im generować bardziej wydajny kod. Spójrz na ten mały przykład w C:

void transform (float *output, float const * input, float const * matrix, int *n)
{
    int i;
    for (i=0; i<*n; i++)
    {
        float x = input[i*2+0];
        float y = input[i*2+1];
        output[i*2+0] = matrix[0] * x + matrix[1] * y;
        output[i*2+1] = matrix[2] * x + matrix[3] * y;
    }
}

Ta funkcja będzie Uruchom wolniej niż odpowiednik Fortran po optymalizacji. Dlaczego? Jeśli zapisujesz wartości do tablicy wyjściowej, możesz zmienić wartości macierzy. W końcu, wskaźniki mogą nakładać się na siebie i wskazywać na ten sam fragment pamięci (w tym wskaźnik int!). Kompilator C jest zmuszony do przeładowania czterech wartości macierzy z pamięci dla wszystkich obliczeń.

W Fortranie kompilator może załadować wartości macierzy raz i zapisać je w rejestrach. Może to zrobić, ponieważ kompilator Fortran zakłada wskaźniki/tablice nie nakładają się w pamięci.

Na szczęście słowo kluczowe restrict i strict-aliasing zostały wprowadzone do standardu C99, aby rozwiązać ten problem. Jest dobrze wspierany w większości kompilatorów C++ w dzisiejszych czasach. Słowo kluczowe pozwala dać kompilatorowi podpowiedź, że programista obiecuje, że wskaźnik nie łączy się z żadnym innym wskaźnikiem. Strict-aliasing oznacza, że programista obiecuje, że wskaźniki innego typu nigdy nie nakładają się na siebie, na przykład double* nie będzie pokrywać się z int* (z wyjątkiem, że char* i void* mogą pokrywać się z czymkolwiek).

Jeśli ich użyjesz, uzyskasz taką samą prędkość z C i Fortran. Jednak możliwość używania słowa kluczowego restrict tylko z funkcjami o znaczeniu krytycznym oznacza, że programy C (i C++) są znacznie bezpieczniejsze i łatwiejsze do napisania. Na przykład, rozważmy nieprawidłowy kod Fortran: CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30), który większość kompilatorów Fortran będzie szczęśliwie kompilować bez żadnego ostrzeżenia, ale wprowadza błąd, który tylko pojawia się na niektórych kompilatorach, na niektórych sprzęcie i z pewnymi opcjami optymalizacji.

 405
Author: Nils Pipenbrinck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 20:31:39

Tak, w 1980; w 2008? depends

Kiedy zacząłem profesjonalnie programować, dominacja prędkości Fortrana była po prostu kwestionowana. Pamiętam, że czytałem o tym w Dr Dobbs i opowiadałem starszym programistom o artykule-śmiali się.

Mam więc dwa poglądy na ten temat, teoretyczny i praktyczny. w teorii Fortran dzisiaj nie ma nieodłącznej przewagi C / C++ , ani nawet żadnego języka, który pozwala na kod asemblera. w praktyce Fortran dzisiaj jeszcze czerpie korzyści z dziedzictwa historii i kultury zbudowanej wokół optymalizacji kodu numerycznego.

Aż do Fortran 77 włącznie, kwestie projektowania języka miały optymalizację jako główny nacisk. Ze względu na stan teorii i technologii kompilatora, często oznaczało to ograniczenie funkcji i możliwości, aby dać kompilatorowi najlepszą szansę na optymalizację kodu. Dobrą analogią jest myślenie o Fortran 77 jako profesjonalnym samochodzie wyścigowym, który poświęca funkcje dla prędkości. W dzisiejszych czasach Kompilatory stały się lepsze we wszystkich językach, a funkcje zwiększające produktywność programistów są bardziej cenione. Jednak nadal istnieją miejsca, w których ludzie zajmują się głównie szybkością w komputerach naukowych; ci ludzie najprawdopodobniej odziedziczyli kod, szkolenie i kulturę od ludzi, którzy sami byli programistami Fortran.

Kiedy zaczyna się mówić o optymalizacji kodu jest wiele problemów i najlepszym sposobem, aby to zrozumieć jest czaić się tam, gdzie ludzie są, których zadaniem jest posiadanie szybkiego kodu numerycznego . Należy jednak pamiętać, że taki krytycznie wrażliwy kod jest zwykle niewielkim ułamkiem ogólnych linii kodu i bardzo wyspecjalizowany: wiele kodu Fortran jest tak samo "nieefektywny" jak wiele innych kodów w innych językach i optymalizacja nie powinna być nawet głównym problemem takiego kodu.

Wspaniałym miejscem do rozpoczęcia nauki o historii i kulturze Fortranu jest wikipedia. wpis Fortran Wikipedia jest wspaniały i bardzo doceniam tych, którzy poświęcili czas i wysiłek, aby uczynić go wartościowym dla społeczności Fortran.

(skrócona wersja tej odpowiedzi byłaby komentarzem w doskonałym wątku rozpoczętym przez Nilsa , ale nie mam na to karmy. Właściwie, prawdopodobnie nie napisałbym nic w ogóle, ale za to ten wątek ma rzeczywistą treść informacyjną i dzielenie się w przeciwieństwie do flame wars i fanatyzmu językowego, który jest moim głównym doświadczeniem z ten temat. Byłam przytłoczona i musiałam dzielić się miłością.)

 149
Author: jaredor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-17 20:46:39

W pewnym stopniu Fortran został zaprojektowany z myślą o optymalizacji kompilatora. Język obsługuje operacje całych tablic, w których Kompilatory mogą wykorzystywać równoległość (szczególnie na procesorach wielordzeniowych). Na przykład,

Mnożenie macierzy gęstej jest po prostu:

matmul(a,b)

L2 norma wektora x wynosi:

sqrt(sum(x**2))

Ponadto stwierdzenia takie jak FORALL, PURE & ELEMENTAL procedury itp. dalsza pomoc w optymalizacji kodu. Nawet wskaźniki w Fortran są tak elastyczne jak C dzięki temu prosty powód.

Nadchodzący Standard Fortran (2008) ma tablice współbieżne, które pozwalają na łatwe pisanie równoległego kodu. G95 (open source) i kompilatory z CRAY już go obsługują.

Więc tak Fortran może być szybki po prostu dlatego, że Kompilatory mogą optymalizować / paralelizować go lepiej niż C / C++. Ale znowu, jak Wszystko inne w życiu, są dobre kompilatory i złe Kompilatory.

 57
Author: user49734,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-10 20:20:00

To zabawne, że wiele odpowiedzi tutaj od nieznajomości języków. Jest to szczególnie prawdziwe dla programistów C / C++, którzy otworzyli i stary kod FORTRAN 77 i omówili słabości.

Przypuszczam, że kwestia prędkości jest głównie pytaniem między C / C++ i Fortran. W ogromnym kodzie zawsze zależy to od programisty. Istnieją pewne cechy języka, który Fortran przewyższa i niektóre funkcje, które robi C. Tak więc w 2011 roku nikt tak naprawdę nie może powiedzieć, który z nich jest szybciej.

Jeśli chodzi o sam język, Fortran obecnie obsługuje pełne funkcje OOP i jest w pełni kompatybilny wstecz. Używałem fortrana 2003 dokładnie i powiedziałbym, że był po prostu zachwycający. W niektórych aspektach Fortran 2003 jest nadal za C++ , ale spójrzmy na użycie. Fortran jest najczęściej używany do obliczeń numerycznych i nikt nie używa wymyślnych funkcji C++ OOP ze względu na szybkość. W High performance computing C++ nie ma prawie dokąd pójść(spójrz na MPI standard i zobaczysz, że C++ został przestarzały!).

Obecnie można po prostu wykonywać programowanie w języku mieszanym z Fortran i C / C++. Istnieją nawet interfejsy dla GTK+ w Fortran. Istnieją darmowe Kompilatory (gfortran, g95) i wiele doskonałych komercyjnych.

 35
Author: Hossein Talebi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-07 07:18:41

Istnieje kilka powodów, dla których Fortran może być szybszy. Jednak ilość ich znaczenie jest tak nieistotne lub można pracować wokół tak, że nie powinno mieć znaczenia. Głównym powodem korzystania z Fortran w dzisiejszych czasach jest utrzymywanie lub rozszerzanie starszych aplikacji.

  • Czyste i elementarne słowa kluczowe o funkcjach. Są to funkcje, które nie mają skutków ubocznych. Pozwala to na optymalizację w pewnych przypadkach, gdy kompilator wie, że ta sama funkcja będzie wywoływana z tymi samymi wartościami. Uwaga: GCC implementuje "pure" jako rozszerzenie języka. Inne Kompilatory również mogą. Analiza między modułami może również przeprowadzić tę optymalizację, ale jest to trudne.

  • Standardowy zestaw funkcji, które zajmują się tablicami, a nie poszczególnymi elementami. Rzeczy takie jak sin(), log(), sqrt() przyjmują tablice zamiast skalarów. Ułatwia to optymalizację procedury. Auto-wektoryzacja daje te same korzyści w większości przypadków, jeśli funkcje te są wbudowane lub builtins

  • Zbudowany Typ kompleksu. Teoretycznie może to pozwolić kompilatorowi na zmianę kolejności lub wyeliminowanie pewnych instrukcji w pewnych przypadkach, ale prawdopodobnie zobaczysz tę samą korzyść z idiomem struct { double re, im; }; używanym w C. powoduje to jednak szybszy rozwój, ponieważ operatorzy pracują na złożonych typach w fortran.

 27
Author: Greg Rogers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-06 10:58:49

Myślę, że kluczowym punktem na korzyść Fortrana jest to, że jest to język nieco bardziej odpowiedni do wyrażania matematyki opartej na wektorach i tablicach. Wskazana powyżej kwestia analizy wskaźnika jest prawdziwa w praktyce, ponieważ przenośny Kod nie może zakładać, że można coś powiedzieć kompilatorowi. Zawsze jest zaleta wyrażenia w sposób bliższy wyglądowi domeny. C tak naprawdę w ogóle nie ma tablic, jeśli przyjrzysz się uważnie, po prostu coś, co się tak zachowuje. Fortran ma Prawdziwe arrawy. Co ułatwia kompilację dla niektórych typów algorytmów, szczególnie dla maszyn równoległych.

W głębi rzeczy, takich jak run-time system i wywołanie konwencji, C i nowoczesny Fortran są na tyle podobne, że trudno dostrzec, co mogłoby coś zmienić. Zauważ, że C tutaj jest tak naprawdę podstawowym C: C++ to zupełnie inny problem z bardzo różnymi charakterystykami wydajności.

 26
Author: jakobengblom2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-06 10:58:19

Nie ma czegoś takiego jak to, że jeden język jest szybszy od drugiego, więc właściwą odpowiedzią jest nie.

To, o co naprawdę musisz zapytać, to " czy kod skompilowany za pomocą kompilatora Fortran X jest szybszy niż równoważny kod skompilowany za pomocą kompilatora C Y?"Odpowiedź na to pytanie oczywiście zależy od tego, które dwa Kompilatory wybierzesz.

Innym pytaniem, jakie można by zadać, byłoby " biorąc pod uwagę ten sam wysiłek włożony w optymalizację w swoich kompilatorach, który kompilator produkować szybszy kod?" Odpowiedź na to pytanie brzmiałaby Fortran . Kompilatory Fortran mają zalety:

    [11]}Fortran musiał konkurować z Assembly jeszcze w czasach, gdy niektórzy przysięgali, że nigdy nie będą używać kompilatorów, więc został zaprojektowany z myślą o szybkości. C został zaprojektowany tak, aby był elastyczny.
  • nisza Fortrana była numerowana. W tym kodzie domeny jest nigdy wystarczająco szybko. Więc zawsze była duża presja, aby utrzymać język efektywny.
  • Większość badania nad optymalizacją kompilatorów są prowadzone przez osoby zainteresowane przyspieszeniem kodu Fortran number crunching, więc Optymalizacja kodu Fortran jest dużo lepiej znanym problemem niż optymalizacja jakiegokolwiek innego skompilowanego języka, a nowe innowacje pojawiają się najpierw w kompilatorach Fortran.
  • Biggie: C To drastycznie zwiększa potencjalny zakres dowolnego elementu danych w programie C, co znacznie utrudnia ich optymalizację. Zauważ, że Ada jest również sposobem lepszy niż C w tej dziedzinie i jest znacznie bardziej nowoczesnym językiem OO niż powszechnie spotykany Fortran77. Jeśli chcesz oo langauge, który może generować szybszy Kod niż C, jest to opcja dla Ciebie.
  • ze względu na swoją niszę, która ogranicza liczbę użytkowników, klienci kompilatorów Fortrana bardziej dbają o optymalizację niż klienci kompilatorów C.

Jednak nic nie stoi na przeszkodzie, aby ktoś włożył mnóstwo wysiłku w optymalizację kompilatora C i uczynił to generować lepszy kod niż kompilator Fortran ich platformy. W rzeczywistości, większa sprzedaż generowana przez kompilatory C sprawia, że ten scenariusz jest całkiem wykonalny

 20
Author: T.E.D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-12 13:33:15

Jest jeszcze jeden element, w którym Fortran jest inny niż C-i potencjalnie szybszy. Fortran ma lepsze reguły optymalizacji niż C. w Fortranie kolejność ewaluacji wyrażeń nie jest zdefiniowana, co pozwala kompilatorowi na jej optymalizację - jeśli chce się wymusić określoną kolejność, należy użyć nawiasów. W C kolejność jest znacznie surowsza, ale z opcjami "- fast" są one bardziej zrelaksowane i" (...) "są również ignorowane. Myślę, że Fortran ma sposób, który leży ładnie w środku. (No cóż, IEEE utrudnia życie, ponieważ pewne zmiany w kolejności oceny wymagają, aby nie wystąpiły przepełnienia, które muszą być ignorowane lub utrudniają ocenę).

Kolejną dziedziną zasad inteligentnych są liczby zespolone. Ponieważ Biblioteka Fortran gfortran jest częściowo napisana w C, ale implementuje semantykę Fortran, GCC zyskał opcję (która może być również używana z "normalnym" C programy):

- fcx-fortran-rules Złożone mnożenie i dzielenie są zgodne z zasadami Fortran. Redukcja zakresu odbywa się w ramach dzielenia złożonego, ale nie ma sprawdzania, czy wynikiem złożonego mnożenia lub dzielenia jest "NaN + I*NaN", z próbą ratowania sytuacji w tym przypadku.

Zasady aliasów wymienione powyżej to kolejny bonus, a także-przynajmniej w zasadzie-operacje całej tablicy, które jeśli zostaną odpowiednio uwzględnione przez optymalizator kompilatora, może prowadzić szybszy kod. Po drugiej stronie są to, że pewne operacje zajmują więcej czasu, np. jeśli ktoś przydziela do tablicy alokowanej, jest wiele kontroli niezbędnych (reallocate? [Fortran 2003 feature], posiada tablice, itd.), które sprawiają, że prosta obsługa jest bardziej skomplikowana za kulisami - a tym samym wolniejsza, ale sprawia, że język jest bardziej wydajny. Z drugiej strony operacje na tablicach z elastycznymi ograniczeniami i krokami ułatwiają pisanie kodu - i kompilator zazwyczaj lepiej optymalizuje Kod niż użytkownik.

W sumie myślę, że zarówno C, jak i Fortran są równie szybkie; wybór powinien być większy, który język lubi więcej lub czy korzystanie z operacji całej tablicy Fortran i jego lepsza przenośność są bardziej użyteczne -- lub lepsze łączenie się z bibliotekami systemowymi i graficznymi w interfejsie użytkownika w C.

 18
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 13:04:47

Nie ma nic o językach Fortran i C, które sprawiają, że jeden jest szybszy od drugiego w określonych celach. Istnieją pewne rzeczy dotyczące specyficznych kompilatorów dla każdego z tych języków, które sprawiają, że niektóre z nich są bardziej korzystne dla niektórych zadań niż inne.

Przez wiele lat istniały Kompilatory Fortran, które mogły wprowadzić czarną magię w twoje procedury numeryczne, wykonując wiele ważnych obliczeń szalenie szybko. Współczesne kompilatory C również tego nie potrafiły. W rezultacie, w Fortranie powstało wiele wielkich bibliotek kodu. Jeśli chcesz korzystać z tych dobrze przetestowanych, dojrzałych, wspaniałych bibliotek, wyłamujesz kompilator Fortran.

Moje nieformalne obserwacje pokazują, że w dzisiejszych czasach ludzie kodują swoje ciężkie rzeczy obliczeniowe w dowolnym starym języku, a jeśli to zajmie chwilę, znajdują czas na jakimś tanim klastrze obliczeniowym. Prawo Moore ' a robi z nas głupców.

 12
Author: jfm3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 16:35:02

Porównuję prędkość Fortrana, C i c++ z klasycznym benchmarkiem Levine-Callahan-Dongarra firmy netlib. Wiele wersji językowych, z OpenMP, jest http://sites.google.com/site/tprincesite/levine-callahan-dongarra-vectors C jest brzydsze, ponieważ zaczęło się od automatycznego tłumaczenia, plus wstawianie restrict i pragmas dla niektórych kompilatorów. C++ jest po prostu C z szablonami STL tam, gdzie ma to zastosowanie. Moim zdaniem STL to mieszana torba co do tego czy poprawia konserwacja.

Istnieje tylko minimalne ćwiczenie automatycznej funkcji in-lining, aby zobaczyć, w jakim stopniu poprawia to optymalizację, ponieważ przykłady są oparte na tradycyjnej praktyce Fortran, gdzie niewielkie poleganie na IN-lining.

Kompilator C/C++, który ma zdecydowanie najbardziej rozpowszechnione zastosowanie, nie ma autointoryzacji, na której te benchmarki w dużym stopniu polegają.

Re post, który pojawił się tuż przed tym: jest kilka przykładów, gdzie nawiasy są używane w Fortran dyktować szybszą lub dokładniejszą kolejność oceny. Znane kompilatory C nie mają opcji obserwowania nawiasów bez wyłączania ważniejszych optymalizacji.

 12
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 13:18:12

Przez kilka lat robiłem obszerną matematykę z FORTRANEM i C. Z własnego doświadczenia mogę powiedzieć, że FORTRAN jest czasami naprawdę lepszy od C, ale nie ze względu na jego szybkość (można sprawić, że C będzie działać tak szybko jak FORTRAN, używając odpowiedniego stylu kodowania), ale raczej ze względu na bardzo dobrze zoptymalizowane biblioteki, takie jak LAPACK, i ze względu na świetną równoległość. Moim zdaniem FORTRAN jest naprawdę niezręczny w pracy, a jego zalety nie są wystarczająco dobre, aby anulować tę wadę, więc teraz Do obliczeń używam C + GSL.

 10
Author: grzkv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-29 20:01:46

Jestem programistą hobbystą i jestem "Przeciętny" w obu językach. Łatwiej jest mi napisać szybki Kod Fortran niż C (lub c++). Zarówno Fortran, jak i C są" historycznymi " językami( według dzisiejszego standardu), są mocno używane i mają dobrze wspierany darmowy i komercyjny kompilator.

Nie wiem, czy to fakt historyczny, ale Fortran wydaje się być zbudowany tak, aby był równoległy/rozproszony/wektoryzowany / cokolwiek-wiele-rdzeni-ized. A dzisiaj jest to raczej "standardowa metryka", gdy mówimy o prędkość: "czy to skaluje ?"

Do czystego crunchingu cpu uwielbiam Fortran. W przypadku czegokolwiek związanego z IO łatwiej jest mi pracować z C.(w obu przypadkach i tak jest to trudne).

Teraz oczywiście dla równoległego kodu matematycznego prawdopodobnie chcesz użyć swojego GPU. Zarówno C jak i Fortran mają dużo mniej lub bardziej dobrze zintegrowanego interfejsu CUDA / OpenCL (a teraz OpenACC).

Moja umiarkowanie obiektywna odpowiedź brzmi: Jeśli znasz oba języki równie dobrze / słabo to myślę, że Fortran jest szybszy ponieważ łatwiej jest mi napisać kod równoległy / rozproszony w Fortranie niż w C. (kiedy zrozumiałeś, że możesz pisać "freeform" fortran, a nie tylko ścisły kod F77)

Oto druga odpowiedź dla tych, którzy chcą mnie odrzucić, ponieważ nie lubią pierwszej odpowiedzi : oba języki mają funkcje wymagane do pisania wysokowydajnego kodu. Więc to zależy od algorytmu, który implementujesz (CPU intensive? io intensive ? intensywna pamięć?), sprzęt (pojedynczy procesor ? wielordzeniowy? dystrybuować superkomputer ? GPGPU ? FPGA ?), swoje umiejętności i ostatecznie sam kompilator. Zarówno C jak i Fortran mają niesamowity kompilator. (jestem poważnie zdumiony tym, jak zaawansowane są Kompilatory Fortran, ale tak samo jak kompilatory C).

PS: cieszę się, że specjalnie wykluczyłeś libs, ponieważ mam wiele złych rzeczy do powiedzenia na temat Fortran GUI libs. :)

 9
Author: ker2x,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-06 11:17:46

Nie słyszałem, żeby Fortan był znacznie szybszy od C, ale w niektórych przypadkach może być szybszy. A klucz nie jest w cechach językowych, które są obecne, ale w tych ,które (zwykle) nieobecne.

Przykładem są wskaźniki C. Wskaźniki C są używane praktycznie wszędzie, ale problem ze wskaźnikami polega na tym, że kompilator zwykle nie może stwierdzić, czy wskazuje na różne części tej samej tablicy.

Na przykład, jeśli napisałeś strcpy rutyna, która wyglądała tak:

strcpy(char *d, const char* s)
{
  while(*d++ = *s++);
}

Kompilator musi działać przy założeniu, że D I s mogą nakładać się na siebie tablice. Nie może więc przeprowadzić optymalizacji, która przyniosłaby różne wyniki, gdy tablice nakładają się na siebie. Jak można się spodziewać, znacznie ogranicza to rodzaj optymalizacji, które można wykonać.

[Należy zauważyć, że C99 ma słowo kluczowe "restrict", które wyraźnie mówi kompilatorom, że wskaźniki nie nakładają się na siebie. Zauważ również, że Fortran też ma pointers, z semantyką inną niż C, ale wskaźniki nie są wszechobecne jak w C.]

Ale wracając do sprawy C VS. Fortran, można sobie wyobrazić, że kompilator Fortran jest w stanie wykonać pewne optymalizacje, które mogą nie być możliwe dla (bezpośrednio napisanego) programu C. Więc nie byłbym zbyt zaskoczony twierdzeniem. Spodziewam się jednak, że różnica w wydajności nie będzie aż tak duża. [~5-10%]

 8
Author: Pramod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 16:25:57

Wszelkie różnice prędkości pomiędzy Fortran i C będą bardziej funkcją optymalizacji kompilatora i bazowej biblioteki matematycznej używanej przez dany kompilator. W Fortranie nie ma nic, co uczyniłoby go szybszym niż C.

W każdym razie dobry programista może napisać Fortran w dowolnym języku.

 8
Author: Kluge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 23:23:58

Szybko i prosto: Oba są równie szybkie, ale Fortran jest prostszy. To, co naprawdę szybsze w końcu zależy od algorytmu, ale i tak nie ma znacznej różnicy prędkości. Tego nauczyłem się podczas warsztatów Fortran w high performance computing center Stuttgarter w Niemczech w 2015 roku. Pracuję zarówno z Fortran i C i podzielam tę opinię.

Explanation:

C został zaprojektowany do pisania systemów operacyjnych. Stąd ma więcej swobody niż potrzeba, aby pisać wysoko kod wydajności. Ogólnie nie jest to żaden problem, ale jeśli ktoś nie zaprogramuje dokładnie, można łatwo spowolnić kod.

Fortran został zaprojektowany do programowania naukowego. Z tego powodu wspiera pisanie szybkiego kodu pod względem składni, ponieważ jest to główny cel Fortran. W przeciwieństwie do opinii publicznej, Fortran nie jest przestarzałym językiem programowania. Jego najnowszym standardem jest rok 2010, a nowe Kompilatory są publikowane regularnie, ponieważ większość kodu o wysokiej wydajności jest pisana w Fortran. Fortran dodatkowo wspiera nowoczesne funkcje jako dyrektywy kompilatora (w pragmatach C).

Przykład: chcemy dać dużą strukturę jako argument wejściowy funkcji (Fortran: subroutine). W ramach funkcji argument nie jest zmieniany.

C obsługuje zarówno wywołanie przez odniesienie, jak i wywołanie przez wartość, co jest przydatną funkcją. W naszym przypadku programista może przez przypadek użyć funkcji call by value. To znacznie spowalnia, ponieważ struktura musi najpierw skopiuj w pamięci.

Fortran pracuje tylko z wywołaniem przez odniesienie, co zmusza programistę do ręcznego kopiowania struktury, jeśli naprawdę chce operacji wywołania przez wartość. W naszym przypadku fortran będzie automatycznie tak szybki jak Wersja C z call by reference.

 7
Author: Markus Dutschke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-10 10:16:21

Ogólnie FORTRAN jest wolniejszy od C. C może używać wskaźników poziomu sprzętowego pozwalających programiście na ręczną optymalizację. FORTRAN (w większości przypadków) nie ma dostępu do hacków adresowania pamięci sprzętowej. (VAX FORTRAN to inna historia.) Używam FORTRAN na I off od lat 70-tych. (naprawdę.)

Jednak, począwszy od lat 90-tych FORTRAN ewoluował, aby zawierać określone konstrukcje językowe, które można zoptymalizować w naturalnie równoległe algorytmy, które mogą naprawdę krzyczeć na procesor wielordzeniowy. Na przykład automatyczna wektoryzacja pozwala wielu procesorom obsługiwać każdy element w wektorze danych jednocześnie. 16 procesorów -- 16 wektorów elementów -- przetwarzanie zajmuje 1/16 czasu.

W C, musisz zarządzać własnymi wątkami i starannie zaprojektować algorytm do wielokrotnego przetwarzania, a następnie użyć kilku wywołań API, aby upewnić się, że równoległość dzieje się poprawnie.

W FORTRAN wystarczy tylko starannie zaprojektować algorytm dla multi-processing. Kompilator I run-time poradzą sobie z resztą za Ciebie.

Możesz poczytać trochę o Wysokiej Wydajności Fortran , Ale znajdziesz wiele martwych linków. Lepiej poczytaj o programowaniu równoległym (np. OpenMP.org ) i jak FORTRAN to wspiera.

 6
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-05 10:51:56

Szybszy kod nie zależy tak naprawdę od języka, jest kompilatorem, więc można zobaczyć ms - VB" kompilator", który generuje nadęty, wolniejszy i nadmiarowy kod obiektowy, który jest związany ze sobą wewnątrz".exe", ale powerBasic generuje zbyt dużo lepszy kod. Kod obiektowy tworzony przez kompilatory C i C++ jest generowany w niektórych fazach (co najmniej 2), ale według projektu większość kompilatorów Fortran ma co najmniej 5 faz, w tym optymalizacje wysokiego poziomu, więc Fortran zawsze będzie miał możliwość generowania wysoce zoptymalizowany kod. Tak więc na końcu jest kompilator, a nie Język, o który powinieneś pytać, najlepszy kompilator, jaki znam, to kompilator Intel Fortran, ponieważ możesz go dostać na Linuksie i Windows i możesz użyć VS jako IDE, jeśli szukasz taniego kompilatora tigh, zawsze możesz przekazać na OpenWatcom.

Więcej informacji o tym: http://ed-thelen.org/1401Project/1401-IBM-Systems-Journal-FORTRAN.html

 4
Author: JPerez45,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-17 03:26:08

Fortran ma lepsze procedury We/Wy, np. sugerowana funkcja do daje elastyczność, której standardowa biblioteka C nie może dopasować.

Kompilator Fortran bezpośrednio obsługuje bardziej złożone składni, a jako taka składnia nie może być łatwo zredukowana aby argumentować formę przekazującą, C nie może jej efektywnie zaimplementować.

 2
Author: Zeus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-05 18:17:45

Większość postów już przedstawia przekonujące argumenty, więc dodam tylko przysłowiowe 2 grosze do innego aspektu.

Bycie fortran szybszym lub wolniejszym pod względem mocy obliczeniowej w końcu może mieć swoje znaczenie, ale jeśli potrzeba 5 razy więcej czasu, aby rozwinąć coś w Fortran, ponieważ:

  • brakuje w nim dobrej biblioteki do zadań innych niż porządne numerowanie
  • nie ma żadnego porządnego narzędzia do dokumentacji i testowania jednostek
  • to język z bardzo niską ekspresywnością, skyrocketing liczby wierszy kodu.
  • ma bardzo słabą obsługę strun
  • ma niezliczoną ilość problemów między różnymi kompilatorami i architekturami doprowadzając cię do szaleństwa.
  • ma bardzo słabą strategię IO (odczyt/zapis plików sekwencyjnych. Tak, pliki dostępu losowego istnieją, ale czy kiedykolwiek widziałeś je używane?)
  • Nie zachęca do dobrych praktyk rozwojowych, modularyzacji.
  • efektywny brak w pełni standardowego, w pełni kompilator zgodny z opensource (zarówno gfortran, jak i g95 nie obsługują wszystkiego)
  • Bardzo słaba interoperacyjność z C (mangling: jeden podkreślnik, dwa podkreślniki, brak podkreślenia, ogólnie jeden podkreślnik, ale dwa, jeśli jest inny podkreślnik. i po prostu niech nie zagłębiać się w wspólnych bloków...)

Zatem sprawa jest nieistotna. Jeśli coś jest powolne, przez większość czasu nie można go poprawić poza dany limit. Jeśli chcesz czegoś szybszego, Zmień algorytm. W końcu komputer czas jest tani. Czas ludzki nie jest. Cenisz wybór, który skraca czas człowieka. Jeśli wydłuża czas komputera, i tak jest opłacalny.

 1
Author: Stefano Borini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-20 03:00:57

Korzystanie z nowoczesnych standardów i kompilatora, nie!

Niektórzy ludzie sugerowali, że FORTRAN jest szybszy, ponieważ kompilator nie musi martwić się aliasingiem(a co za tym idzie może przyjąć więcej założeń podczas optymalizacji). Jednak to zostało rozwiązane w C od standardu C99 (myślę) z włączeniem słowa kluczowego restrict. Co w zasadzie mówi kompilatorowi, że w ramach zakresu give wskaźnik nie jest aliasowany. Ponadto C umożliwia prawidłową arytmetykę wskaźnika, gdzie rzeczy takie jak aliasing mogą być bardzo przydatne pod względem wydajności i alokacji zasobów. Chociaż myślę, że nowsza wersja FORTRAN umożliwia korzystanie z "właściwych" wskaźników.

Dla nowoczesnych implementacji C general przewyższa FORTRAN (choć jest też bardzo szybki).

Http://benchmarksgame.alioth.debian.org/u64q/fortran.html

EDIT:

Słuszna krytyka tego wydaje się być, że benchmarking może być stronniczy. Oto inne źródło (w stosunku do C), które stawia wynik w większym kontekście:

Http://julialang.org/benchmarks/

Widać, że C zazwyczaj przewyższa Fortran w większości przypadków (ponownie zobacz krytykę poniżej, która ma zastosowanie tutaj też); jak inni stwierdzili, benchmarking jest niedokładną nauką, którą można łatwo załadować, aby faworyzować jeden język nad innymi. Ale to stawia w kontekście, jak Fortran i C mają podobną wydajność.

 1
Author: cdcdcd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-19 23:21:57

Fortran potrafi obsługiwać tablice, szczególnie wielowymiarowe, bardzo wygodnie. Wycinanie elementów wielowymiarowej tablicy w Fortran może być znacznie łatwiejsze niż w C/C++. C++ ma teraz biblioteki mogą wykonać zadanie, takie jak Boost lub Eigen, ale są one po wszystkich bibliotek zewnętrznych. W Fortran funkcje te są nieodłączne.

To, czy Fortran jest szybszy czy wygodniejszy w rozwijaniu, zależy głównie od zadania, które musisz ukończyć. Jako osoba naukowa zajmująca się geofizyką, I większość obliczeń wykonałem w Fortranie (mam na myśli nowoczesny Fortran, > = F90).

 1
Author: Kai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-02 18:31:03

Jest to bardziej niż nieco subiektywne, ponieważ wpływa to na jakość kompilatorów i takie bardziej niż cokolwiek innego. Jednak, aby bardziej bezpośrednio odpowiedzieć na twoje pytanie, mówiąc z punktu widzenia języka/kompilatora, nie ma nic o Fortranie NAD C, co sprawi, że będzie on z natury szybszy lub lepszy niż C. jeśli wykonujesz ciężkie operacje matematyczne, sprowadzi się to do jakości kompilatora, umiejętności programisty w każdym języku i wewnętrznych bibliotek wsparcia matematycznego, które są dostępne w tym języku. wsparcie tych operacji, aby ostatecznie określić, który będzie szybszy dla danej implementacji.

EDIT: inni ludzie, tacy jak @Nils, zwrócili uwagę na różnicę w użyciu wskaźników w C i możliwość aliasingu, który może spowolnić najbardziej naiwne implementacje w C. Istnieją jednak sposoby, aby poradzić sobie z tym w C99, poprzez flagi optymalizacji kompilatora i/lub w jaki sposób C jest faktycznie napisany. Jest to dobrze pokryte @ Nils answer i kolejne komentarze, które następują po jego odpowiedzi.

 0
Author: Tall Jeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 16:47:10

Fortran tradycyjnie nie ustawia opcji takich jak-FP: strict (które ifort wymaga, aby włączyć niektóre funkcje w użyciu IEEE_arithmetic, część standardu f2003). Intel C++ również nie ustawia-FP:strict jako domyślnego, ale jest to wymagane na przykład do obsługi ERRNO, a inne kompilatory C++ nie ułatwiają wyłączania ERRNO lub optymalizacji wzmocnienia, takich jak redukcja simd. gcc i G++ wymagały ode mnie skonfigurowania Makefile, aby uniknąć użycia niebezpiecznej kombinacji - O3-ffast-math - fopenmp-march=natywny. Poza tymi problemami, to pytanie o względną wydajność staje się bardziej wybredne i zależne od lokalnych reguł dotyczących wyboru kompilatorów i opcji.

 -3
Author: tim18,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-26 13:14:37