C ++ vs Fortran dla HPC

56

W moim programie doktoranckim z zakresu obliczeń pracujemy prawie wyłącznie w C ++ i Fortran. Wygląda na to, że niektórzy profesorowie wolą jeden od drugiego. Zastanawiam się, który z nich jest „lepszy” lub czy w pewnych okolicznościach jest lepszy od drugiego.

drjrm3
źródło
12
Moim zdaniem połączenie języka wysokiego i niskiego poziomu jest lepsze niż używanie wyłącznie jednego z nich. Np. Używam Python + C ++.
Faheem Mitha
2
Odpowiedzi na to pytanie będą niemal wyłącznie subiektywne, dlatego nie jestem pewien, czy to pytanie jest właściwe.
Jeff

Odpowiedzi:

61

Jak często wybór zależy od (1) problemu, który próbujesz rozwiązać, (2) posiadanych umiejętności i (3) osób, z którymi współpracujesz (chyba że jest to projekt solowy). Na razie zostawię (3) na bok, ponieważ zależy to od indywidualnej sytuacji każdego.

Zależność od problemu: Fortran przoduje w przetwarzaniu tablic. Jeśli Twój problem można opisać w kategoriach prostych struktur danych, aw szczególności tablic, Fortran jest dobrze przystosowany. Programiści Fortran używają tablic nawet w nieoczywistych przypadkach (np. Do reprezentowania wykresów). C ++ lepiej nadaje się do złożonych i wysoce dynamicznych struktur danych.

Zależność od umiejętności: pisanie dobrych programów w C ++ zajmuje dużo więcej doświadczenia niż pisanie dobrych programów w Fortranie. Jeśli zaczynasz z niewielkim doświadczeniem w programowaniu i masz tak dużo czasu, aby nauczyć się tego aspektu swojej pracy, prawdopodobnie uzyskasz lepszy zwrot z inwestycji w Fortran niż w C ++. Zakładając oczywiście, że twój problem pasuje do Fortrana.

Jednak programowanie to coś więcej niż tylko Fortran i C ++. Polecam każdemu, kto zaczyna naukę obliczeń, aby zacząć od dynamicznego języka wysokiego poziomu, takiego jak Python. Zawsze pamiętaj, że Twój czas jest cenniejszy niż czas procesora!

Khinsen
źródło
17
„Zawsze pamiętaj, że Twój czas jest cenniejszy niż czas procesora!” Jako osoba pracująca w HPC nie zgadzam się z tą częścią; wszystko inne jest na miejscu.
Levi Morrison
19
„Zawsze pamiętaj, że twój czas jest bardziej wartościowy niż czas procesora!” Jako osoba zajmująca się badaniami naukowymi nie mogłem bardziej zgodzić się z tą częścią.
dekaltuje
3
„Zawsze pamiętaj, że Twój czas jest cenniejszy niż czas procesora!” - Chciałbym wrzucić moje 2 centy - użycie kilkuset węzłów, z których każdy ma ponad 10 rdzeni, aby uruchomić jakiś program przez kilka tygodni, może być interpretowane jako okropne marnowanie najcenniejszego zasobu, jeśli kilka tygodni może dać kod działający w ciągu zaledwie kilku dni. Te klastry HPC są rzadkim i drogim wspólnym zasobem.
Dani_l,
„Zawsze pamiętaj, że twój czas jest bardziej wartościowy niż czas procesora!”, Kod na tydzień, ale uruchamiany na miesiąc, to całkiem zwyczajny panie!
fronthem
6
„Zawsze pamiętaj, że twój czas jest cenniejszy niż czas procesora!”, Wolałbym kodować przez miesiąc i biegać za tydzień! - po napisaniu kodu można zrobić więcej, a inni uznają, że kod, który napiszesz, jest również bardziej przydatny.
Charles
37

Myślę, że zarówno C ++, jak i Fortran są wystarczająco dobre i działają dobrze.

Myślę jednak, że Fortran jest lepszy do numerycznego obliczenia naukowego, do algorytmów, które można wyrazić za pomocą tablic i nie potrzebują innych wyrafinowanych struktur danych, więc w dziedzinach takich jak różnice skończone / elementy, solwery PDE, obliczenia struktury elektronicznej. Fortran jest językiem specyficznym dla domeny. W szczególności myślę, że łatwiej jest pisać szybko programy w Fortranie niż w C ++ przez naukowca (niekoniecznie eksperta w dziedzinie informatyki).

