Pozwól mi spróbować rozbić twoje wymagania:
- Konserwowalność
- Odczytywanie / zapisywanie danych tekstowych
- Silne interfejsy / możliwości dla faktoryzacji LU
- Rzadkie solwery liniowe
- Wydajność i skalowalność do dużych danych
Z tej listy rozważyłbym następujące języki:
C, C ++, Fortran, Python, MATLAB, Java
Julia jest obiecującym nowym językiem, ale społeczność wciąż się wokół niego tworzy i nie została wdrożona w żadnych nowych kodach.
Odczytywanie / zapisywanie danych tekstowych
Łatwo to uzyskać w dowolnym języku programowania. Upewnij się, że odpowiednio buforujesz i łączysz dostęp do wejść / wyjść, a uzyskasz dobrą wydajność w każdym z języków, które powinieneś rozważyć. Unikaj obiektów strumieniowych w C ++, chyba że wiesz, jak ich używać skutecznie.
Silne interfejsy / możliwości dla faktoryzacji LU
Jeśli wykonujesz gęstą faktoryzację LU, będziesz chciał użyć LAPACK lub ScaLAPACK / Elemental do równoległej funkcjonalności. LAPACK i ScaLAPACK są napisane w Fortran, Elemental w C ++. Wszystkie trzy biblioteki są wydajne, dobrze obsługiwane i dokumentowane. Możesz się do nich komunikować z dowolnego języka, który powinieneś rozważyć.
Rzadkie solwery liniowe
Najlepsze, swobodnie dostępne rzadkie solwery liniowe są prawie wszystkie dostępne za pośrednictwem PETSc , napisanego w C, który jest dobrze udokumentowany i obsługiwany. Możesz połączyć się z PETSc z dowolnego języka, który powinieneś rozważyć.
Wydajność i skalowalność do dużych danych
Jedynymi paradygmatami programowania równoległego, o których wspomniałeś, są oparte na pamięci współdzielonej, co oznacza, że nie rozważasz podejścia obliczeniowego opartego na MPI (przekazywanie komunikatów) i pamięci rozproszonej. Z mojego doświadczenia wynika, że o wiele łatwiej jest pisać kod, który skaluje się znacznie poza kilkanaście rdzeni za pomocą rozwiązania pamięci rozproszonej. Prawie wszystkie „klastry” uniwersyteckie są obecnie oparte na MPI, duże maszyny z pamięcią współdzieloną są drogie i odpowiednio rzadkie. Powinieneś rozważyć MPI dla swojego podejścia, ale moja rada będzie obowiązywać niezależnie od wybranego paradygmatu programowania.
Jeśli chodzi o wydajność w węźle, jeśli sam piszesz procedury numeryczne, najłatwiej jest uzyskać dobrą wydajność szeregową w Fortranie. Jeśli masz trochę doświadczenia w C, C ++ lub Python, możesz uzyskać bardzo porównywalną wydajność (C i C ++ są martwe - nawet z Fortranem, Python i MATLAB są o około 25% czasochłonne bez większego wysiłku). MATLAB robi to za pomocą kompilatora JIT i bardzo dobrej ekspresji algebry liniowej. Najprawdopodobniej będziesz musiał użyć jądra numerycznego Cython, numpy, numexpr lub embed, aby uzyskać deklarowaną wydajność z Pythona. Nie mogę komentować wydajności Javy, ponieważ nie znam dobrze języka, ale podejrzewam, że nie jest on daleko od Pythona, jeśli jest napisany przez eksperta.
Uwaga na temat interfejsów
Mam nadzieję, że przekonałem cię, że będziesz w stanie zrobić wszystko, co chcesz, w dowolnym z rozważanych języków programowania. Jeśli używasz Java, interfejsy C będą nieco trudne. Python ma doskonałą obsługę interfejsu C i Fortran poprzez ctypes, Cython i f2py. LAPACK jest już zapakowany i dostępny przez scipy. MATLAB ma wszystkie potrzebne funkcje w swoich bibliotekach natywnych, ale nie jest łatwo skalowalny ani szczególnie łatwy do uruchomienia w klastrach. Java może obsługiwać interfejsy C i Fortran z JNI , ale nie jest powszechnie spotykana w klastrach i równoległym oprogramowaniu do obliczeń naukowych.
Konserwowalność
Wiele z tego sprowadza się do osobistego gustu, ale ogólny konsensus co do łatwości konserwacji jest taki, że chcesz zminimalizować liczbę linii kodu w swoim oprogramowaniu, pisać kod modułowy z dobrze zdefiniowanymi interfejsami, a dla oprogramowania obliczeniowego zapewnić testy weryfikujące poprawność i funkcjonalność wdrożenia.
Rekomendacje
Ja osobiście nie miałem dużo szczęścia z Python i polecam go do wielu projektów obliczeniowych. Myślę, że powinieneś zdecydowanie rozważyć to w swoim projekcie. Python i MATLAB są prawdopodobnie najbardziej wyrazistymi językami dostępnymi w informatyce naukowej. Możesz łatwo interfejsować Python z dowolnym innym językiem programowania, możesz użyć f2py, aby owinąć swoją obecną implementację Fortrana i kawałek po kawałku przepisać dowolne części w Pythonie, jednocześnie sprawdzając, czy zachowujesz funkcjonalność. W tej chwili poleciłbym połączenie oficjalnej implementacji Python 2.7 z scipy . Możesz bardzo łatwo zacząć z tym stosem z bezpłatnej dystrybucji Enthought Python Distribution .
Możesz to zrobić w większości w C, C ++ lub Fortran. C i C ++ są bardzo atrakcyjnymi językami dla profesjonalnych programistów z dużym doświadczeniem, ale często podróżują z nowymi programistami i w tym sensie prawdopodobnie nie są świetnym pomysłem na bardziej akademicki kod. Fortran i MATLAB są popularne w obliczeniach akademickich, ale są słabe, jeśli chodzi o zaawansowane struktury danych i ekspresję, które oferuje Python (na przykład pomyśl o obiekcie dict w Pythonie).
Powiązane pytania: