W jaki sposób można zmodernizować dużą, opartą na Fortranie bazę kodów do łamania liczb?

21

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)? .

Dave Mateer
źródło
Dodałbym OpenCL do listy.
Jerry Coffin
3
Cześć Dave, istnieje pewien rodzaj „Jakiego języka powinienem się nauczyć w następnej kolejności?” pytanie, na które nie zezwalamy tutaj, więc dokonałem drobnych poprawek, aby upewnić się, że ludzie nie pomylą tego pytania z tym. Ale czy możesz rozszerzyć swoje pytanie, aby wyjaśnić, dlaczego dotychczasowe wybory nie są dobrze dopasowane, aby pomóc w uzyskaniu lepszego dopasowania?
Co konkretnie masz na myśli w części „Może działać na różnych infrastrukturach bez ponownej kompilacji”?
Rook
Cześć @Idigas - nie jestem zbyt pewien szczegółów. Ale w gruncie rzeczy historia głosiła, że ​​przenoszenie bazy kodu do innych klastrów / maszyn stało się koszmarem, aby zebrać wszystkie poprawne wersje bibliotek do skompilowania. Wierzę, że podstawa kodu została przeniesiona z F77 na F90 lub cokolwiek innego. Zasadniczo staram się pomóc mu rozmawiać z właściwymi ludźmi, aby podjąć mądrą decyzję o zmianie architektury / języka. Pochodzę z tła, w którym klienci nie lubią dodatkowego czasu na kodowanie, więc wszystko, co mogę zrobić, aby pomóc mi w jak najszybszym napisaniu najlepszego kodu, jest idealne :-)
Dave Mateer
@DaveMateer - Zobacz moją odpowiedź (nie mieści się w tym polu tutaj). Teraz idę spać, więc przyszłe odpowiedzi mogą być trochę wolne :)
Wież

Odpowiedzi:

24

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

  • niektóre z nich nie obsługują między innymi tablic wielowymiarowych
  • większość z nich nie nadaje się do ciężkiej pracy numerycznej (przyznaję, że możliwości przetwarzania równoległego Haskell i Hadoop nic nie wiem ... ale nigdy nie słyszałem o nich nawet w tych kręgach)
  • prawdopodobnie próbowano, ale nigdy nie słyszałem o przepisaniu z Fortran, języka dla dyskretnych problemów, na język funkcjonalny
  • ostatnio dyskutowano na temat comp.lang.fortran (spróbuj przeszukać grupy google) na temat aspektów nauki naukowej „w chmurze”
    (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ć ...

Wieża
źródło
@Idigas .. znowu bardzo doceniam. Całkowicie zgadzam się, że gdy coś działa, to wiele to znaczy. Nasza branża jest zaśmiecona całkowitymi błędami przeróbek (Netscape!).
Dave Mateer
1
Idigas ma tutaj dobry pomysł. Masz działającą bazę kodu, która działa od lat, a jej transkrypcja spowoduje błędy. Plus Fortran jest prostym językiem do pobrania - może być brzydki, ale składa się z jasnych koncepcji. Miej pod kontrolą zależności od / do innego kodu i może napisz do Fortrana fajny interfejs w stylu C, a przekonasz się, że kod będzie wyjątkowo przyszłościowy (w stylu C, ponieważ prawie każdy inny język ma mechanizm wywoływania kod z interfejsem w stylu C).
anon
2
Muszę się zgodzić. Jeśli rozumiesz matematykę stojącą za tym, co robisz (i większość inżynierów to rozumie), wdrożenie jej w FORTRAN nie jest tak stromą krzywą uczenia się. Po jego utworzeniu wymagania rzadko się zmieniają, podobnie jak w aplikacjach biznesowych lub społecznościowych.
JeffO
Wow, nie wiedziałem, że wokół FORTRAN jest tyle miłości. Musiałem rozwijać się w F77 przez 5 lat i nie mogę tego znieść.
dodgy_coder
2
@dodgy_coder. Miło było usłyszeć, że w latach dziewięćdziesiątych opracowałeś program Fortran + .NET. Pierwsza wersja beta .NET pojawiła się w 2000 roku.
10

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.

mbq
źródło
Nie wspominając już o tym, że nowe projekty w Fortranie również są obecnie uruchamiane.
Gawron
Tak, Fortran nie jest COBOL, jest obsługiwany nie tylko dlatego, że ludzie tego nauczyli się 30 lat temu (chociaż IMO jest jego częścią). Chrupanie liczb nie jest moją mocną stroną, więc jeśli jest coś lepszego, to na pewno tego nie wiem.
Ben Brocka
1
Język fortran nadal ma dziesięcioletnią przewagę w zakresie łamania liczb i powiązanych optymalizacji. W najbliższym czasie nie umrze.
Martin York
1
Artykuł pojawił się w niedawnym „Komunikacie ACM” o Fortranie i o tym, jak to się rozwija i wprowadza kolejne modernizacje. Zachowanie (przynajmniej częściowej) części kodu w Fortranie byłoby prawdopodobnie dobrym posunięciem. Pomaga także uniknąć zespołu Netscape (przepisanie = nowe błędy = ogromny czas cyklu = wkurzenie wszystkich zaangażowanych).
szybko_niedz.
1
Czy naprawdę chcesz, żeby ktoś, kto w ogóle nie jest zainteresowany Fortranem, dotknął twojego kodu? Dużym problemem jest upewnienie się, że wynik jest nadal dokładny po przepisaniu.
Peter Smith
4

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 .

David Ketcheson
źródło
1

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.

Yudle Joza
źródło
1
„kod Fortrana z pewnością będzie bałagan”. Nie. Niechlujny programista napisze niechlujny kod w dowolnym języku, a odwrotność jest prawdziwa. Kernighan i Plauger pokazali, jak pisać czysty Fortran wiele lat temu .
0

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.

Alex Hope O'Connor
źródło
0

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.

dodgy_coder
źródło
0

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.

Oleksi
źródło