C ++ jest językiem ogólnego przeznaczenia, więc można w nim wyrazić dowolny algorytm, i jest zdecydowanie lepszy dla algorytmów, których nie można wyrazić za pomocą tablic, z pola HPC prawdopodobnie niektóre wykresy, generatory siatki, manipulacje symboliczne i tak dalej.

Możliwe jest także pisanie algorytmów tablicowych w C ++, ale z mojego doświadczenia wynika, że ​​wymaga to znacznie większej wiedzy informatycznej i ogólnie więcej pracy (tj. Trzeba stworzyć lub ponownie wykorzystać klasy do manipulacji tablicami i ręcznie zarządzać pamięcią biblioteka taka jak Teuchos z Trilinos). Nie-eksperci zwykle piszą całkiem dobre programy Fortran, ale okropne programy C ++ (mówiąc z własnego doświadczenia).

Oświadczenie: Osobiście bardzo lubię Fortran i wolę go od C ++ do obliczeń numerycznych. Spędziłem ponad 2 lata programowania w C ++ codziennie i prawie rok programowania w nowoczesnym dzienniku Fortran (w obszarze elementów skończonych). Często używam Python i Cython.

Ondřej Čertík
źródło
1
Jeden za pierwszą odpowiedź jest zrównoważony. Myślę, że C ++ i Fortran to zdecydowanie nie jedyne możliwości we współczesnym HPC. Myślę, że dobrze jest znać siłę i słabe punkty, kiedy decydujesz się na Fortran, C ++ lub Python (lub cokolwiek chcesz). W jednym pliku widziałem 20 000 wierszy Fortranu, które uprawiano organicznie w ciągu kilku dekad. Ja osobiście nie używałbym do niczego innego niż izolowane przetwarzanie z dużą liczbą macierzy. Nawet w przypadku czegokolwiek związanego z produkcją. Jak dotąd stronniczy komentarz.
shuhalo,
6
Nie mogłem bardziej nie zgodzić się z tą odpowiedzią. Nasz kod elementów skończonych nie byłby możliwy do napisania w Fortranie. W rzeczywistości zaczął się 15 lat temu jako połączenie zwykłego C i Fortranu (ten ostatni dotyczy części liczbowo intensywnych metody) i stopniowo przechodził do czystego C, a następnie do C ++ w ciągu kilku lat. Kod stawał się coraz krótszy, szybszy i łatwiejszy do zrozumienia, a po każdej iteracji był bardziej wydajny. Zgadzam się z innymi, którzy podkreślają, że C ++ daje ci mnóstwo lin do strzelania. Wybierz język, w którym czujesz się najlepiej.
Bill Barth,
6
Bill, czy korzystałeś z nowoczesnego Fortranu (90 i późniejsze dodatki?). Jest to bardzo ważne (w mojej odpowiedzi powinienem być bardziej wyraźny). Oczywiście, „20 000 linii Fortrana” lub f77 zwykle nie jest lepsza niż dobrze napisany C ++.
Ondřej Čertík,
1
@ OndřejČertík: Myślę, że jeśli wierzysz, że nowoczesne programy elementów skończonych wykorzystują „proste” struktury danych, to ostatnio nie oglądałeś żadnego z nich. Spróbuj wdrożyć adaptacyjne elementy skończone, metody hp lub multigrid na nieustrukturyzowanych siatkach, używając prostych struktur danych. Bill jest na miejscu i sądzę, że mogę mówić za niego, mówiąc, że użycie „nowoczesnego Fortranu” nie zrobiłoby nic więcej niż niewielką różnicę.
Wolfgang Bangerth
6
@WolfgangBangerth, zobacz na przykład Phaml ( math.nist.gov/phaml ), aby uzyskać implementację w Fortranie prawie wszystkiego, o czym wspomniałeś.
Ondřej Čertík
31

Rzucam też swoje dwa centy trochę za późno, ale dopiero co widziałem ten wątek i czuję, że dla potomnych jest kilka kwestii, które desperacko trzeba poczynić.

Zauważ, że będę mówić o C, a nie C ++. Dlaczego? Cóż, inaczej jabłka i pomarańcze porównują pełnoprawny, dynamicznie typowany obiektowy język z czymś tak statycznym jak Fortran. Tak, niektóre współczesne implementacje najnowszych standardów Fortran mogą zrobić coś więcej, ale bardzo niewiele osób z nich korzysta, więc kiedy mówimy o Fortranie, myślimy o języku prostym, statycznym i imperatywnym. Tam też jest C, więc zamienię C na C ++ dla następujących.

