Uważam, że w HPC używa się dużej ilości Fortranu, ale nie jestem pewien, czy dzieje się tak tylko ze względów starszych.
Funkcje współczesnych języków programowania, takie jak wyrzucanie elementów bezużytecznych lub polimorfizm w czasie wykonywania, nie są odpowiednie dla HPC, ponieważ szybkość ma znaczenie, więc nie wiem, gdzie jest C #, Java lub C ++.
jakieś pomysły?
programming-languages
Fanatyk 23
źródło
źródło
Odpowiedzi:
Widziałem dużo Java używanego do HPC w obszarach, w których (1) jest mało starszego kodu oraz (2) czas programowania i jakość kodu mają znaczenie. Typowymi domenami aplikacji są finanse, eksploracja danych lub bioinformatyka.
To naprawdę zależy od aplikacji (życie istnieje poza algebrą liniową), ale wydajność najnowszych JVM jest często na równi z kodem C. Czasami szybciej, gdy JVM jest w stanie wykonać w czasie wykonywania sprytne optymalizacje, których nie są w stanie zrobić kompilatory statyczne (C, Fortran). I zdecydowanie szybciej, gdy jest dużo obliczeń symbolicznych.
Biorąc pod uwagę ustaloną ilość czasu na rozwój programu, wynikowy kod Java jest konsekwentnie szybszy niż kod C. HPC w Javie zdecydowanie ma sens, gdy kod jest często rozwijany lub modyfikowany. Inną ważną cechą jest mobilność kodu na różnych urządzeniach.
Odniesienia znajdziesz w http://ateji.blogspot.com/2010/09/java-for-high-performance-computing.html
Jeśli chodzi o założenie Fortran, że dwa adresy są unikalne, pracujemy nad narzędziem do analizy statycznej, które umożliwi podobne optymalizacje kodu w językach wysokiego poziomu, ale bez bitu „Złe rzeczy mogą się zdarzyć”. Skontaktuj się ze mną, jeśli jesteś zainteresowany.
źródło
W moim wieloletnim doświadczeniu, do 5 lat temu, zawsze był to Fortran i C. Który z nich zależał głównie od tego, czy ludzie pochodzili bardziej z inżynierii, czy więcej ze szkoły myślenia CS (nie wiem, jak to poprawić) , okej? :-)
W tym, co robiliśmy, Fortran był prawie wyłącznie używany.
Z tego, co czytałem dzisiaj, dzięki nowym aktualizacjom standardu F2003 / 08 i wprowadzeniu technologii Co-Arrays wydaje się, że znów nabiera rozpędu.
Również jeden, jeśli nie nieco stronniczy artykuł - Idealny język programowania HPC
źródło
Myślę, że dla prawdziwego pedału do metalu jedynym prawdziwym wyborem jest Fortran. Powodem jest to, że najważniejszą rzeczą w wykorzystaniu niskiego poziomu ILP (paraliżu poziomu instrukcji) jest ujednoznacznienie adresu pamięci. Reguły defacto w Fortran pozwalają kompilatorowi ustalić, że dwa adresy są unikalne (a zatem kolejność ładowań i magazynów, a nawet sklepów i magazynów można zamieniać bez ryzyka wygenerowania niepoprawnego kodu). C pozostawia zbyt duży zakres nakładających się wskaźników, aby kompilator mógł wyodrębnić z kodu tyle równoległości na niskim poziomie.
Również wyrównanie tablicy, linie pamięci podręcznej wrt i granice SSE / AVX są ważne dla generowania i wykonywania wydajnych pętli. Jeśli tablice są przekazywane przez wspólne bloki, kompilator / moduł ładujący może zapewnić, że wszystkie tablice zaczynają się na tych samych granicach wyrównania adresu, i można wykorzystać bardziej wydajne ładowanie i przechowywanie SSE / AVX. Nowszy sprzęt może obsługiwać niewyrównany dostęp do pamięci, ale ponieważ dostęp do pamięci nie jest odpowiednio wyrównany, częściowe użycie linii pamięci podręcznej skutkuje niższą wydajnością. Nawet jeśli programista C poprawnie wyrówna wszystkie swoje tablice, czy istnieje mechanizm komunikacji z kompilatorem?
Podsumowując, dwie najważniejsze kwestie to niezależność adresów pamięci i rozpoznanie przez kompilator, że struktury danych, do których uzyskano dostęp, mają takie samo „naturalne” wyrównanie, jakiego chce sprzęt. Do tej pory Fortran najlepiej wykonuje te dwa zadania.
źródło
Tylko jakaś anegdotyczna notatka. Sam nie wykonałem obliczeń o wysokiej wydajności.
Do obliczeń (dzielenie liczb) Fortran i C. Tak, to z powodów starszej generacji:
Obecnym trendem w dzieleniu liczb jest pisanie generatorów programów, które automatyzują modyfikację kodu źródłowego w celu zoptymalizowania wydajności, biorąc pod uwagę cechy klastra. Generatory te często generują w C.
Drugim trendem jest pisanie w jakimś wyspecjalizowanym dialekcie C dla określonych GPU lub Cell BE.
W przypadku prac nienumerycznych, takich jak programy przetwarzające dane z bazy danych (ale nie z samej bazy danych), znacznie tańsze jest uruchamianie na klastrach maszyn „towarowych” bez drogiego, dostosowanego sprzętu sieciowego. Jest to zwykle nazywane „przetwarzaniem o wysokiej przepustowości”. Python jest tutaj językiem nr 1 (przy użyciu słynnego narzędzia Map Reduce). Przed Pythonem projekty przetwarzania wsadowego mogą być pisane w dowolnym języku i zwykle są wysyłane przez Condor .
źródło
Pracowałem nad bardzo BARDZO intensywnym obliczeniem kodu w (dysz!) C #.
Buduję implementację FDTD GPGPU do modelowania optycznego. W małym klastrze (128 procesorów) wiele naszych symulacji trwa kilka tygodni. Implementacje procesorów graficznych działają jednak około 50 razy szybciej - i to na karcie NVidia klasy konsumenckiej. Mamy teraz serwer z dwiema dwuprocesorowymi kartami GTX295 (kilkaset rdzeni) i wkrótce otrzymamy trochę Teslasa.
Jak to się ma do twojego języka? W ten sam sposób, w jaki używany wcześniej kod C ++ FDTD był związany z procesorem, są one powiązane z procesorem graficznym, więc ( bardzo mała) różnica mocy zarządzanego i natywnego kodu nigdy nie wchodzi w grę. Aplikacja C # działa jak przewodnik - ładuje jądra OpenCL, przekazuje dane do i z GPU, zapewnia interfejs użytkownika, raportowanie itp. - wszystkie zadania, które są uciążliwe w C ++.
W przeszłości różnica w wydajności między kodem zarządzanym i niezarządzanym była na tyle znacząca, że czasami warto było pogodzić się z okropnym modelem obiektowym C ++, aby uzyskać dodatkowe kilka procent prędkości. Obecnie koszt rozwoju C ++ w porównaniu z C # znacznie przewyższa korzyści większości aplikacji.
Ponadto większość różnic w wydajności nie będzie wynikać z wyboru języka, ale z umiejętności programisty. Kilka tygodni temu przeniosłem operację pojedynczego podziału z wnętrza potrójnie zagnieżdżonej pętli (przechodzenie przez tablicę 3D), co skróciło czas wykonania dla danej domeny obliczeniowej o 15%. Wynika to z architektury procesorów: podział jest powolny, co jest jedną z tych twarzy, które po prostu gdzieś potrzebujesz.
źródło
Fortran jest najczęstszy, głównie ze względu na starsze wersje (ludzie nadal używają starego kodu) i znajomość (większość osób, które wykonują HPC, nie zna innych rodzajów języków).
To ogólnie nie jest prawda. Klasyczna HPC zajmowała się głównie algebrą liniową z liczbami maszynowo precyzyjnymi. Jednak współczesne HPC coraz częściej korzysta z superkomputerów w celu uzyskania większej różnorodności chrupania, takich jak obliczenia symboliczne z dowolnymi wyrażeniami matematycznymi zamiast liczb dokładności maszynowych. Daje to zupełnie inną charakterystykę używanym narzędziom i nierzadko używa się języków programowania innych niż Fortran, ponieważ obliczenia symboliczne mogą być niezwykle trudne bez GC i innych rodzajów kompilatora optymalizującego, takiego jak kompilator optymalizujący dopasowanie wzorców OCamla.
Na przykład przeczytaj ten artykuł Fischbacher i in. co mówi: „autorzy mają mocne podstawy, by sądzić, że może to być jak dotąd największe obliczenie symboliczne”.
źródło
Fortran, z kilku dobrych i niezbyt dobrych powodów. W przypadku poważnych problemów matematycznych dobrym powodem jest istnienie obszernych bibliotek (BLAS, LAPACK) sprawdzonych podprogramów, wszystkie napisane w Fortranie (choć można je wywoływać z C i C ++).
Niezbyt dobrym powodem jest rzekoma przewaga wydajności Fortran nad C / C ++. Optymalizatory są całkiem dobre i niewiele osób rozumie, że korzyść z optymalizacji fragmentu kodu jest proporcjonalna do procentu czasu, w którym jest on zajęty, co w prawie całym kodzie jest prawie zerowe.
Innym niezbyt dobrym powodem jest luka kulturowa między programistami CS i nie-CS. Programiści naukowi zwykle uczą się złych nawyków w Fortranie i patrzą z góry na programistów CS i złe nawyki , których się nauczyli, i którzy patrzą z góry na te pierwsze.
źródło
Zasadniczo wszystkie programy, które wykonują faktyczną pracę przy łamaniu liczb, są nadal FORTRANEM (stare blas, lapack, arnoldi itp. Są nadal używane) ... Jednak jeśli chodzi o strukturę wyższego poziomu ... ludzie coraz częściej używają C ++.
Złożoność symulacji wiąże się z ogromnym kodem, a pisanie jednego z nich przynosi wiele korzyści. Również zastosowane koncepcje stały się bardzo złożone. Reprezentowanie tych informacji za pomocą FORTRAN to prawie szaleństwo. Właśnie tam wkracza C ++, ponieważ z natury wspiera projektowanie obiektowe. Jednak polimorfizm w czasie wykonywania jest rzadko preferowany. Zamiast tego ludzie prawie zawsze używają polimorfizmu statycznego (który jest implementowany w C ++ z szablonowym meta-programowaniem)
Ponadto, teraz kompilatory są naprawdę dobre, dlatego wiele kompilacji pozostawia się kompilatorom.
źródło
Istnieją dwa rodzaje problemów, które należy rozwiązać w aplikacjach HPC: jednym z nich jest sam kryzys, a drugim zarządzanie obliczeniami. Do pierwszego zwykle podchodzi się z kodem napisanym w Fortran, C lub C ++ ze względu na szybkość i fakt, że istnieje już wiele algorytmów naukowych napisanych w tych językach. Sterowanie obliczeniami jest wygodniej realizowane w językach wyższego poziomu. Python jest językiem „kleju” do obsługi logiki aplikacji i rozszerzeń wywołań zaimplementowanych w językach kompilowanych. Java jest często używana w projektach, w których kluczowe jest zarządzanie siecią i przetwarzaniem rozproszonym.
źródło