Re: Re: OT: jaky procesor

Vojtěch Bubník bubnikv na seznam.cz
Neděle Září 11 22:18:13 CEST 2011


> Obecně CAD je single task, ale výrobci se snaží (vesměs s mnohaletým
> zpožděním) některé zdlouhavé operace (renderování, nověji třeba FEM
> nebo u CAMu výpočet drah) upravit tak, aby uměly využít víc procesorů
> (nebo dokonce distribuované výpočty). Jde to ztuha, ale postupně se
> situace zlepšuje :-) Za ty prachy aspoň něco :-)

Ono s vícejádrovými procesory je to podobně jako s megapixely u digitálního foťáku. Teoreticky výkon zvýší, ale prakticky to tak jednoznačné není. Situace je ještě relativně přehledná, pokud člověk "jenom" potřebuje spustit několik různých aplikací najednou. Je určitá pravděpodobnost, že se nebudou přetahovat o přístup k disku, o paměť atd.

Programátoři jsou zvyklí myslet sekvenčně. Valná většina algorimů byla vymyšlena v době jednoprocesorových systémů. Mnoho algoritmů paralelizovat vůbec nejde, a nebo jde, ale dnešní architektura takové paralelizaci moc nepřeje. Synchronizace vláken je poměrně drahá záležitost, takže na dnešních počítačích je třeba psát tak, aby se zas tak moc nesynchronizovalo. Ideálně se dá paralelizovat například algoritmus: máš dvě množiny 3d bodů. Najdi pro každý bod z jedné množiny nejbližší bod v druhé množině. Sestaví se vyhledávací struktura pro první množinu, proti které se provede vyhledávání pro každý bod z druhé množiny. Vyhledávací struktura se vejde celá do cache.

V praxi to vypadá tak, že historicky je celá aplikace psaná jednovláknově a pak se podle potřeby paralelizuje to co aspoň trochu jde. Většinu času běží jedno či dvě vlákna, ale při déletrvající operaci je znát, pokud trvá třeba 1s na čtyřjádrovém procesoru místo 4s na jednojádrovém. Prostě paralelizuje se to, co se nejvíc vyplatí a co jde. Z mé zkušenosti často jdou paralelizovat právě ty algoritmy, které dlouho trvají, neboť jsou implementovány nějakým naivním, či iterativním algoritmem.

Spousta knihoven samy o sobě nejsou "thread safe", a nebo sice jsou, ale takovým způsobem, že paralelizaci zabijí. Například implementace std::stream v MS VC10 používá globální zámky tak blbě, že paralelizovaná aplikace běží výrazně pomaleji než jednovláknová.

Často se mi podařilo zrychlit algorimus víc profilováním a postupným vylepšováním jednovláknové implementace, než paralelizací. I to je realita dnešních počítačů.

Vojta Bubník


Další informace o konferenci Hw-list