Przede wszystkim dyskusja na temat Fortran / C z lepszymi kompilatorami jest dyskusyjna. Dedykowane kompilatory C / Fortran należą już do przeszłości. Zarówno gcc / gfortran, jak i icc / ifc to po prostu różne interfejsy do tego samego zaplecza, tzn. Twój program zostanie przekształcony w abstrakcyjny opis przez interfejs, a następnie zoptymalizowany i złożony przez back-end. Jeśli napiszesz semantycznie ten sam kod w Fortran lub w C, kompilator w obu przypadkach utworzy ten sam zestaw, który będzie działał równie szybko.

To prowadzi teraz do mojej drugiej kwestii: dlaczego wciąż widzimy różnice? Problem polega na tym, że większość porównań przeprowadzają programiści Fortrana próbujący czegoś w C lub odwrotnie. Czy zauważyłeś kiedyś, jak większość autorów lub poetów woli pisać w swoich językach ojczystych? Czy chciałbyś pisać wiersze w języku, w którym nie czujesz się całkowicie pewny siebie lub w domu? Oczywiście, że nie ... Sam uważam C za mój „rodzimy” język programowania. Spędziłem jednak również trzy lata pracując w grupie, która korzystała wyłącznie z Fortranu, w której osiągnąłem pewien poziom biegłości. Jednak nigdy nie napisałbym niczego samodzielnie w Fortranie, ponieważ czuję się bardziej komfortowo z językiem C, w wyniku czego powstały kod będzie lepszy , bez względu na to, jak go zdefiniujesz.

Główną różnicą jest programista, a nie język. Więc nie ma różnic? Cóż, niezupełnie. Oto kilka przykładów:

  • SIMD: Bez względu na to, czy chodzi o SSE, SSE3 czy AltiVec, jeśli chcesz ich używać w Fortranie, lepiej miej nadzieję i módl się, aby kompilator zgadł dokładnie, co chcesz i tak robi. Powodzenia. W C na ogół masz funkcje wewnętrzne dla każdej architektury lub, ostatnio, ogólne typy wektorów SIMD w gcc . Większość kompilatorów Fortran będzie używać tylko instrukcji SIMD do rozwijania pętli, ale jeśli masz jądro, które działa na krótkich wektorach danych w nieoczywisty sposób, kompilator najprawdopodobniej go nie zobaczy.

  • Różne architektury sprzętowe: cała architektura CUDA jest zbudowana wokół jąder w C. Tak, grupa Portland ma teraz także kompilator fortran kompatybilny z CUDA , ale jest komercyjny, a co najważniejsze, nie pochodzi od NVIDIA. To samo dotyczy OpenCL, dla którego najlepsze, co mogłem znaleźć, to najnowszy projekt, który obsługuje tylko kilka podstawowych wywołań.

  • Programowanie równoległe: Tak, zarówno MPI, jak i OpenMP działają dobrze zarówno z C, jak i Fortranem. Jeśli jednak chcesz mieć rzeczywistą kontrolę nad swoimi wątkami, tj. Jeśli masz w pełni dynamiczne obliczenia z pamięcią współużytkowaną, Fortran nie będzie ci zimno. W C masz standardowe wątki, które, choć nie są ciepłe i rozmyte, nadal prowadzą cię przez burzę. Ogólnie rzecz biorąc, większość obliczeń opartych na dostępie do systemu operacyjnego, np. Wątki, procesy, system plików itp., Lepiej jest obsługiwać w języku C. Och, i nie próbuj tworzyć sieci z Fortranem.

  • Łatwość użycia: Fortran jest bliższy Matlabowi niż C. Po zapoznaniu się z wszystkimi różnymi słowami kluczowymi i sposobem deklarowania zmiennych, reszta kodu wygląda jak Matlab, dzięki czemu jest bardziej dostępny dla użytkowników o ograniczonym doświadczeniu programistycznym.

  • Interoperacyjność: kiedy tworzysz strukturę w C, układ rzeczywistych danych jest prosty i deterministyczny. W Fortran, jeśli używasz tablic wskaźników lub danych strukturalnych, faktyczny układ danych jest silnie zależny od kompilatora, nie jest prosty i zwykle całkowicie nieudokumentowany. Możesz zadzwonić do C z Fortran i odwrotnie, ale nie zaczynaj myśleć, że może być tak łatwo przekazać coś więcej niż statyczną tablicę z jednej strony na drugą iz powrotem.

