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


410

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

Jeśli to prawda, proszę powiedz mi dlaczego. Proszę, nie mów mi, jakie języki lub biblioteki są odpowiednie do łamania numerów, nie zamierzam pisać aplikacji ani bibliotek, aby to zrobić, jestem po prostu ciekawy.


53
Niezbyt subiektywne z odpowiedzi podanych poniżej. Prawidłowy tytuł brzmi: „Czy są jakieś fundamentalne powody architektoniczne, dla których kompilator Fortran MOŻE produkować lepiej zoptymalizowany kod niż kompilator C”, ale to tylko wybieranie nitów.
Martin Beckett,

3
Myślę, że tytułowe pytanie jest nie tyle subiektywne, co nieporozumienie. Bardziej szczegółowe pytanie nie jest subiektywne.
jfm3

1
Nie sądzę, aby ktokolwiek mógł się wiele z tego nauczyć, poza tym, że odpowiedź brzmi „Tak” i „Nie” w tym samym czasie i różni się w zależności od kompilatora, źródła, procesora, układu pamięci itp. Itd. Ziewanie.
user7116

1
Nie sądzę, aby pytanie lub odpowiedzi były subiektywne. Ale jeśli uważasz, że ta flaga pomaga komukolwiek, nie mam nic przeciwko.
quinmars

2
@sixlettervariables Chociaż ty i ja już znamy odpowiedź, jest to pytanie, które pojawia się u większości ludzi na wczesnym etapie kariery i ważne jest, aby zrozumieć odpowiedź. Zamiast zamieszczać lekceważący komentarz, dlaczego nie znaleźć odpowiedzi, z którą się zgadzasz i dać +1
MarkJ

Odpowiedzi:


447

Języki mają podobne zestawy funkcji. Różnica w wydajności wynika z faktu, że Fortran twierdzi, że aliasing jest niedozwolony, chyba że użyto instrukcji EQUIVALENCE. Każdy kod z aliasingiem nie jest prawidłowy Fortran, ale wykrycie tych błędów zależy od programisty, a nie od kompilatora. Zatem kompilatory Fortran ignorują możliwe aliasing wskaźników pamięci i pozwalają im na generowanie bardziej wydajnego kodu. 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 działałaby wolniej niż odpowiednik Fortrana po optymalizacji. Dlaczego tak? Jeśli zapisujesz wartości w tablicy wyjściowej, możesz zmienić wartości macierzy. W końcu wskaźniki mogą się nakładać i wskazywać na ten sam fragment pamięci (w tym intwskaźnik!). Kompilator C jest zmuszony do ponownego załadowania czterech wartości macierzy z pamięci dla wszystkich obliczeń.

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

Na szczęście restrictsłowo kluczowe i ścisłe aliasing zostały wprowadzone do standardu C99, aby rozwiązać ten problem. Jest również dobrze obsługiwany w większości kompilatorów C ++. Słowo kluczowe pozwala dać kompilatorowi wskazówkę, że programista obiecuje, że wskaźnik nie będzie aliasowany z żadnym innym wskaźnikiem. Ścisłe aliasing oznacza, że ​​programista obiecuje, że wskaźniki innego typu nigdy się nie pokryją, na przykład a double*nie będzie się nakładać z int*(z konkretnym wyjątkiem char*i void*może nakładać się na wszystko).

Jeśli ich użyjesz, otrzymasz taką samą prędkość od C i Fortran. Jednak możliwość używania restrictsłowa kluczowego tylko z funkcjami krytycznymi pod względem wydajności oznacza, że ​​programy C (i C ++) są znacznie bezpieczniejsze i łatwiejsze do napisania. Rozważmy na przykład nieprawidłowy kod Fortran: CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30)który większość kompilatorów Fortran z przyjemnością skompiluje bez żadnego ostrzeżenia, ale wprowadza błąd, który pojawia się tylko w niektórych kompilatorach, na niektórych urządzeniach i przy niektórych opcjach optymalizacji.


26
Wszystkie prawdziwe i ważne, Jeff. Nie uważam jednak przełącznika „zakładaj brak aliasingu” za bezpieczny. Potrafi złamać kod odziedziczony z innych projektów w tak subtelny sposób, że wolałbym go nie używać. Z tego powodu stałem się nazistą z ograniczeniami :-)
Nils Pipenbrinck 28.09.08

3
Po drugie, nie musisz używać przełącznika kompilatora bez aliasu. Wystarczy napisać kod, aby obciążenia oparte na wskaźnikach były najpierw przypisywane do zmiennej automatycznej, a następnie stamtąd pracować z automatyką. Będzie wyglądał bardziej wyczerpująco, ale zostanie zoptymalizowany w dół przez kompilator.
Tall Jeff,

33
Dobrym przykładem jest samo istnienie memcpy () vs. memmove (). W przeciwieństwie do memcpy (), memmove () radzi sobie z nakładającymi się obszarami, dlatego memcpy () może być szybszy niż memmove (). Ten problem był wystarczającym powodem, aby ktoś dołączył dwie funkcje zamiast jednej do standardowej biblioteki.
jfs

12
Myślę, że to był punkt Sebastiana - ze względu na złożoność / elastyczność obsługi pamięci C, nawet coś tak prostego jak przenoszenie pamięci jest trudne.
Martin Beckett,

3
Twój call transformprzykład nie ma większego sensu.
Vladimir F

163

Tak, w 1980 roku; w 2008? zależy

Kiedy zacząłem profesjonalnie programować, dominacja szybkości Fortrana była właśnie kwestionowana. Pamiętam, jak czytałem o tym w Dr. Dobbs i opowiadałem starszym programistom o tym artykule - śmiali się.

Mam więc dwa poglądy na ten temat, teoretyczny i praktyczny. Teoretycznie Fortran nie ma dziś żadnej wewnętrznej przewagi nad C / C ++, a nawet jakimkolwiek językiem, który pozwala na kod asemblera. W praktyce Fortran dzisiaj nadal korzysta z dobrodziejstw historii i kultury zbudowanej wokół optymalizacji kodu numerycznego.

