Nahoru
 

Základní principy vláken a jader

Výrobci procesorů se vždy chlubí svým počtem jader a velikostí technologie v nanometrech. Každé jádro procesoru totiž zvládne počítat vlastní sadu příkazů. Jak toho využijeme a jak to, že i na jednojádrových procesorech dokážeme dělat více věcí najednou? Jak do toho zapadají vlákna?

Pokud vyvíjíme aplikaci, je to většinou pro již hotový operační systém (zkráceně OS). Operační systém dokáže tvořit a přiřazovat tzv. vlákna. Jedno vlákno si můžeme představit jako proud instrukcí (např. nějaký řadící algoritmus, počítadlo, správce souborů, internetový soket, násobení matice, násobení pouze jednoho řádku matice apod.).

Když spustíme program, například kalkulačku, operační systém tomuto nově spuštěnému procesu přiřadí jedno nové vlákno, protože jinak by neměl kdo „přehrávat“ příkazy kalkulačky. Z jakéhokoliv běžícího vlákna můžeme spouštět další vlákna. Jedno jádro procesoru vždy zpracovává pouze jedno vlákno, tedy jeden proud instrukcí. Současná jádra CPU zvládnou i 2 vlákna naráz (hyper-threading) i když není to tak rychlé jako dvě vlastní jádra.

Řekněme, že náš kalkulátor je nějaký vědecký simulátor. Bude tedy možné do něj zadat simulace, jež kalkulačka spouští na nových vláknech (jedno vlákno na jednu simulaci). Můžeme tedy počítat několik simulací naráz, což je určitě efektivnější využití vícejádrového procesoru, protože jádra CPU mohou kalkulovat nová vlákna (tedy simulace) paralelně.

Dalším příkladem by byla kalkulačka násobení matic. Pokud máme obří matice, pak jejich násobení zabere dost výpočetního času. Pokud však na každý řádek matice spustíme jedno nové vlákno, docílíme toho, že se budeme moci počítat více řádek naráz a můžeme si užívat násobného zrychlení.

Vlákna a další vlákna vznikající z existujících vláken
Obrázek č.1: Ilustrace toho, jak si vlákna tvoří další vlákna

Pozor: Tím, že počítáme nějaké problémy paralelně v žádném případě nezefektivníme algoritmus nebo jeho asymptotickou složitost. Pokud něco trvá spočítat 100 let, ani 100 jader nám nepomůže, protože čekat jeden rok se nám nejspíše nechce. Nejdříve musíme přijít s efektivním algoritmem a až pak jej zparalelizovat. Více o efektivitě algoritmů se dozvíte v článku Jak se určuje efektivita algoritmu.

Co když máme pouze jednojádrový procesor a program, tvořící více vláken? Například budeme chtít počítat dva matematické příklady naráz? Jádro operačního systému přirozeně vytvoří dvě vláka, jedno za každý výpočetní problém. Kdo je však bude provádět? Bude je provádět naše jedno jádro. Jádro však umí naráz počítat pouze jedno vlákno, ale my máme dvě vlákna. Naivní očekávání by bylo, že se kompletně spočítá nejdřív první vlákno a pak až to druhé. Takhle to ale z dobrého důvodu nefunguje.

Zkuste si teď hned zapnout dvacet kalkulaček. Každá kalkulačka má vlastní vlákno a váš procesor pravděpodobně nemá 20 jader, ale i přes to všechny běží plynule. Pokud totiž máte spuštěných více vláken, než existuje jader v procesoru, pak je operační systém mezi sebou bleskurychle vyměňuje. Z vašeho pohledu se to jeví, jako že běží 20 procesů/vláken naráz, avšak ve skutečnosti se chvíli počítá první vlákno, chvíli druhé vlákno, chvíli třetí vlákno atd. Jedná se o milisekundy, a proto lidé nevidí rozdíl. Je to podobné, jako když film ve skutečnosti rychle přehrává spoustu za sebou seřazených obrázků. Má to však i skryté nevýhody, jako například další výpočetní čas potřebný k vyměňování a režii více vláken.

Graf běhu vláken na jednojádrovém procesoru
Obrázek č. 2: Zjednodušená ilustrace toho, jak běží dvě vlákna na jednom jádře

Některé výpočty a programy využívají vícejádrových procesorů a paralelně řeší problémy. Problémy (neboli sadu instrukcí) reprezentují vlákna. Jádro procesorů může zpracovávat jedno (maximálně 2) vlákna a často se stává, že máme více vláken jak jader. V takovém případě se vlákna velice rychle střídají, aby se uživateli jevilo, jako že běží více aplikací naráz. Nutno podotknout, že vícevláknové aplikace sice urychlují početní procesy, avšak neřeší neefektivitu algoritmů.