Jaka jest podstawowa struktura wydajności kodu naukowego?

11

Rozważ dwa komputery z różnymi konfiguracjami sprzętu i oprogramowania. Podczas uruchamiania dokładnie tego samego seryjnego kodu Naviera-Stokesa na każdej platformie wykonanie x ity odpowiednio dla komputera 1 i 2 wymaga czasu xiy. W tym przypadku jest różnicą czasu iteracji między komputerem 1 a komputerem 2.Δ=xy

Co może wpłynąć na wielkość ? Jednym oczywistym kandydatem jest procesor, moim głównym pytaniem jest to, czy istnieją inne czynniki, które mogą wpływać na w tej samej kolejności, co różnica sprzętowa między procesorami?ΔΔΔ

Oscylacja Isopycnal
źródło
4
Oczywiście twoje to tylko jedna próbka. Powinieneś także zbadać, w jaki sposób Δ zależy od wielkości problemu i struktury. Po drugie chciałbym zaproponować do profilowania kodu, próbując podzielonego X i Y w sumie różnych wkładów i analizowanie skuteczności różnych fragmentów kodu w stosunku do HW i SW konfiguracjach. ΔΔxy
Stefano M,
4
BRAK LINII CACHE . To pierwsza rzecz do rozważenia. Pamięć jest wąskim gardłem dla wielu algorytmów.
Deer Hunter

Odpowiedzi:

13

Ta lista nie jest jeszcze prawie kompletna, ale mam nadzieję, że jej rozmiar da wskazówkę co do skali możliwych czynników. Zakładam, że kompilujesz kod ze źródła na wybranej platformie.

Oprogramowanie

  • Standardowa wydajność biblioteki
  • Lin. Alg. Wydajność biblioteki (jeśli oprogramowanie łączy się z bibliotekami zewnętrznymi)
  • Wybór kompilatora
  • Optymalizacja kompilatora
  • Flagi kompilatora
  • Procesy w tle (mogą się znacznie różnić, jeśli systemy operacyjne są różne)

Sprzęt komputerowy

procesor

  • Szybkośc zegara
  • Architektura (ta sama instrukcja może wymagać różnej liczby cykli dla różnych architektur)
  • Rozmiary pamięci podręcznej
  • Opóźnienie pamięci podręcznej
  • Możliwość SIMD (jedna instrukcja, wiele danych)

Pamięć

  • Liczba kanałów
  • Prędkość

HDD

  • Szybkość odczytu / zapisu (głównie ważna tylko przy zapisywaniu wyników, więc zależy to od tego, jak często zapisujesz dane wyjściowe do pliku dla solwera NS, ale może być ważna dla innych programów, które wykonują takie czynności jak przetwarzanie obrazu)

To wszystko ignoruje małe sztuczki i funkcje różnych producentów, aby zapewnić swoim chipom przewagę na rynku. Duża jest jednak to, że wiele rzadkich bibliotek algebry liniowej jest powiązanych z pamięcią. Wykonywanie rzadkiej macierzy wymaga mnóstwa danych przemieszczających się bez wielu rzeczywistych klap.

Godric Seer
źródło
Dodałbym do procesora zarówno liczby rdzeni, jak i jego możliwości SIMD.
Pedro
@Pedro Zostawiłem rdzenie wyłączone, ponieważ pytanie brzmiało seryjny solver, ale dodam SIMD. Dzięki.
Godric Seer
1
@GodricSeer Skompilowałem na jednym komputerze, a następnie go uruchomiłem. Następnie, używając tego samego skompilowanego pliku wykonywalnego, uruchomiłem go na drugim komputerze. Z twojego wyjaśnienia wydaje się, że lepiej byłoby dokonać ponownej kompilacji ze źródła na drugim komputerze. Czy tak jest w przypadku?
Oscylacja Isopycnal
1
@IsopycnalOscillation Podczas kompilacji na / dla określonej maszyny, możesz użyć opcji gcc / gfortran -march=nativelub icc / ifort, -xHOSTktóra zastosuje optymalizacje specyficzne dla architektury bazowej.
Pedro
1
Kluczową kwestią jest tutaj to, że wydajność komputera nie jest wielkością jednowymiarową. Względna równowaga wszystkich czynników wymienionych powyżej przez Godrica może się znacznie różnić, nawet w przypadku komputerów z procesorami tego samego producenta (np. Intela). W rezultacie różne testy porównawcze mogą pokazywać bardzo różne wskaźniki wydajności dla dwóch procesorów. W praktyce większość nowoczesnych maszyn poważnie nie ma przepustowości pamięci do obsługi obciążeń naukowych, a to często stanowi wąskie gardło.
Brian Borchers
2

x/yxy

Po drugie, twoje pytanie wyraźnie wyklucza różnice w oprogramowaniu. Z mojego doświadczenia wynika, że ​​nagrody za wydajność za staranne dostrojenie mogą mieć duże znaczenie, więc rozważając problemy ze sprzętem, nie zapomnij o problemach z oprogramowaniem. W końcu sprzęt może wykonać tylko instrukcje, które mu podasz, a jeśli dasz mu mniej, skończy się szybciej.

Nie rozwijajmy się zbytnio, ale dla każdego problemu istnieje niezliczona liczba programów, które go rozwiążą. Niektóre z nich zajmują mniej czasu niż wszystkie inne, a to jest dolna granica. Nie zakładaj, że żaden program znajduje się w dolnej granicy, a nawet w jej pobliżu, jeśli nie został dokładnie dostrojony.

Ten link szczegółowo wyjaśnia niekonwencjonalną metodę, której używam.

Mike Dunlavey
źródło