Aż do Fortran 77 włącznie, rozważania dotyczące projektowania języka koncentrowały się na optymalizacji. Ze względu na stan teorii i technologii kompilatora często oznaczało to ograniczenie funkcji i możliwości, aby dać kompilatorowi najlepsze możliwości optymalizacji kodu. Dobrą analogią jest myślenie o Fortran 77 jako profesjonalnym samochodzie wyścigowym, który poświęca cechy prędkości. Obecnie kompilatory są coraz lepsze we wszystkich językach, a funkcje zwiększające produktywność programistów są bardziej cenione. Jednak wciąż istnieją miejsca, w których ludzie zajmują się głównie szybkością obliczeń naukowych; ci ludzie najprawdopodobniej odziedziczyli kod, szkolenia i kulturę od ludzi, którzy sami byli programistami Fortran.

Kiedy zaczyna się mówić o optymalizacji kodu, pojawia się wiele problemów, a najlepszym sposobem, aby to wyczuć, jest czyhanie tam, gdzie ludzie mają za zadanie mieć szybki kod numeryczny . Należy jednak pamiętać, że taki krytycznie wrażliwy kod stanowi zwykle niewielki ułamek ogólnych linii kodu i jest bardzo wyspecjalizowany: duża część kodu Fortran jest tak samo „nieefektywna” jak wiele innych kodów w innych językach, a optymalizacja nie powinna nawet być podstawowa obawa takiego kodu .

Wspaniałym miejscem do rozpoczęcia nauki o historii i kulturze Fortran jest wikipedia. Wpis w Fortran Wikipedia jest znakomity 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 do doskonałego wątku zapoczątkowanego przez Nilsa, ale nie mam na to karmy. Właściwie prawdopodobnie nie napisałbym niczego, gdyby nie to, że wątek ten ma treści informacyjne i dzielenie się w przeciwieństwie do wojen płomiennych i bigoterii językowej, co jest moim głównym doświadczeniem w tym temacie. Byłem przytłoczony i musiałem podzielić się miłością.)


1
link: web.archive.org/web/20090401205830/http : //ubiety.uwaterloo.ca/... już nie działa. Czy istnieje alternatywny link?
nathanielng

64

Do pewnego stopnia Fortran został zaprojektowany z myślą o optymalizacji kompilatora. Język obsługuje operacje na całej tablicy, w których kompilatory mogą wykorzystywać równoległość (szczególnie w procesorach wielordzeniowych). Na przykład,

Mnożenie gęstej macierzy to po prostu:

matmul(a,b)

Norma L2 wektora x to:

sqrt(sum(x**2))

Ponadto instrukcje takie jak FORALL, PURE& ELEMENTALprocedury itp. Dodatkowo pomagają zoptymalizować kod. Nawet wskaźniki w Fortranie nie są tak elastyczne jak C z tego prostego powodu.

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

Tak, więc Fortran może być szybki, ponieważ kompilatory mogą go zoptymalizować / zrównoleglić lepiej niż C / C ++. Ale znowu, jak wszystko inne w życiu, istnieją dobre i złe kompilatory.



1
forallKonstrukt jest przestarzała, ponieważ kompilatory nie mógł zoptymalizować kod dobrze. Zastąpienie jest do concurrent. Ponadto kod sqrt(sum(x**2))wygląda na nieefektywny, ponieważ kompilator prawdopodobnie konstruuje cały wektor x**2. Sądzę, że pętla jest lepsza, ale bez wątpienia najlepiej jest wywoływać funkcję wewnętrzną norm2.
A. Hennink,

39

To zabawne, że wiele odpowiedzi tutaj nie zna języków. Jest to szczególnie prawdziwe w przypadku programistów C / C ++, którzy otworzyli stary kod FORTRAN 77 i dyskutowali o słabościach.

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

Jeśli chodzi o sam język, Fortran obsługuje obecnie pełne funkcje OOP i jest w pełni kompatybilny wstecz. Dokładnie korzystałem z Fortran 2003 i powiedziałbym, że korzystanie z niego było po prostu zachwycające. W niektórych aspektach Fortran 2003 nadal stoi 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 obliczeniach o wysokiej wydajności C ++ prawie nie ma dokąd pójść (spójrz na standard MPI, a zobaczysz, że C ++ jest przestarzały!).

Obecnie możesz po prostu programować w różnych językach za pomocą Fortran i C / C ++. Istnieją nawet interfejsy dla GTK + w Fortran. Istnieją bezpłatne kompilatory (gfortran, g95) i wiele doskonałych komercyjnych.


8
Czy możesz dodać źródło, konkretne doświadczenie lub instytut naukowy / agencję obliczeniową o wysokiej wydajności, która odchodzi od C ++ na potrzeby przyszłych projektów lub przepisuje projekty c ++ na inny język. Pytam tylko dlatego, że znam przynajmniej dwie instytucje naukowe, Sandię i CERN, które intensywnie używają c ++ do modelowania o wysokiej wydajności. Dodatkowo Sandia przekonwertowała jedno ze swoich programów do modelowania (LAMMPS) z fortran na c ++, dodając szereg niesamowitych ulepszeń.
Zachary Kraus,

7
LAMMPS jest napisany w niezwykle prostym języku C ++, który nie korzysta z większości nowoczesnych funkcji języka. Reprezentuje C ++, który programiści Fortran, znający C, piszą po nauce C ++ 98. Nie oznacza to, że LAMMPS jest źle napisany, tylko że nie jest to przykład, który chcesz przytoczyć, opowiadając się za C ++ w HPC.
Jeff

30