To wszystko jest trochę dziwaczne, na niskim poziomie, ale mówimy o obliczeniach o wysokiej wydajności, prawda? Jeśli nie jesteś zainteresowany tym, jak najlepiej wykorzystać podstawowe paradygmaty sprzętowe, tj. Wdrażanie i / lub opracowywanie algorytmów, które są najlepsze dla pamięci współużytkowanej / rozproszonej, wątków, wektoryzacji SIMD, GPU korzystających z SIMT i tak dalej, to jesteś po prostu wykonuję matematykę na komputerze.

Stało się to znacznie dłużej niż cokolwiek, w co uczestniczyłem, więc oto podsumowanie - zestaw pewnego rodzaju wiadomości:

  • Będziesz pisać najlepszą kod Państwo może w języku, który cię znasz najlepiej.
  • Nie ma różnicy w jakości kodu wytwarzanego przez dwa kompilatory, które używają tego samego zaplecza - to my piszemy zły kod w tym czy innym języku.
  • Pomimo poczucia niskiego poziomu, Fortran jest dość wysokim poziomem abstrakcji i nie pozwala na bezpośredni dostęp do niektórych funkcji sprzętu / systemu operacyjnego, np. SIMD, wątków, sieci itp.
Pedro
źródło
5
Dobra odpowiedź. Nie sądzę jednak, aby twój ostatni komentarz był koniecznie prawdziwy. Sam jestem programistą C, ale dzięki dobrym praktykom programistycznym masz dostęp do rzeczy niskiego poziomu w Fortranie. Idealnym sposobem wykorzystania takich funkcji jak SIMD ops jest napisanie kodu, który zdecydowanie to sugeruje (na przykład blokowanie pętli) i pozwolenie kompilatorowi zrobić to za Ciebie. Do wątków wystarczy użyć openMP (pthreads jest również użyteczny przy dodatkowej pracy). Fortran ma wszystkie rzeczy, o których nie wspominasz, tylko na poziomie, który ma znaczenie dla jego typowego użytkownika: numeryczny.
Reid.Atcheson
@ Reid.Atcheson: Cóż, jeśli zablokujesz wszystko tak, że kompilator to złapie, to będzie działał automagicznie zarówno w C, jak i w Fortranie. Problem jednak polega na tym, jak daleko chcesz zaufać swojemu kompilatorowi? I dlaczego chcesz mu ufać w przypadkach, gdy dokładnie wiesz , co chcesz zrobić? OpenMP robi wątki, tak, ale blokowo. Możesz oszukać to, aby uzyskać różne pule wątków, aby robić różne rzeczy, ale to po prostu niewłaściwe użycie OpenMP. Pthreads for Fortran to po prostu opakowanie funkcji C. Zgadzam się jednak, że Fortran jest łatwiejszy, jeśli nie znasz szczegółów.
Pedro
1
Na pewno nie uzyskasz pełnej wydajności szczytowej 99% w oparciu o kompilator, ale możesz łatwo podejść bardzo blisko. Poza tym musisz albo użyć funkcji wewnętrznej, albo wbudowanego ASM. Musisz gdzieś pójść na ustępstwa dla ogólnej wydajności programisty, dlatego języki programowania istnieją przede wszystkim. Na etapie, w którym naprawdę jesteś wystarczająco szalony, aby wniknąć w szczegóły intrinsics lub ASM (byłem kilka razy), Fortran nie jest kulą. W każdym razie wiedziałbyś, jak połączyć swój zmontowany ręcznie zoptymalizowany kod.
Reid.Atcheson
@ Reid.Atcheson: Cóż, twierdzę, że w przypadku równoległych aplikacji HPC może się okazać, że wydajność końcowa jest znacznie poniżej 99% wydajności szczytowej ... A typy wektorów gcc sprawiają, że używanie wewnętrznych elementów nie jest problemem :)
Pedro
1
@Pedro, genialny post. Absolutnie genialny. Wielkie dzięki za wysłanie. Właśnie go znalazłem podczas losowego przeszukiwania interesujących wątków.
Zapytanie
16

