Przyjaciel ze środowiska akademickiego poprosił mnie o radę (jestem programistą aplikacji biznesowych w języku C #).
Ma starszą bazę kodów, którą napisał w Fortranie w dziedzinie obrazowania medycznego. Robi ogromną liczbę zgniatania liczb za pomocą wektorów. Używa klastra (30 rdzeni), a teraz podszedł do jednej stacji roboczej z 500ish GPUS.
Jednak gdzie dalej iść z bazą kodów, więc:
- Inne osoby mogą to utrzymać przez następne 10 lat
- Przyspiesz dostosowywanie oprogramowania
- Może działać na różnych infrastrukturach bez ponownej kompilacji
Po kilku badaniach ode mnie (jest to bardzo interesujący obszar) niektóre opcje to:
- Użyj Pythona i CUDA od Nvidii
- Przepisz w funkcjonalnym języku. Na przykład F # lub Haskell
- Przejdź do chmury i użyj czegoś takiego jak Hadoop i Java
- Dowiedz się C.
Jakie było twoje doświadczenie z tym? Na co powinien patrzeć mój przyjaciel, aby zmodernizować swoją bazę kodów?
AKTUALIZACJA: Dzięki @Mark i wszystkim, którzy odpowiedzieli. Powodem, dla którego mój przyjaciel zadaje to pytanie, jest to, że jest to idealny czas na przeprowadzenie przeglądu projektu. Przyspieszenie asystentów badawczych w Fortranie wymaga czasu (lubię C #, a zwłaszcza narzędzia i nie wyobrażam sobie powrotu do starszych języków !!)
Podobała mi się sugestia, by utrzymać czystą liczbę chrupiącą w Fortranie, ale zawinąć ją w coś nowszego. Być może wydaje się, że Python zdobywa fortecę w środowisku akademickim jako język programowania ogólnego zastosowania, który jest dość łatwy do opanowania.
Zobacz Medical Imaging i facet, który napisał opakowanie dla Fortrana dla CUDA. Czy mogę legalnie opublikować moje opakowanie dla Fortran 90 w bibliotece CUFFT Nvidias (z CUDA SDK)? .
Odpowiedzi:
Wymagania, które postawiłeś, tak naprawdę stawiają Fortran na szczycie listy, w przypadku takich problemów:
a) załamywanie liczb
b) dające się powiązać
c) było i nadal jest de facto językiem nauczanym poza studiami cs (dla inżynierów, którzy nie są profesjonalnymi programistami).
d) ma niesamowite (!) wsparcie w branży, pod względem liczby kompilatorów klasy przemysłowej, przy czym żaden z dostawców nie wykazuje najmniejszych oznak porzucenia tej gałęzi. Jeden z przedstawicieli Intela nie tak dawno ujawnił, że sprzedaż ich produktów Fortran jest wyższa niż w innych narzędziach programistycznych.
Jest to również język, który jest niezwykle łatwy do opanowania. Nie zgadzam się, że przyspieszenie asystentów badawczych zajmuje dużo czasu. Mój pierwszy podręcznik zawierał nie więcej niż, no nie wiem, 30 (?) Stron rzadkiego drukowanego tekstu. Jest to język, w którym po nauczeniu się 10 słów kluczowych można pisać programy średniej wielkości. Odważyłbym się powiedzieć, że te 30 stron napisanych domyślnym tekstem Worda byłoby dla większości użytkowników bardziej niż obszernym „podręcznikiem Fortran”.
Jeśli jesteś zainteresowany CUDA, możesz sprawdzić kompilator Portland Group , który go obsługuje . Nie znam dokładniejszych szczegółów, ale ludzie na ogół mówią o tym z pochwałą.
Poza tym w przypadku programów do łączenia równoległego dostępne są OpenMP, MPI, a teraz nadchodzące (i długo oczekiwane) współ-tablice, które niedawno wdrożył kompilator Intela . Aby nie marnować słów, Fortran ma bardzo dobrą gamę „bibliotek” do równoległych programów.
Opracowano przede wszystkim standardowe biblioteki numeryczne , inne języki są mniej więcej zgodne z portfolio funkcji / procedur.
Biorąc to wszystko pod uwagę, chciałbym jednak (w zależności od tego, kiedy został napisany) polecić, jeśli powiedzmy, kod F77 lub starszy, przepisując go częściowo z czasem do nowszych dialektów - przynajmniej F90, jeśli to możliwe z funkcjami F2003. Papier / praca na ten temat została niedawno opublikowana (średni rozmiar pliku PDF do przodu). Nie tylko to, jeśli zostanie wykonane prawidłowo, zapewni przenośność na wielu platformach, ale także ułatwi przyszłą konserwację.
ps Jeśli chodzi o „przyszłe utrzymanie”, to tylko anegdota, którą czasem lubię wspominać. Pisząc moją pracę magisterską, ponownie wykorzystałem kod mojego mentora, napisany 35 lat temu od momentu napisania. Skompilowano tylko z jednym błędem; na końcu brakuje instrukcji z powodu błędu wklejania kopii :)
@DaveMateer (odpowiedź na komentarz) - skomentuję to, co może być nieco niegrzeczne, ale proszę, nie bierz tego w niewłaściwy sposób, ponieważ jest to w uczciwych intencjach.
Wydaje mi się, że rozwiązujesz ten „problem” w niewłaściwy sposób. Co mam na myśli w kilku krótkich punktach (ponieważ jest tu bardzo późno, a moja zdolność do nadawania zdania czytelnych (nie mówiąc już zrozumiałych) opuszcza mnie po 22.00)
a) wspomniałeś, że próbujesz zminimalizować dodatkowy czas kodowania, ale zastanawiasz się nad przepisaniem z języka specjalizującego się w obliczeniach numerycznych na jeden z kolorowego wyboru języków , jeśli wybaczysz moje wyrażenie
(nie chciałbym cię motywować, ale szczerze mówiąc, nikt tak naprawdę nie był pewnie, co ten termin nawet reprezentuje, mniej sam miał przykład udanego zastosowania. Większość ludzi zgodziła się, że istnieje potencjał, ale jak dotąd są zadowoleni z tego, jak teraz działa.). Wiele problemów nie nadaje się również do tego rodzaju równoległości.
b) jakie byłyby koszty takiego przepisania? osoby / godziny.
c) -poprawne wersje bibliotek do kompilacji ...- to problem w każdym języku, którego nie można uniknąć, bez względu na to, jak na to patrzysz.
d) Słyszałem o Pythonie (naprawdę fajnym języku) używanym w kilku aplikacjach równoległych kilka razy, ale penetracja tego rynku wciąż nie wydaje się rosnąć, a jego ciągle zmieniający się charakter sprawia, że jest to bardzo zły wybór dla projekt długoterminowy (pomyśl o kompatybilności wstecznej). Niektórym bardzo się podoba jako język „kleju”.
Ugh, jeśli pomyślę o czymś innym, dodam to jutro. Muszę się przespać ...
źródło
Wątpię, by Fortran kiedykolwiek umarł - ma tak duże dziedzictwo oprogramowania i napisanych w nim bibliotek, że ludzie wciąż nad nim pracują, jedynie stabilizując tę sytuację. Co więcej, jest to nadal bardzo dobry język, jeśli nie chcesz robić nic więcej niż łamanie liczb - składnia jest bardzo elegancka i logiczna, a kompilator może łatwo odgadnąć, co się dzieje. Gwarantuje to, że każda nowa technologia akceleracji sprzętowej będzie obsługiwać C, Fortran i pewnego rodzaju OpenCL (kiedy w końcu zbiegnie się w coś solidnego).
Powiedziałbym więc, że powinieneś po prostu wyraźnie oddzielić część liczbową, pozostawić ją w Fortranie, wyraźnie powiązać i napisać resztę w dowolnym miejscu.
źródło
Python rzeczywiście zyskuje dużą popularność w naukowej społeczności komputerowej (nieco przestarzały widok, patrz tom 9 nr 3 CiSE ). Myślę, że hybryda Python / Fortran to świetna droga. Aby skorzystać ze wszystkich tych układów GPU, możesz użyć PyCUDA lub PyOpenCL .
Jestem matematykiem, który analizuje i pisze solwery numeryczne dla równań różniczkowych cząstkowych. Byłem ostatnio w podobnej sytuacji jak u twojego przyjaciela; omawiany kod Fortran 77 jest dobrze znanym oprogramowaniem Clawpack . Przepisaliśmy kod najwyższego poziomu (wszystkie części, które nie muszą być szybkie) w Pythonie i użyliśmy f2py do automatycznego zawinięcia części niskiego poziomu.
Naprawdę potężny wynik tego jest taki, że byliśmy w stanie niemal w trywialny sposób połączyć hybrydowy kod Pythona / Fortrana (nazwany PyClaw ) z równoległą biblioteką PETSc, tworząc po raz pierwszy skalowalną równoległą wersję Clawpack, która działa dobrze na rdzeniach 65K. Cały równoległy kod, który musieliśmy napisać, jest zawarty w mniej niż 300 liniach Pythona . Rozwiązujemy teraz problemy, których nie można było rozwiązać jedynie za pomocą starszego kodu. Co równie ważne, nowym użytkownikom łatwiej jest teraz pobrać kod, ponieważ Python jest tak przyjaznym językiem i prawie wszystko można modyfikować w czasie wykonywania, a nie w czasie kompilacji.
Jeśli chcesz zobaczyć więcej szczegółów na temat naszego podejścia i wyników, mamy artykuł na temat arXiv .
Przepraszam za autoreklamę, ale wydawało się, że moje osobiste doświadczenie będzie tutaj istotne. Jeśli chcesz usłyszeć o wiele więcej pomysłów, możesz opublikować to również na nowym http://scicomp.stackexchange.com .
źródło
Jestem obecnie w sytuacji bardzo podobnej do twojej koleżanki. Jestem również zdesperowany, aby „zmodernizować” mój 40-letni kod KLOC Fortran-77. I pomimo tego, że Fortran jest nadal uważany za króla w aplikacjach do łamania liczb, chciałbym powiedzieć, że nie wszystko stracone. (To, co następuje, to rant-ish, więc znoś mnie).
To, że Fortran jest najlepszym językiem dla kodu numerycznego, nie oznacza, że musimy cały czas nosić przy sobie ten ogromny bagaż bałaganu, skomplikowanego kodu (Tak, kod Fortrana musi być chaotyczny, zwłaszcza Fortran-77, który jest język, który dosłownie nie bierze pod uwagę inżynierii oprogramowania, gdy przekracza pewne KLOC). Ci, którzy opowiadają się za Fortranem do łamania liczb, zapominają o ogólnym spostrzeżeniu, że kiedy przeprowadzasz analizę wydajności takich kodów, tylko 5% lub 10% kodu wymaga dużej wydajności, a dla pozostałych 90% + Fortran jest bezużytecznym kosztem, po prostu tam, aby Twoje życie jako „inżyniera oprogramowania” stało się piekłem.
Kiedy przenosisz się do Fortran-90 z Fortran-77, jesteś zasadniczo skłonny do kompromisu wydajności z funkcjami językowymi do pewnego stopnia. Fortran jest potężnym urządzeniem do kruszenia liczb głównie z powodu Fortran-77. Można powiedzieć, że Fortran-90 jest tak szybki, ale z problemami optymalizacji, z którymi musieli się zmagać autorzy kompilatora, dodając funkcje Fortran-90/2003 i nadal zachowując wydajność Fortran-77, nie różnią się zbytnio od problemów, z którymi musieli się zmagać autorzy kompilatora C. z (w związku z czym C jest również uważany za szybki, nie wspominając o C również pozwala na montaż w linii). Dlaczego więc nie zacząć dodawać kodu C krok po kroku (zamiast Fortran-90) do kodu Fortran-77. Mój kod ma już fragmenty w C i fragmenty w Fortran-77 i działa świetnie z zastrzeżeniem niektórych problemów, takich jak przekazywanie ciągów, indeksowanie zerowe / indeksowanie jedno itd. Ale zaletę czerpię z C,
Poszedłbym o krok dalej. Nawet C (i zdecydowanie Fortran-90/95/2003) jest zbyt niski, jeśli chcesz mieć ładny „humanitarny” interfejs do załamującego się kodu. Zastanawiam się nad przejściem na hybrydę Python-Fortran-77 lub Python-C. Kod, w którym 90% kodu to Python (w tym Numpy, Scipy, plotowalność i cała ta słodycz), a jedynie intensywność działania 5% -10% pozostaje jako kod Fortran-77 lub C.
źródło
Obecnie jestem w trakcie aktualizacji starej bazy kodów FORTRAN95 do użytku w nowoczesnych środowiskach branżowych, ponieważ poprzednia wersja będzie działać tylko na komputerach z systemem Windows2000. Baza kodów FORTRAN sama wykonuje dużą liczbę operacji związanych z symulacjami nawadniania.
Więc zamiast pisać ponownie FORTRAN w bardziej nowoczesnym języku, po prostu używam komercyjnego kompilatora o nazwie Silverfrost FTN95 do kompilacji bazy kodów FORTRAN do biblioteki .Net 4.0, której używam jako backendu aplikacji WPF . W ten sposób nie ryzykuję wprowadzenia znanych błędów do kodu symulacyjnego i modernizuję go, przenosząc bazę kodu do frameworku .Net 4.0, aby działał w bardziej nowoczesnych środowiskach.
Ale w zależności od tego, jak duża jest twoja symulacja, możesz po prostu ponownie napisać całość w bardziej nowoczesnym języku, takim jak C #, sam planuję to zrobić, gdy będę mieć uruchomioną wersję symulacji, aby porównać wyniki.
Mam nadzieję, że moje doświadczenie pomaga, dzięki, Alex.
źródło
Byłem głównym twórcą projektu z lat 2001-2003, który przenosił aplikację Windows 100KLOC z FORTRAN na C #. Była to aplikacja do łamania liczb, która miała własne niestandardowe powiązania GUI z bibliotekami Win32. Port do C # i WinForm znacznie uprościł zarządzanie kodem i dał wszystkim bogatsze środowisko programistyczne w Visual Studio. Na początku pojawiał się spory opór (szczególnie pod względem instrukcji formatowania), ale ostatecznie zdecydowanie się opłaciło.
Moim zdaniem sensowne jest ugryzienie kuli i pozbycie się maksymalnej możliwej ilości kodu FORTRAN. Szybkość nigdy nie była problemem - wstępne testy z uruchomionym kodem w C # w porównaniu do FORTRAN wykazały, że różnica w wydajności jest znikoma, mimo że C # uruchamia kod zarządzany. Twoje potrzeby związane z wektorami mogą być nieco inne, a pozostanie niewielkiej ilości kodu FORTRAN również byłoby dopuszczalne.
Innym powodem tego jest oczywiście długoterminowa dostępność osób z doświadczeniem FORTRAN, które mogą utrzymywać Twój kod w porównaniu do programistów C #. Ponadto pomaga morale zespołowemu pracować w nowoczesnym, dobrze obsługiwanym języku.
źródło
Powiedziano mi, że w wielu kontekstach MATLAB zastępuje FORTRAN do naukowych zastosowań komputerowych. Jest nie tylko nowoczesny i wysoki poziom, ale także dość szybki w tym, co robi. Wielu programistów pracujących nad oprogramowaniem do obrazowania medycznego korzysta już z MATLAB, więc ma kilka bibliotek dedykowanych wyobraźni medycznej. Oznacza to, że znajdziesz zarówno narzędzia, jak i wsparcie ekspertów w dziedzinie, jeśli korzystasz z MATLAB.
źródło