Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Počet vláken programu - měl by se přizpůsobit CPU?

Zdravím. Chtěl bych se zeptat na takovou věc. Dejme tomu, že program řeší určitou úlohu a ta je už napevno rozdělená na 8 částí (protože určovat počet až za běhu je problematické). Tyto části lze zpracovávat paralelně, ale také sériově jednu za druhou. Lze tedy vytvořit až 8 vláken a každému předat jednu část ke zpracování. Otázka je, jak to řešit na CPU, které má méně než 8 jader/vláken. Je nějaký rozdíl v tom, pokud program přesto použije 8 vláken, nebo použije např. 4 na 4-jádrovém CPU a v každém vlákně provede 2 části sériově? Jde o to, jestli nějak programově řešit rozpoznávání počtu vláken, nebo natvrdo v jakékoliv situaci použít 8 vláken. Pokud by měl procesor třeba jen 1 jádro, těch 8 vláken si nějak pořeší OS a bude mezi nimi přepínat, to je jasné. Ale nebude to méně efektivní, než kdyby program nespouštěl vlákna a všechny části zpracoval sériově? Jak velká je vůbec režie kolem vláken v OS? Vím jen, že potřebují podstatně méně prostředků, než procesy. Ale jinak moc nevím.

edit: Já myslím, že nechat 8 vláken plně v režii plánovače OS je také přijatelné. Ale nechám si případně poradit.

Díky.

Předmět Autor Datum
Áno, počet vláken by sa mal prispôsobiť procesoru, ale presné počty nie sú také jednoduché. Veľa záv…
los 17.06.2015 22:54
los
Díky. nový
Niko Bellic 17.06.2015 23:22
Niko Bellic
Ono nejde ani tak o reziu vlaken v OS (to neni nic tragicke), ale o to ze ked tu ulohu rozdelis, tak… nový
MM.. 18.06.2015 11:00
MM..
Ty části jsou na sobě zcela nezávislé, takže synchronizace není potřeba. Ale zjistil jsem teď jeden… poslední
Niko Bellic 18.06.2015 12:56
Niko Bellic

Áno, počet vláken by sa mal prispôsobiť procesoru, ale presné počty nie sú také jednoduché. Veľa závisí od architektúry procesora (okrem počtu jadier napr. aj podpora hyperthreadingu) a aj od toho, čo presne program robí. Najlepšie je urobiť si benchmark na takom hardvéri, pre ktorý to optimalizuješ.

Pri zjednodušenom pohľade sa dá povedať, že ideálne je mať jedno vlákno na jedno jadro procesora (keď sa bavíme o CPU-bound vláknach). Pokiaľ je vlákien veľa, tak spracovanie je brzdené častým prepínaním kontextu medzi vláknami. Existujú knižnice pre paralelné úlohy, ktoré vedia počet vláken automaticky prispôsobiť dostupnému hardvéru (napr. TPL pre .NET).

Ono nejde ani tak o reziu vlaken v OS (to neni nic tragicke), ale o to ze ked tu ulohu rozdelis, tak mas overhead (synchronizacia a riadenie rozdelovania pripadne kdesi presuvat data atd)

P.S. prepnutie kontextu je principialne tusim len 1 instrukcia, ale neviem co tam vsetko k tomu Win este sachuje.

Zpět do poradny Odpovědět na původní otázku Nahoru