Z moich 15 lat myślenia o oprogramowaniu naukowym: jeśli Twój kod działa o 25% szybciej, ponieważ piszesz go w Fortran, ale napisanie go zajmuje 4 razy dłużej (bez STL, trudności z implementacją złożonych struktur danych itp.), To Fortran wygrywa tylko wtedy, gdy spędzasz znaczną część swojego dnia kręcąc kciukami i czekając na zakończenie obliczeń. Biorąc pod uwagę, że dla prawie każdego z nas najcenniejszą rzeczą jest nasz własny czas, wniosek jest następujący: użyj języka, który pozwala ci najszybciej opracowywać, debugować i testować swój kod, w granicach rozsądku ignorując, że może być wolniejszy niż być może możliwe, jeśli napisałeś to w Fortranie.

Wolfgang Bangerth
źródło
13

Moje podejście polegało na użyciu C ++ do wszystkiego oprócz jąder obliczeniowych, które zwykle najlepiej pisać w asemblerze; kupuje to całą wydajność tradycyjnego podejścia HPC, ale pozwala uprościć interfejs, np. przez przeciążenie jąder obliczeniowych, takich jak SGEMM / DGEMM / CGEMM / ZGEMM, w jedną procedurę, powiedzmy Gemm. Oczywiście poziom abstrakcji można podnieść znacznie wyżej, unikając surowych wskaźników i przechodząc do nieprzejrzystych klas, ale jest to dobry pierwszy krok.

Uważam, że największym minusem C ++ jest w przeważającej mierze wzrost czasu kompilacji, ale z mojego doświadczenia wynika, że ​​oszczędności czasu na programowanie nadrabiają. Inną wadą jest to, że kompilatory C ++ dostawcy mają zwykle więcej błędów niż kompilatory C i Fortran. Wydaje mi się, że w ubiegłym roku napotkałem prawie dziesięć błędów w kompilatorach C ++.

Biorąc to wszystko pod uwagę, myślę, że cofanie pakietów naukowych napisanych w językach niskiego poziomu (i Fortran) jest niechęcią do ujawniania wygodnych interfejsów dla skomplikowanych struktur danych: większość ludzi jest zadowolona z interfejsu Fortran BLAS, ponieważ wymaga on tylko wskaźników i wiodących wymiarów do opisania macierzy, ale niewiele osób twierdziło, że zwykły 40-całkowity interfejs Fortran Sparse-Direct Solver jest zbliżony do dogodnego (por. UHM, SuperLU, PETSc i Trilinos).

Podsumowując, opowiadam się za użyciem asemblera do niskopoziomowych jąder obliczeniowych, ale języków wyższego poziomu do wszystkiego innego, szczególnie podczas pracy na nietrywialnych strukturach danych.

y: =αx+y

Jack Poulson
źródło
2
Dlaczego nie miałbyś ufać standardowemu kompilatorowi C z włączoną odpowiednią optymalizacją w celu kompilacji małych jąder? Na tym poziomie wielkości kodu i złożoności różnica w tym, co kompilator mógłby z niego wyciągnąć, jest niejasna.
Peter Brune,
1
Rozmawiałem z kilkoma osobami, które powiedziały mi, że nawet przy odpowiednim ograniczeniu użycia ich Fortran był wciąż szybszy niż kod C i / lub C ++ dla niektórych operacji, takich jak jawna transpozycja macierzy. Nie twierdzę, że niemożliwe jest szybkie uczynienie kodu C lub C ++, ale kompilator Fortran ma lepszą pracę.
Jack Poulson,
Mam to samo doświadczenie ze słowem kluczowym „ogranicz” (mój prosty kod Fortran był zawsze trochę szybszy). Ale moja wiedza jest ograniczona i po prostu nie mam czasu na inwestowanie w zrozumienie wygenerowanego zestawu z gcc. Więc po prostu używam Fortran, jest prosty i szybki.
Ondřej Čertík,
@JackPoulson: Argument kompilatora jest czymś, co słyszę sporo od społeczności Fortran. Niestety większość kompilatorów, np. Gcc lub ifc / icc, używa tego samego zaplecza w innym języku. Maszyna przeprowadzająca optymalizację i generowanie kodu jest identyczna, dlatego różnice w wynikach są najprawdopodobniej spowodowane różnicami w znajomości programisty z językiem bazowym ...
Pedro
1
Wystarczy spojrzeć na często powtarzane, rzadko potwierdzane twierdzenie, że Fortran jest szybszy w jądrach numerycznych: Jakiś czas temu zauważyliśmy, że rzadki wektor macierzowy w pakiecie Epetra firmy Trilinos był o 30% wolniejszy niż ten w umowa.II. Ten pierwszy napisano wprost Fortran 77, a drugi prosto C, bez użycia słowa „ogranicz”. Oba miały około 10-15 linii kodu. Dzisiaj Trilinos używa fragmentu kodu wyciągniętego z transakcji. II. Jestem pewien, że można znaleźć wiele przypadków, w których F77 jest szybszy niż C. Chodzi o to, że dzisiaj nie jest tak powszechnie.
Wolfgang Bangerth
8

Ponieważ jestem tu nowy, przeglądałem stare pytania i znalazłem to. Mam nadzieję, że odpowiedź na stare nie jest tabu!

Ponieważ nikt o tym nie wspominał, pomyślałem. Fortran 2003 jest prawie w pełni obsługiwany przez większość głównych kompilatorów (intel, ibm, cray, NAG, PCG), nawet gcc z (wkrótce) najnowszą wersją 4.7. Fortran 2003 (i 2008) to język obiektowy, choć nieco bardziej szczegółowy niż C ++. Jedną z rzeczy, które moim zdaniem są miłe w Fortranie, jest fakt, że komitet standardowy postrzega naukę komputerową jako swoją główną publiczność (dziękuję Damianowi Rousonowi za wskazanie mi tego dnia).

Mówię o tym nie po to, aby programiści C ++ stali się programistami Fortran, ale aby ludzie Fortranu wiedzieli, że mają teraz więcej opcji niż przejście na C ++ lub emulowanie obiektowych koncepcji w Fortran 90/95.

Dodam jedno zastrzeżenie, że bycie na krawędzi tego, co jest zaimplementowane w kompilatorach, kosztuje. Jeśli podejmiesz się teraz dużego projektu w Fortran 2003, natkniesz się na błędy i będziesz musiał ciągle aktualizować swój kompilator (szczególnie jeśli używasz gcc), chociaż w ostatnich miesiącach sytuacja uległa znacznej poprawie!

Jeremy Kozdon
źródło
7

Problem z C ++ polega na tym, że masz wiele szans na pogorszenie wydajności, na przykład ślepe używanie STL, wyjątki, klasy (narzut wirtualny plus problemy z wyrównaniem), przeciążenie operatora (nadmiarowe nowe / usuwanie) lub szablony (niekończąca się kompilacja i tajemnicze błędy wydają się łagodne, ale możesz w ten sposób marnować godziny).

Jednak im bardziej zyskujesz lepszy dostęp do bibliotek ogólnych i być może większą widoczność swojego kodu (chociaż to silnie zależy od pola i nadal masz czyste C). Nadal możesz zrekompensować brak elastyczności Fortrana, zawijając jego kod w języku skryptowym, takim jak R, Lush, Matlab / Scilab, a nawet Python, Ruby lub Lua.

mbq
źródło
1
Generalnie złym pomysłem jest stosowanie technik niskiego poziomu w językach wysokiego poziomu. Na przykład STL jest zaprojektowany do działania na bardzo abstrakcyjnym poziomie. Trzeba wiedzieć, do czego przeznaczony jest interfejs, używać go do tego zadania, a następnie zejść z kompilatorów.
shuhalo,
2
Myślę, że zarówno argumenty mbq, jak i Martina są niesprawiedliwe. Tak, istnieją sposoby na zastrzelenie się w stopę, jeśli spróbujesz zaimplementować wektor numeryczny dla celów algebry liniowej przy użyciu std :: list <double>. Ale to jest głupi argument: przynajmniej C ++ ma połączoną klasę list, której można użyć, podczas gdy Fortran nie. To tak, jakby powiedzieć: „Samochody jadą z taką prędkością, że możesz uderzyć w ścianę i odnieść obrażenia; zamiast tego powinieneś używać powozów konnych”. To po prostu głupi pomysł, aby wyrzucić język wysokiego poziomu, który obsługuje również rzeczy niskiego poziomu (np. C ++) za posiadanie funkcji wysokiego poziomu.
Wolfgang Bangerth
@WolfgangBangerth Nie, teraz krzywdzisz Fortran - jest tak „niski poziom”, jak bakterie są „mniej rozwinięte” niż ludzie. Jeśli chcesz analogii samochodowej, powinno to być bardziej jak „możesz użyć zarówno Jeepa, jak i Lexusa, aby przejść przez bagienną drogę, ale korzystanie z pierwszej mniej boli”.
Mbq
1
Doceniam twoją opinię, ale utrzymuję, że Fortran nie jest tak rozwinięty, jak C ++ :-)
Wolfgang Bangerth
7