Istnieje kilka powodów, dla których Fortran może być szybszy. Jednak ilość, którą mają znaczenie, jest tak mało znacząca lub można ją zmienić, że nie powinno to mieć znaczenia. Głównym powodem korzystania z Fortran jest obecnie utrzymanie lub rozszerzenie starszych aplikacji.

  • Słowa kluczowe PURE i ELEMENTAL dotyczące funkcji. Są to funkcje, które nie mają skutków ubocznych. Umożliwia to optymalizację w niektórych przypadkach, gdy kompilator wie, że ta sama funkcja zostanie wywołana z tymi samymi wartościami. Uwaga: GCC implementuje „czysty” 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 zajmujących się tablicami, a nie pojedynczymi elementami. Rzeczy takie jak sin (), log (), sqrt () pobierają tablice zamiast skalarów. Ułatwia to optymalizację rutyny. Automatyczna wektoryzacja daje te same korzyści w większości przypadków, jeśli funkcje te są wbudowane lub wbudowane

  • Wbudowany typ złożony. Teoretycznie może to pozwolić kompilatorowi na zmianę kolejności lub wyeliminowanie niektórych instrukcji w niektórych przypadkach, ale prawdopodobnie zobaczysz tę samą korzyść z struct {double re, im; }; idiom używany w C. To sprawia, że ​​szybszy rozwój, ponieważ operatorzy pracują na złożonych typach w fortran.


1
„ale prawdopodobnie zobaczysz tę samą korzyść z struct { double re, im; }; użytym w C". Kompilatory C najprawdopodobniej zwrócą tę strukturę w postaci sret ze stosem wywołującym przydzielającym miejsce, przekazując wskaźnik do odbiorcy, który go wypełnia. Jest to kilka razy wolniejsze niż zwracanie wielu wartości w rejestrach, tak jak zrobiłby to kompilator Fortran. Zauważ, że C99 naprawił to w szczególnym przypadku kompleksu.
Jon Harrop

Nie jestem pewien, czy zgadzam się z twoim głównym powodem. Osobiście lubię używać fortran do kodowania z użyciem kodu matematycznego, w którym tablice i funkcje matematyczne są najważniejszą częścią kodu. Wiem jednak, że w wielu instytucjach rządowych i bankach nadal używają fortranu do utrzymywania lub rozszerzania starszego kodu. Osobiście użyłem fortran do rozszerzenia kodu profesora na moim doktoracie. komitet napisał.
Zachary Kraus,

Twoje stwierdzenie „głównym powodem korzystania z Fortran jest obecnie utrzymanie lub rozszerzenie starszych aplikacji” jest całkowicie błędne. Nie widziałem jeszcze żadnego innego języka programowania, nawet w niewielkim stopniu zbliżonego do funkcji, które zapewnia Fortran, szczególnie w aplikacjach matematycznych. Wymieniłeś już kilka z nich, takich jak znakomita obsługa tablic, wbudowane złożone funkcje arytmetyczne, czyste lub elementarne - i mógłbym również wymienić więcej. Już to wystarczy, aby udowodnić, że powyższe stwierdzenie jest błędne.
Pap.

28

Myślę, że kluczową kwestią na korzyść Fortran jest to, że jest to język nieco bardziej odpowiedni do wyrażania matematyki opartej na wektorach i tablicach. Wskazany powyżej problem analizy wskaźnika jest prawdziwy w praktyce, ponieważ przenośny kod nie może tak naprawdę zakładać, że można powiedzieć kompilatorowi coś. ZAWSZE jest korzyść z obliczania wyrażeń w sposób bliższy wyglądowi domeny. C tak naprawdę wcale nie ma tablic, jeśli przyjrzysz się uważnie, po prostu coś takiego się zachowuje. Fortran ma prawdziwe umiejętności. Co ułatwia kompilację dla niektórych rodzajów algorytmów, szczególnie dla maszyn równoległych.

W głębi rzeczy, takich jak system wykonawczy i konwencje wywoływania, C i współczesny Fortran są wystarczająco podobne, że trudno jest dostrzec, co by miało znaczenie. Zauważ, że C tutaj jest naprawdę podstawową C: C ++ to zupełnie inny problem z bardzo różnymi cechami wydajności.


25

Nie ma czegoś takiego, że jeden język jest szybszy od drugiego, więc poprawna odpowiedź brzmi „ nie” .

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

Kolejne pytanie, które można by zadać, brzmiałoby następująco: „Biorąc pod uwagę tyle samo wysiłku włożonego w optymalizację w ich kompilatorach, który kompilator wygenerowałby szybszy kod?” Odpowiedzią na to byłoby w rzeczywistości Fortran . Kompilatory Fortran mają zalety Certian:

  • Fortran musiał konkurować z asemblerem w czasach, gdy niektórzy przysięgali nigdy nie używać kompilatorów, więc został zaprojektowany z myślą o szybkości. C został zaprojektowany z myślą o elastyczności.
  • W niszy Fortrana nastąpiło załamanie liczb. W tej domenie kod nigdy nie jest wystarczająco szybki. Dlatego zawsze była duża presja, aby język był skuteczny.
  • Większość badań nad optymalizacjami kompilatorów jest przeprowadzana przez osoby zainteresowane przyspieszeniem łamania kodu Fortran, więc optymalizacja kodu Fortran jest znacznie lepiej znanym problemem niż optymalizacja jakiegokolwiek innego języka kompilowanego, a nowe innowacje pojawiają się najpierw w kompilatorach Fortran.
  • Biggie : C zachęca do użycia znacznie więcej wskaźników niż Fortran. To drastycznie zwiększa potencjalny zakres dowolnego elementu danych w programie C, co znacznie utrudnia ich optymalizację. Zauważ, że Ada jest również znacznie lepsza niż C w tej dziedzinie i jest znacznie bardziej nowoczesnym językiem OO niż powszechnie spotykany Fortran77. Jeśli chcesz langauge OO, który może generować szybszy kod niż C, jest to opcja dla ciebie.
  • Ponownie z powodu niszy liczbowej, klienci kompilatorów Fortran bardziej dbają o optymalizację niż klienci kompilatorów C.

Jednak nic nie stoi na przeszkodzie, aby ktoś włożył wiele wysiłku w optymalizację kompilatora C i sprawił, że generuje on lepszy kod niż kompilator Fortran na swojej platformie. W rzeczywistości większa sprzedaż generowana przez kompilatory C sprawia, że ​​ten scenariusz jest całkiem wykonalny


