fdsrun

Podział na siatki i MPI w FDS: jak przyspieszyć obliczenia

Redakcja fdsrun · · 6 min czytania

Dlaczego jeden duży mesh liczy się wolno, jak dzielić model na siatki, równoważyć obciążenie procesów MPI i gdzie kończy się zysk z kolejnych rdzeni.

Model FDS na jednej siatce liczy się na jednym rdzeniu procesora, choćby komputer miał ich szesnaście. Żeby wykorzystać więcej rdzeni, trzeba podzielić domenę na kilka siatek (&MESH) i uruchomić FDS przez MPI — wtedy każdy proces liczy swoją część modelu. Dobrze zrobiony podział skraca obliczenia kilka- lub kilkunastokrotnie; zrobiony źle — prawie nic nie daje.

Zasada nr 1: równa liczba komórek na proces

Procesy MPI liczą równolegle, ale w każdym kroku czasowym wymieniają dane na stykach siatek i czekają na siebie nawzajem. Jeśli jeden proces ma dwa razy więcej komórek niż pozostałe, reszta przez połowę czasu stoi bezczynnie. Dokumentacja NIST mówi wprost: żeby MPI działało dobrze, każdy proces musi dostać porównywalną liczbę komórek — i nawet wtedy dwa procesy nie skończą w połowie czasu, bo dochodzi komunikacja i dodatkowe komórki brzegowe (FDS User Guide, rozdz. 6.3.3 i 3.3.1).

Prosty test: podziel łączną liczbę komórek przez liczbę procesów i porównaj z największą siatką. Jeżeli największa siatka jest dużo większa od średniej, to ona dyktuje czas.

Zasada nr 2: kilka małych siatek może dzielić jeden proces

Parametr MPI_PROCESS na linii &MESH pozwala przypisać kilka siatek do jednego procesu. Ma to sens, gdy siatki są różnej wielkości: małe siatki łączy się tak, żeby suma komórek na każdym procesie była zbliżona. Sąsiednie siatki na tym samym procesie wymieniają dane bezpośrednio, bez komunikacji MPI. Numery procesów muszą być kolejne i rosnące, zaczynając od 0.

fdsrun robi to automatycznie: przed startem rozdziela siatki na procesy tak, żeby najbardziej obciążony proces miał jak najmniej komórek, i pokazuje, jak zmienia się prognozowany czas przy różnej liczbie procesów.

Zasada nr 3: styki siatek

Ile procesów ma sens

Zysk z kolejnych procesów maleje: rośnie udział komunikacji i liczba komórek brzegowych. W naszych testach kalibracyjnych na pojedynczym serwerze w chmurze (FDS 6.10.1) przyspieszenie przestawało rosnąć w okolicy 16 procesów, a serwery z dedykowanymi rdzeniami nie liczyły szybciej od współdzielonych przy wielokrotnie wyższej cenie. Dlatego dla typowych modeli budynków najlepszy stosunek czasu do kosztu daje zwykle 8–16 dobrze zrównoważonych procesów.

OpenMP (wątki w obrębie jednego procesu) według NIST przyspiesza obliczenia najwyżej ok. dwukrotnie; zwykle lepiej podzielić domenę na więcej siatek i liczyć z jednym wątkiem na proces.

Przykład

Hala 60 × 40 × 10 m, komórka 20 cm: 300 × 200 × 50 = 3 000 000 komórek.

  • 1 siatka, 1 proces: ok. 3 000 000 × 3,5 µs ≈ 10,5 s na krok;
  • 12 siatek po 250 000 komórek (np. 4 × 3 w rzucie), 12 procesów: ≈ 0,9 s na krok;
  • przy ~20 000 kroków różnica to ok. 58 h wobec ok. 5 h.

Lista kontrolna przed startem

Wszystkie te punkty sprawdza bezpłatne narzędzie poniżej — razem z prognozowanym czasem dla optymalnej liczby procesów.

Inne poradniki

Źródła: FDS User Guide (NIST SP 1019), rozdz. 3, 6.3.3, 6.3.4, 21.1; pomiary własne fdsrun. FDS i Smokeview to oprogramowanie National Institute of Standards and Technology; NIST nie jest powiązany z fdsrun.

Na pewno?