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
- Na styku komórki powinny mieć ten sam przekrój albo całkowitą wielokrotność (np. 1:2).
- W pliku
CHID.outobserwujVELOCITY_ERRORna stykach. Jeśli FDS stale dochodzi do limituMAX_PRESSURE_ITERATIONS(domyślnie 10), warto go zwiększyć albo zmienić ustawienia solwera ciśnienia (User Guide, rozdz. 6.3.4 i 21.1). - W praktyce dobrze jest nie prowadzić granicy siatek przez sam pióropusz pożaru — tam gradienty są największe.
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
- siatki mają podobną liczbę komórek (albo są zgrupowane przez
MPI_PROCESS); - styki siatek mają zgodne lub całkowite stosunki komórek, bez nakładania się siatek;
- liczba procesów nie przekracza liczby siatek;
DT_RESTARTustawione, żeby długie obliczenia dało się wznowić.
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.