4
Zgadzam się. I mogę dodać, że kiedy wprowadzono Fortran (był to pierwszy język wysokiego poziomu) pod koniec lat 50. na początku lat 60. wielu sceptycznie podchodziło do jego skuteczności. Dlatego jego twórcy musieli udowodnić, że Fortran może być wydajny i przydatny, i postanowili „zoptymalizować go na śmierć”, aby udowodnić swój punkt widzenia. C przyszedł znacznie później (od wczesnych lat 70.) i nie miał nic do udowodnienia, że ​​tak powiem. Ale do tego czasu napisano dużo kodu Fortrana, więc społeczność naukowa pozostała przy nim i nadal tak jest. Nie programuję Fortrana, ale nauczyłem się linkować do wywoływania podprogramów Fortran z C ++.
Olumide,

3
Badania dotyczące optymalizacji kompilatora były bardziej zróżnicowane, niż się wydaje. Na przykład historia implementacji LISP jest pełna sukcesów w szybszym niszczeniu liczb niż Fortran (który pozostaje domyślnym pretendentem do wyzwania). Ponadto ogromna część optymalizacji kompilatora ukierunkowana jest na pośrednie reprezentacje kompilatora, co oznacza, że ​​pomijając różnice w semantyce (takie jak aliasing), dotyczą one dowolnego języka programowania danej klasy.
Nigdzie indziej

2
Pomysł często się powtarza, ale nieco nieuczciwe jest twierdzenie, że nie ma żadnych konsekwencji dla wydajności związanej z projektowaniem języka programowania. Niektóre funkcje języka programowania niekoniecznie prowadzą do nieefektywności, ponieważ ograniczają informacje dostępne w czasie kompilacji.
Praxeolitic

@Praxeolitic - To całkiem poprawne (dlatego cieszę się, że nic takiego nie powiedziałem).
TED,

@TED ​​Szczerze mówiąc, wracając tu kilka miesięcy później, nie mam pojęcia, dlaczego zostawiłem ten komentarz do twojej odpowiedzi. Może chciałem zostawić to gdzieś indziej? XP
Praxeolitic

22

Jest inny przedmiot, w którym Fortran różni się od C - i potencjalnie jest szybszy. Fortran ma lepsze reguły optymalizacji niż C. W Fortranie kolejność oceny wyrażeń nie jest zdefiniowana, co pozwala kompilatorowi na zoptymalizowanie jej - jeśli ktoś chce wymusić określoną kolejność, musi użyć nawiasów. W C kolejność jest znacznie bardziej rygorystyczna, ale z opcjami „-fast” są bardziej zrelaksowane i „(...)” są również ignorowane. Myślę, że Fortran ma sposób, który ładnie leży na środku. (Cóż, IEEE utrudnia życie na żywo, ponieważ niektóre zmiany kolejności oceny wymagają, aby nie doszło do przepełnienia, które albo należy zignorować, albo utrudnia ocenę).

Kolejnym obszarem mądrzejszych reguł są liczby zespolone. Nie tylko, że zajęło to C 99, że C je miał, ale zasady rządzące nimi są lepsze w Fortranie; ponieważ biblioteka gfortranu Fortrana jest częściowo napisana w C, ale implementuje semantykę Fortrana, GCC zyskało opcję (która może być również używana z „normalnymi” programami C):

-fcx-fortran-rules Złożone mnożenie i dzielenie są zgodne z regułami Fortrana. Redukcja zasięgu odbywa się jako część złożonego podziału, ale nie ma możliwości sprawdzenia, czy wynikiem złożonego zwielokrotnienia lub podziału jest „NaN + I * NaN”, w tym przypadku próbując uratować sytuację.

Wspomniane powyżej reguły aliasów to kolejna premia, a także - przynajmniej w zasadzie - operacje na całej tablicy, które odpowiednio uwzględnione przez optymalizator kompilatora mogą przyspieszyć kod. Z drugiej strony niektóre operacje wymagają więcej czasu, np. Jeśli wykonasz przypisanie do tablicy, którą można alokować, konieczne jest przeprowadzenie wielu kontroli (realokacja? [Funkcja Fortran 2003], przesuwanie się macierzy itp.), Co powoduje, że prosta operacja jest bardziej złożona za kulisami - a zatem wolniejsza, ale sprawia, że ​​język jest mocniejszy. Z drugiej strony operacje tablicowe z elastycznymi granicami i krokami ułatwiają pisanie kodu - a kompilator zazwyczaj lepiej optymalizuje kod niż użytkownik.

W sumie uważam, że zarówno C, jak i Fortran są równie szybkie; wybór powinien polegać bardziej na tym, który język bardziej mu się podoba, lub na tym, czy użytkowanie operacji Fortran na całej tablicy i jego lepsza przenośność są bardziej przydatne - lub lepsze połączenie z bibliotekami systemowymi i graficznymi interfejsami użytkownika w C.


Co można znacząco „uratować” w sprawie Nan + INan? Tym, co odróżnia nieskończoności od NaN, jest to, że są one podpisywane. Operacje obejmujące nieskomplikowane nieskończoności, które spowodowałyby mętny znak, dają NaN i nie widzę powodu, dla którego liczby zespolone powinny robić inaczej. Jeśli pomnożymy (DBL_MAX, DBL_MAX) przez (2,2), kwadrat wynik, a następnie kwadrat wynik, jaki powinien być znak wyniku w przypadku braku przepełnienia? Co zamiast tego pomnoży to (1.001, DBL_MAX)? Uważam (NaN, NaN) za poprawną odpowiedź, a każdą kombinację nieskończoności i NaN za nonsensowną.
supercat

14