Trzy fakty:

  • Tablice n-wymiarowe w stylu F77 w C: Nie ma problemu z użyciem CnD ( oczywiście bezwstydna wtyczka)

  • System modułów F90 jest źle zaprojektowany i nieprzyjazny do budowania środowisk. (Nazwa modułu nie musi odpowiadać nazwie pliku, np.)

  • Fortran nie obsługuje dobrze refaktoryzacji. Wyciągnięcie odrobiny funkcjonalności z funkcji wymaga dotknięcia czterech miejsc: rzeczywistego kodu, deklaracji zmiennych, deklaracji argumentów i listy argumentów. C ma dwa miejsca do dotknięcia. To pogarsza efekt braku dobrego zarządzania danymi (opisany poniżej): Ponieważ modułowość na małą skalę jest tak bolesna, prawie wszyscy piszą gigantyczne podprogramy.

Jedno osobiste wrażenie:

  • Fortran nie działa dobrze do zarządzania danymi. Spróbuj zwrócić wskaźnik do nieprzezroczystej dla użytkownika struktury danych w F77 lub F90. ( transfer()tutaj nadchodzimy)
Andreas Klöckner
źródło
Cześć Andreas! CnD jest interesujące, nie wiedziałem o tym. Ach, napisałeś to. :) (f90 obsługuje również krojenie, alokowalne dla tablic i co najważniejsze - składnia tablicowa do mnożenia, dodawania itd.) Używam CMake z Fortranem i działa świetnie z modułami. Czym dokładnie jest „lista argumentów”? Nie sądzę, żebym ich używał, więc tylko 3 miejsca są potrzebne do modyfikacji. W C zwykle musisz zmodyfikować rzeczywisty kod, parametry i plik nagłówka, więc są to również 3 miejsca (zdecydowanie w C ++). Tak, transfer () nie jest super miły, ale zazwyczaj nie jest potrzebny w praktyce.
Ondřej Čertík,
3
Refaktoryzacja nowoczesnego fortranu jest banalna dzięki odpowiednim IDE, takim jak Photran in eclipse.
2
„Nazwa modułu nie musi odpowiadać nazwie pliku, np.” Musisz żartować, możesz mieć wiele modułów w jednym pliku. Niektóre z nich obejmują tylko kilka linii. Są znacznie łatwiejsze do utworzenia, jeśli nie trzeba tworzyć pliku dla każdego z nich.
Vladimir F
1
Chciałem tylko dodać do tego, co powiedział @ user389, że chociaż Photran jest świetny i jest jedynym Fortran IDE, który pozwala na refaktoryzację, jego parser cały czas zawodzi. Z drugiej strony nie trzeba komentować faktu, że Eclipse jest głodny pamięci.
astrojuanlu,
5

Fortran jest zoptymalizowany do obliczeń macierzowych / macierzowych i jest bardzo trudny w pracy z każdym typem parsowania tekstu. C i C ++ mogą nie pasować do Fortrana w obliczeniach numerycznych (jest blisko), ale znacznie łatwiej jest mi przetwarzać tekst i organizować dane (tj. Niestandardowe struktury danych) za pomocą C / C ++.

Jak wspomnieli inni, nie licz na dynamicznie interpretowane języki (Python i in.). Mogą nie oferować szybkości topnienia twarzy Fortan z góry, ale pozwalają skupić się bardziej na rozwiązaniu problemu obliczeniowego niż na wszystkich szczegółach implementacji. Często możesz zaimplementować rozwiązanie w Pythonie, a jeśli wydajność jest niedopuszczalna, wykonaj profilowanie, zidentyfikuj obszary problemowe i zoptymalizuj ten kod za pomocą Cython lub ponownie zaimplementuj cały program w skompilowanym języku. Kiedy już rozwiążemy logikę rozwiązywania problemów, reszta to tylko implementacja i, przy dobrym zrozumieniu podstaw obliczeniowych, powinna być prosta do reprezentowania w różnych językach programowania.

