Byla by škoda výsledky jen tak vhodit do propadliště dějin (papírek do sběru). No a je také možné, že se to někomu bude hodit...
Vo co go?
Při zpracování rozptylových studií se v České republice používá metodika SYMOS'97 (Systém modelování stacionárních zdrojů). Velmi jednoduchý výpočet lze sice provést ručně, v praxi se používá nějaký program.
Zjednodušeně lze říct, že se počítá příspěvek zdroje/ů znečištění do referenčního/ch bodů. Ve výpočtu jsou zohledněny vzdálenosti a terén mezi zdrojem znečištění a referenčním bodem, meteorologické podmínky, parametry zdroje, škodlivá látka atd...
V aplikaci to pak vypadá tak, že je v sobě vnořeno 5 cyklů (zdroje, ref. body, třídy stability, rychlosti větru a směry větru), většina výpočtů probíhá v nejvnitřnějším cyklu. Čtivě problematiku zpracoval Bc. Karel Psota, který také implementoval výpočet do Pythonu.
Jako přidruženou výrobu vyvíjíme ve firmě komerční verzi Symosu, použitý algoritmus je již notně vousatý a je velmi obtížně paralelizovatelný, proto jsme se rozhodli jej přepracovat a posunout jej výkonově dál.
V rámci předběžných studií na mě padlo testování výše uvedeného OpenSymosu. Jeho implementace v Pythonu výkonem neoslnila, přepsal jsem ji do C#. No a tak vznikly nějaké statistiky, o které se s vámi podělím.
Testovací prostředí
Testy proběhly na počítači s procesorem Intel Core i7-2600 3.4GHz (4 jádra, 8 threadů) s pamětí RAM 8 GB a diskem Samsung SSD 840 PRO (450 GB).Programovalo se v jazyce Python 2.7 (detailně viz. specifikace OpenSymos), dále pak v C# (MS Visual Studio 2013, .NET 4.5.1).
Počítaly se průměrné roční koncentrace pro 360 referenčních bodů a jeden bodový zdroj znečištění (SO2). Výpočet probíhal na rovině, tedy bez výškopisu.
Výsledky testování
- OpenSymos (Python, sekvenční výpočet): 4305 s (12 sec/ref.bod)
- OpenSymos (C#, sekvenční výpočet): 155 s (0.43 sec/ref.bod)
- OpenSymos (C#, paralelizovaný výpočet): 35 s (0.097 sec/ref.bod)
- Symos'97 v2014 (C#, sekvenční výpočet): 4 s (0.011 sec./ref.bod)
- Symos'97 parallel (C#, paralelizovaný výpočet): 0.43 s (0.0012 sec/ref.bod)
Poznámky
- Aplikace byla z Pythonu do C# jen překlopena, neproběhly žádné optimalizace, pouze zásahy související s tím, aby to jelo.
- Pokud máte chuť experimentovat třeba s nějakou kompilovanou verzí Pythonu, soubory pro testovací výpočty vám zašlu a výsledky rád uveřejním.
- Paralelizace OpenSymosu se přímo nabízela a nebyla implementačně příliš náročná, stačilo doplnit zámky na některé datové struktury a paralelizovat vhodný cyklus. K dalšímu zvýšení výkonu by však už byla nutná dosti brutální optimalizace průchodů cykly, něco ve stylu Symos'97 v2013/2014.
- Symos'97 v2014 byl ve vývojové verzi s výpočtem podle upravených vztahů dle poslední vyhlášky (změny neovlivnily výkon)
Další informace
- OpenSymos
- Symos'97 (IDEA-ENVI s.r.o.)
- Metodika Symos'97 (ČHMÚ)
Žádné komentáře:
Okomentovat