Nie ma nic w językach Fortran i C, które sprawiają, że jeden jest szybszy od drugiego do określonych celów. Istnieją specyficzne kompilatory 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 potrafiły czarną magię w twoich procedurach numerycznych, czyniąc wiele ważnych obliczeń niesamowicie szybkim. Współczesne kompilatory C również nie mogły tego zrobić. W rezultacie w Fortranie powstało wiele świetnych bibliotek kodu. Jeśli chcesz korzystać z tych dobrze przetestowanych, dojrzałych, wspaniałych bibliotek, przełamujesz kompilator Fortran.

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


11
Prawie to zmodernizowałem. Problemem jest to, że Fortran ma pewne nieodłączne zalety. Jesteś jednak dość przekonany, że ważne jest, aby spojrzeć na kompiera, a nie na język.
TED

14

Porównuję prędkość Fortran, C i C ++ z klasycznym testem porównawczym Levine-Callahan-Dongarra od netlib. Wersja wielojęzyczna z OpenMP to http://sites.google.com/site/tprincesite/levine-callahan-dongarra-vectors C jest brzydsze, ponieważ zaczęło się od automatycznego tłumaczenia, a także dodawania ograniczeń i pragmatów dla niektórych kompilatory. C ++ to po prostu C z szablonami STL, w stosownych przypadkach. Moim zdaniem STL jest mieszanym workiem, czy poprawia łatwość konserwacji.

Jest tylko minimalne ćwiczenie automatycznego wstawiania funkcji, aby zobaczyć, w jakim stopniu poprawia ono optymalizację, ponieważ przykłady opierają się na tradycyjnej praktyce Fortrana, w której niewielka zależność polega na wstawianiu.

Kompilatorowi C / C ++, który jest jak dotąd najbardziej rozpowszechniony, brakuje auto-wektoryzacji, na której w dużej mierze polegają te testy porównawcze.

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


Brzydkie tłumaczenie jest wymagane, aby rozwiązać problem aliasingu. Musisz podać próbne zmienne kompilatora, aby powiedzieć, że zmienne byref zaimplementowane jako wskaźniki mogą być zoptymalizowane dla rejestru.
David

12

Jestem programistą hobbystycznym i jestem „przeciętna” w obu językach. Łatwiej jest mi napisać szybki kod Fortran niż kod C (lub C ++). Zarówno Fortran, jak i C są językami „historycznymi” (jak na dzisiejszy standard), są intensywnie używane i mają dobrze obsługiwany darmowy i komercyjny kompilator.

Nie wiem, czy to fakt historyczny, ale Fortran ma wrażenie, że jest zbudowany tak, aby był równoległy / dystrybuowany / wektoryzowany / cokolwiek-wiele rdzeni. A dzisiaj jest to właściwie „standardowa metryka”, kiedy mówimy o prędkości: „czy to skaluje się?”

Dla czystego chrupania procesora uwielbiam Fortran. W przypadku wszystkiego, co dotyczy IO, łatwiej mi pracować z C. (w każdym razie jest to trudne).

Teraz, oczywiście, w przypadku kodu równoległego intensywnie wykorzystującego matematykę prawdopodobnie będziesz chciał użyć swojego GPU. Zarówno C, jak i Fortran mają dużo mniej lub bardziej dobrze zintegrowany interfejs 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 pisać równoległy / rozproszony kod w Fortranie niż C. (gdy zrozumiesz, że możesz pisać „dowolny formularz” fortran i nie tylko ścisły kod F77)

Oto druga odpowiedź dla tych, którzy chcą głosować za mną, ponieważ nie lubią pierwszej odpowiedzi: Oba języki mają funkcje wymagane do pisania kodu o wysokiej wydajności. Zależy to więc od algorytmu, który implementujesz (procesor intensywny? Io intensywność? Intensywnie pamięci?), Sprzętu (pojedynczy procesor? Wielordzeniowy? Dystrybuuj superkomputer? GPGPU? FPGA?), Twoich umiejętności, a ostatecznie samego kompilatora. Zarówno C, jak i Fortran mają niesamowity kompilator. (Jestem bardzo zaskoczony zaawansowanymi kompilatorami Fortran, ale kompilatory C również).

PS: Cieszę się, że specjalnie wykluczyłeś biblioteki lib, ponieważ mam wiele złych rzeczy do powiedzenia na temat bibliotek GUI w Fortran. :)


11

Przez kilka lat zajmowałem się matematyką FORTRAN i C. Z własnego doświadczenia mogę stwierdzić, że FORTRAN jest czasem naprawdę lepszy niż C, ale nie ze względu na jego szybkość (można sprawić, aby C działał tak szybko jak FORTRAN przy użyciu odpowiedniego stylu kodowania), ale raczej z powodu bardzo dobrze zoptymalizowanych bibliotek, takich jak LAPACK, oraz z powodu wielka równoległość. Moim zdaniem FORTRAN jest naprawdę niewygodny w pracy, a jego zalety nie są wystarczająco dobre, aby anulować tę wadę, więc teraz używam C + GSL do obliczeń.


10

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

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


@Scott Clawson: masz -1d i nie wiem dlaczego. Daje +1, aby temu zaradzić. Jednak należy wziąć pod uwagę fakt, że Fortran istnieje już dłużej niż wielu naszych rodziców. Dużo czasu poświęconego na optymalizację wydajności kompilatora: D
user7116

Zgadzam się. Właśnie opublikowałem równolegle bardzo podobną odpowiedź.
Tall Jeff,

Problem aliasu wskaźnika w C został podniesiony przez innych, ale programista może zastosować kilka metod w nowoczesnych kompilatorach, aby sobie z tym poradzić, więc nadal się zgadzam.
Tall Jeff,

1
@Kluge: „Fortran nie ma w sobie nic, co by uczyniło go szybszym niż C”. Wskaźnik aliasing, wracając wartości złożonych w rejestrach, wbudowany wyższego poziomu konstruktów liczbowych ...
Jon Harrop

9

Nie słyszałem, że Fortan jest znacznie szybszy niż C, ale można sobie wyobrazić, że w niektórych przypadkach byłby szybszy. Kluczem nie są obecne funkcje językowe, ale te, które (zwykle) są nieobecne.

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