Daniel Standage
źródło
Zgadza się. Do parsowania tekstu używam również Pythona.
Ondřej Čertík,
Możesz także zaimplementować część skryptu Python w skompilowanym języku, np. C ++ i podłączyć go. Np. Boost Python, Swig itp.
Faheem Mitha,
4

Obecnie pracuję w jednym z krajowych laboratoriów. Większość ludzi wokół mnie to inżynierowie mechanicy. Rozmawiając z niektórymi ludźmi w grupach HPC, robią głównie Linux i głównie C ++. Grupa, w której aktualnie pracuję, zajmuje się głównie aplikacjami komputerowymi i używamy systemu Windows w malejącej kolejności: C #, FORTRAN, Python, VBA i VB (6, nie .NET). Niektóre z używanych przez nas silników symulacyjnych zostały napisane w innych krajowych laboratoriach w FORTRAN.

Tangurena
źródło
4

Przepraszamy za wykopanie starego wątku, ale wydaje się, że nawet w 2015 r. Fortran jest często używany.

Właśnie natknąłem się na (alternatywny link ) listę, która w zasadzie jest listą 13 kodów zatwierdzonych przez obiekt OCLF firmy DOE do uruchomienia na maszynie Summit 300-petaFLOPS, która zostanie udostępniona badaczom w 2018 roku. Próbowałem znaleźć główny używany język dla kodu (na podstawie szybkiego wyszukiwania w Google) i oto, co znalazłem:

XGC Fortran

SPECFEM Fortran

ACME Fortran (Bunch of climate codes)

DIRAC Fortran (Mostly)

FLASH Fortran

GTC Fortran

HACC C/C++

LS-DALTON Fortran (some C)

NAMD C/C++

NUCCOR Fortran

NWCHEM Fortran

QMCPACK C++

RAPTOR Fortran

Tak więc spośród 13 kodów przynajmniej 10 (w oparciu o moje szybkie wyszukiwanie) wydaje się być napisanych w Fortranie. Nieźle jak na 50-letni język.

UWAGA: Zdaję sobie sprawę z tego, że porównania językowe są bezużyteczne, ale biorąc pod uwagę liczbę osób (szczególnie użytkowników C ++), którzy mają nieprzyzwoite Fortran, pomyślałem, że warto o tym wspomnieć.

stali
źródło
3
Nie zgadzam się, ponieważ moje doświadczenie w krajowych laboratoriach było, wręcz przeciwnie, odwrotne. Większość nowych projektów, które widzę w Lawrence Livermore, jest napisanych w C ++, a większość nowych (lub aktywnie utrzymywanych) najnowocześniejszych bibliotek typu open source w solverach ODE, dyskretyzacji MES i bibliotekach komputerowych ogólnego przeznaczenia wydają się być w C lub C ++. Fortran wydaje się być wykorzystywany głównie w projektach wykorzystujących istniejące / starsze biblioteki; Nie widzę wielu dużych, nowych projektów wykorzystujących Fortran, niezależnie od tego, co myślę o języku.
Geoff Oxberry
Niektóre kody teorii funkcjonalnej gęstości napisane również w Fortranie to VASP i CASTEP , chociaż jak wskazuje @GeoffOxberry, nowe projekty mogą mieć tendencję do C ++.
dr.blochwave,
@blochwave Jak można przeczytać w linku, projekty dotyczą nowej maszyny (z akceleratorami itp.), która będzie dostępna online w 2018 r. Więc to nie jest tak, że biorą 25-letni kod i kompilują go, mając nadzieję na dobry bieg występ. Jestem pewien, że duże części kodów z powyższej listy zostały lub zostały przepisane, tak jak w nowym kodzie. Wiele „nowych” kodów klimatycznych znajduje się również w Fortranie i jest wykorzystywanych przez wiele agencji w wielu krajach.
stali
0

Myślę, że Jack P. próbuje powiedzieć, że powinieneś mieszać i dopasowywać. Dobry program jest starannie ułożony warstwowo. Różne warstwy mogą być mapowane bardziej naturalnie lub wydajniej na różne języki. Powinieneś wybrać najbardziej odpowiedni język dla każdej warstwy. Należy również zrozumieć, w jaki sposób języki mogą ze sobą współdziałać, co może wpłynąć na wybrany język dla danej warstwy.

Lepszym pytaniem jest, jakie są przykłady doskonale zaprojektowanego oprogramowania, które warto zbadać, aby dowiedzieć się, jak zaprojektować oprogramowanie warstwowe.

Robert van de Geijn
źródło