Na przykład, jeśli napisałeś prostą procedurę, 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 tablice. Dlatego nie może przeprowadzić optymalizacji, która dałaby różne wyniki, gdy tablice się nakładają. Jak można się spodziewać, znacznie ogranicza to rodzaj optymalizacji, które można wykonać.

[Powinienem zauważyć, że C99 ma słowo kluczowe „ogranicz”, które wyraźnie informuje kompilatory, że wskaźniki nie nakładają się. Zauważ też, że Fortran też ma wskaźniki, z semantyką inną niż C, ale wskaźniki nie są wszechobecne jak w C.]

Ale wracając do kwestii C vs. Fortran, można sobie wyobrazić, że kompilator Fortran jest w stanie przeprowadzić pewne optymalizacje, które mogą nie być możliwe w przypadku (prosto napisanego) programu C. Więc nie byłbym zbyt zaskoczony tym roszczeniem. Spodziewam się jednak, że różnica w wydajności nie byłaby aż tak duża. [~ 5–10%]


9

Szybkie i proste: oba są równie szybkie, ale Fortran jest prostszy. To, co naprawdę naprawdę szybciej, zależy od algorytmu, ale i tak nie ma znaczącej różnicy prędkości. Tego nauczyłem się podczas warsztatów Fortran w wysokowydajnym centrum obliczeniowym Stuttgard, Niemcy w 2015 r. Pracuję zarówno z Fortranem, jak i C. Podzielam tę opinię.

Wyjaśnienie:

C został zaprojektowany do pisania systemów operacyjnych. Dlatego ma więcej swobody niż potrzeba do pisania kodu o wysokiej wydajności. Zasadniczo nie stanowi to problemu, ale jeśli nie zaprogramuje się go ostrożnie, można łatwo spowolnić kod.

Fortran został zaprojektowany do programowania naukowego. Z tego powodu obsługuje pisanie szybkiej składni kodu, 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 2010 r., A nowe kompilatory są regularnie publikowane, ponieważ większość kodu o wysokiej wydajności jest napisana w Fortranie. Fortran ponadto obsługuje nowoczesne funkcje jako dyrektywy kompilatora (w języku C).

Przykład: Chcemy podać dużą strukturę jako argument wejściowy do funkcji (fortran: podprogram). W ramach funkcji argument nie jest zmieniany.

C obsługuje zarówno połączenie przez odniesienie, jak i połączenie według wartości, co jest przydatną funkcją. W naszym przypadku programista może przypadkowo użyć wywołania według wartości. Powoduje to znaczne spowolnienie, ponieważ struktura musi być najpierw skopiowana w pamięci.

Fortran działa tylko z wywołaniem przez odniesienie, co zmusza programistę do ręcznego skopiowania struktury, jeśli naprawdę chce operacji wywołania według wartości. W naszym przypadku fortran będzie automatycznie tak szybki jak wersja C z wywołaniem przez odniesienie.


Czy możesz napisać natywną aplikację równoległą w C (to znaczy bez wywoływania bibliotek?). Nie. Czy możesz napisać natywną aplikację równoległą w Fortran? Tak, na kilka różnych sposobów. Ergo, Fortran jest „szybszy”. Chociaż, żeby być uczciwym, w 2010 roku, kiedy pisałeś swój komentarz, obsługa równoległych funkcji Fortran i równoczesnych tablic Fortrana prawdopodobnie nie była tak powszechna jak teraz.
Mali Remorker,

@MaliRemorker Napisał to w 2016 r., A nie w 2010 r.
Kowalski

Narzut związany z tworzeniem równoległych procesów nie jest moim zdaniem najważniejszym czynnikiem dla języka programowania nazywanego „szybkim”. Bardziej istotne są względy praktyczne, takie jak niewykonalny spokój kodu. Nic więc nie pomoże, jeśli raz zaoszczędzisz czas (podczas tworzenia procesu równoległego) i później zmarnujesz go na wiele rdzeni. Termin „szybki” powinien również uwzględniać kody nierównoległe. Z tego powodu nie widzę argumentu przeciwko mojemu punktowi. Może twój komentarz został uznany za niezależną odpowiedź?
Markus Dutschke

8

Zasadniczo FORTRAN jest wolniejszy niż C. C może korzystać ze wskaźników poziomu sprzętu, umożliwiając programistom ręczną optymalizację. FORTRAN (w większości przypadków) nie ma dostępu do hacków adresujących pamięć sprzętową. (VAX FORTRAN to inna historia.) Używam FORTRAN z przerwami od lat 70-tych. (Naprawdę.)

Jednak od lat 90-tych FORTRAN ewoluował i zawiera konkretne konstrukcje językowe, które można zoptymalizować do z natury równoległych algorytmów, które naprawdę mogą krzyczeć na procesorach wielordzeniowych. Na przykład automatyczne wektoryzowanie pozwala wielu procesorom obsługiwać każdy element w wektorze danych jednocześnie. 16 procesorów - wektor 16 elementów - przetwarzanie zajmuje 1/16 czasu.

W C musisz zarządzać własnymi wątkami i ostrożnie projektować algorytm do wieloprzetwarzania, a następnie użyć szeregu wywołań API, aby upewnić się, że równoległość przebiega poprawnie.

W FORTRAN musisz ostrożnie projektować algorytm do wieloprzetwarzania. Kompilator i środowisko wykonawcze zajmą się resztą.

Możesz przeczytać trochę o High Performance Fortran , ale znajdziesz wiele martwych linków. Lepiej poczytaj o programowaniu równoległym (takim jak OpenMP.org ) i o tym, jak FORTRAN to obsługuje.


6
@ S.Lott: Nie mogłem sobie wyobrazić, jak okropny musiałby wyglądać kod C tak dobrze, jak zwykły napisany Fortran dla większości kodów, które mamy tutaj ... a ja jestem programistą C. Lepszą wydajność uzyskasz dzięki prostszemu kodowi w Fortran. Nie to, że ty lub ja nie mogliśmy znaleźć kontrprzykładu. : D
user7116

2
@Greg Rogers: Musisz porozmawiać o tym z ludźmi Fortran Vectorization, a nie ze mną. Po prostu zgłaszam to, co przeczytałem. polyhedron.com/absoftlinux
S.Lott

2
-1 // „Ogólnie FORTRAN działa wolniej niż C. Dotyczy to prawie wszystkiego”. dlaczego? // argument oparty na łatwości korzystania z wielowątkowości w Fortran vs. C nie mówi nic o wydajności.
steabert,

4
@ S.Lott: „wielowątkowość istnieje tylko dla wydajności”. Err, nie.
Jon Harrop,

4
@ S.Lott: „Użycie wskaźników C prawie na poziomie sprzętowym pozwala C być szybszym niż Fortran”. Err, no
Jon Harrop,

5

Szybszy kod tak naprawdę nie zależy od języka, jest to kompilator, dzięki czemu można zobaczyć „kompilator” ms-vb, który generuje rozdęty, wolniejszy i nadmiarowy kod obiektu, który jest powiązany w pliku „.exe”, ale powerBasic generuje zbyt wiele lepszy kod. Kod obiektowy utworzony przez kompilatory C i C ++ jest generowany w niektórych fazach (co najmniej 2), ale z założenia większość kompilatorów Fortran ma co najmniej 5 faz, w tym optymalizacje wysokiego poziomu, więc z założenia Fortran zawsze będzie w stanie wygenerować wysoce zoptymalizowany kod. Na koniec kompilator nie jest językiem, o który należy prosić, najlepszym kompilatorem, jaki znam, jest kompilator Intel Fortran, ponieważ możesz go pobrać na LINUX i Windows, a możesz użyć VS jako IDE, jeśli szukasz tani kompilator Tigh, na którym zawsze możesz polegać na OpenWatcom.

Więcej informacji na ten temat: http://ed-thelen.org/1401Project/1401-IBM-Systems-Journal-FORTRAN.html


3

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

Kompilator Fortran bezpośrednio obsługuje bardziej złożoną składnię, a ponieważ takiej składni nie można łatwo sprowadzić do formy przekazywania argumentów, C nie może jej skutecznie zaimplementować.


1
Czy masz testy porównawcze, które pokazują, że Fortran pokonuje C dla I / O?
Jeff

3

Korzystając z nowoczesnych standardów i kompilatora, nie!

Niektórzy z nas sugerowali, że FORTRAN jest szybszy, ponieważ kompilator nie musi się martwić aliasingiem (a zatem może przyjmować więcej założeń podczas optymalizacji). Jednak zostało to rozwiązane w C od czasu standardu C99 (myślę) z włączeniem słowa kluczowego ograniczającego. Co w zasadzie mówi kompilatorowi, że w podanym zakresie wskaźnik nie jest aliasowany. Ponadto C umożliwia prawidłową arytmetykę wskaźników, gdzie aliasing może być bardzo przydatny pod względem wydajności i alokacji zasobów. Chociaż myślę, że nowsza wersja FORTRAN umożliwia stosowanie „odpowiednich” wskaźników.

W przypadku nowoczesnych wdrożeń ogólne C wyprzedza FORTRAN (choć jest również bardzo szybki).

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

EDYTOWAĆ:

Sprawiedliwa krytyka tego wydaje się być taka, że ​​analiza porównawcza może być stronnicza. Oto inne źródło (w odniesieniu do C), które daje wynik w większym kontekście:

http://julialang.org/benchmarks/

Widać, że C zwykle przewyższa Fortran w większości przypadków (ponownie zobacz krytykę poniżej, która również tutaj ma zastosowanie); jak twierdzą inni, analiza porównawcza jest niedokładną nauką, którą można łatwo załadować, aby faworyzować jeden język nad innymi. Ale pokazuje kontekst, w jaki sposób Fortran i C mają podobną wydajność.


3
Głupcem byłoby wierzyć w coś o Fortranie z postu, który zakłada, że ​​wciąż jest to FORTRAN. Zmieniło się to ponad 25 lat temu. Testy te nie mogą porównywać języków, ponieważ używają kompilatorów różnych dostawców, chociaż zarówno Intel, jak i GCC mają kompilatory dla C i Fortran. Dlatego te porównania są bezwartościowe.
Vladimir F

2

Fortran bardzo wygodnie radzi sobie z tablicą, szczególnie tablicami wielowymiarowymi. Krojenie elementów tablicy wielowymiarowej w Fortranie może być znacznie łatwiejsze niż w C / C ++. C ++ ma teraz biblioteki, które mogą wykonywać to zadanie, takie jak Boost lub Eigen, ale są przecież bibliotekami zewnętrznymi. W Fortranie funkcje te są nieodłączne.

To, czy Fortran jest szybszy czy wygodniejszy w rozwoju, zależy głównie od pracy, którą musisz ukończyć. Jako osoba zajmująca się obliczeniami naukowymi dla geofizyki, większość obliczeń wykonywałem w Fortranie (mam na myśli współczesny Fortran,> = F90).


1
A także to, czy Fortran jest szybszy, zależy również od: kompilatora, którego używasz (to ma znaczenie!), W przypadku zadań obliczeniowych, czy zastosujesz odpowiednią równoległość do kodu i jak napisany jest Twój kod.
Kai

1

Jest to więcej niż nieco subiektywne, ponieważ wpływa na jakość kompilatorów i wiele więcej. Jednak, aby bardziej bezpośrednio odpowiedzieć na twoje pytanie, mówiąc z punktu widzenia języka / kompilatora, w Fortranie nad C nie ma nic, co sprawiłoby, że będzie ono z natury szybsze lub lepsze niż C. Jeśli wykonujesz ciężkie operacje matematyczne, sprowadzi się to do jakość kompilatora, umiejętności programisty w każdym języku oraz wewnętrzne biblioteki obsługi matematyki obsługujące te operacje, aby ostatecznie określić, która będzie szybsza dla danej implementacji.

EDYCJA: Inne osoby, takie jak @Nils, podniosły rację na temat różnicy w użyciu wskaźników w C i możliwości aliasingu, która może spowolnić najbardziej naiwne implementacje w C. Jednak istnieją sposoby, aby sobie z tym poradzić w C99 , poprzez flagi optymalizacji kompilatora i / lub sposób, w jaki napisano C. Jest to dobrze opisane w odpowiedzi na @Nils i kolejnych komentarzach dotyczących jego odpowiedzi.


Brzmi jak test porównawczy algorytmu. Które zajmuje mniej czasu, FORTRAN lub C? Nie brzmi dla mnie subiektywnie. Być może coś mi brakuje.
S.Lott,

1
Nie zgadzać się. Porównujesz kompilatory, a nie języki. Myślę, że pierwotne pytanie brzmi, czy jest coś w JĘZYKU, który czyni go z natury lepszym. Inne odpowiedzi tutaj dotyczą subtelnych wątpliwych różnic, ale myślę, że najbardziej się zgadzamy, że są w hałasie.
Tall Jeff,

To nie jest analiza algorytmów O (n). To wydajność. Nie widzę, jak wydajność może być hipotetyczną koncepcją niezależną od implementacji. Chyba coś mi umknęło.
S.Lott,

1
-1: „w Fortranie nie ma nic, co sprawiłoby, że byłby on z natury szybszy lub lepszy niż C”. Err, nie.
Jon Harrop

0

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

Bycie fortranem szybciej lub wolniej pod względem mocy obliczeniowej może mieć swoje znaczenie, ale jeśli zajmie to 5 razy więcej czasu, aby opracować coś w Fortranie, ponieważ:

  • nie ma żadnej dobrej biblioteki do zadań innych niż łamanie liczb
  • brak jest przyzwoitego narzędzia do dokumentacji i testów jednostkowych
  • jest to język o bardzo niskiej ekspresji, błyskawicznie zmieniający liczbę wierszy kodu.
  • ma bardzo słabą obsługę łańcuchów
  • ma niesamowitą ilość problemów wśród różnych kompilatorów i architektur, które doprowadzają cię do szaleństwa.
  • ma bardzo słabą strategię IO (CZYTAJ / PISUJ pliki sekwencyjne. Tak, istnieją pliki o swobodnym dostępie, ale czy widziałeś je kiedyś?)
  • nie zachęca do dobrych praktyk rozwojowych, modularyzacji.
  • efektywny brak w pełni standardowego, w pełni zgodnego kompilatora opensource (zarówno gfortran, jak i g95 nie obsługują wszystkiego)
  • bardzo słaba interoperacyjność z C (mangling: jeden znak podkreślenia, dwa znaki podkreślenia, brak podkreślenia, ogólnie jeden znak podkreślenia, ale dwa, jeśli jest inny znak podkreślenia. i nie pozwól, by zagłębiał się w WSPÓLNE bloki ...)

Zatem kwestia nie ma znaczenia. Jeśli coś jest wolne, przez większość czasu nie można go poprawić powyżej określonego limitu. Jeśli chcesz czegoś szybciej, zmień algorytm. W końcu czas na komputery jest tani. Czas ludzki nie jest. Doceń wybór, który skraca czas ludzki. Jeśli wydłuża czas pracy komputera, i tak jest opłacalny.


3
przegłosowano, ponieważ chociaż poruszasz ciekawe kwestie, które dodają do dyskusji o zaletach / wadach fortrans w porównaniu z innymi językami (z którymi się całkowicie nie zgadzam), tak naprawdę nie jest to odpowiedź na pytanie ...
steabert

@steabert: w rzeczywistości powiedziałemI will just add the proverbial 2 cents to a different aspect
Stefano Borini,

1
+1 ode mnie za jakąś nieciekawą odpowiedź. Jak powiedziałeś, Fortran może być szybszy w niektórych rzadkich zadaniach (nie widziałem żadnych osobiście). Ale ilość czasu, jaki tracisz na utrzymanie niemożliwego do opanowania języka, niszczy wszelkie możliwe korzyści.
André Bergner,

10
-1. Wygląda na to, że myślisz o Fortranie w kategoriach F77. Zostały zastąpione przez F90, F95, F03 i F08.
Kyle Kanos

4
Głosowane, ponieważ mówi wyłącznie o jednej stronie kompromisu. Szybkość programowania może mieć znaczenie w przypadku większości ogólnych programów, ale nie oznacza to, że jest to jedyny ważny kompromis. Programiści Fortran to często naukowcy / inżynierowie, którzy cenią sobie prostotę języka (FORmula TRANslation jest niezwykle łatwa do nauczenia się i opanowania. C / C ++ nie jest ), doskonałe biblioteki (często używane z innych języków) oraz szybkość (np. Symulacje pogody w Fortran zajmuje to kilka dni, ale miesiące, jeśli są napisane wyłącznie w innych językach).
BraveNewCurrency

-3

Fortran tradycyjnie nie ustawia opcji takich jak -fp: strict (który ifort wymaga włączenia niektórych funkcji w USE IEEE_arithmetic, będącym częścią standardu f2003). Intel C ++ również nie ustawia -fp: strict jako domyślny, ale jest to wymagane na przykład do obsługi ERRNO, a inne kompilatory C ++ nie sprawiają, że wygodne jest wyłączanie ERRNO lub uzyskanie optymalizacji takich jak redukcja SIMD. gcc i g ++ wymagały ode mnie skonfigurowania Makefile, aby uniknąć użycia niebezpiecznej kombinacji -O3 -ffast-matematyka -fopenmp -march = native. Poza tymi zagadnieniami to pytanie dotyczące względnej wydajności staje się bardziej wybredne i zależy od lokalnych zasad dotyczących wyboru kompilatorów i opcji.


Ostatnie aktualizacje gcc rozwiązały problem z kombinacją Openmp i fast-matematyki.
tim18

Ta odpowiedź naprawdę dotyczy tego, że użytkownicy nie rozumieją domyślnych flag dla swoich kompilatorów, a nie samych języków.
Jeff
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.