Multithreading (počítačová architektura)
Prokládaný/časový multithreadingUpravit
Hrubozrnný multithreadingEdit
Nejjednodušší typ multithreadingu nastává, když jedno vlákno běží, dokud není zablokováno událostí, která by za normálních okolností způsobila zdržení s dlouhou latencí. Takovým zdržením může být chybějící mezipaměť, která musí přistupovat k paměti mimo čip, což může trvat stovky cyklů procesoru, než se data vrátí. Namísto čekání na vyřešení zdržení by procesor s vlákny přepnul provádění na jiné vlákno, které by bylo připraveno ke spuštění. Teprve až by dorazila data pro předchozí vlákno, bylo by předchozí vlákno zařazeno zpět na seznam vláken připravených ke spuštění.
Příklad:
- Cyklus i: je vydána instrukce j z vlákna A.
- Cyklus i + 1: je vydána instrukce j + 1 z vlákna A.
- Cyklus i + 2: je vydána instrukce j + 2 z vlákna A, což je instrukce načítání, která chybí ve všech cache.
- Cyklus i + 3: vyvolán plánovač vláken, přepne se na vlákno B.
- Cyklus i + 4: vydána instrukce k z vlákna B.
- Cyklus i + 5: vydána instrukce k + 1 z vlákna B.
Koncepčně se podobá kooperativnímu multitaskingu používanému v operačních systémech reálného času, v němž se úlohy dobrovolně vzdávají času provádění, když potřebují čekat na nějaký typ události. Tento typ multithreadingu je znám jako blokový, kooperativní nebo hrubozrnný multithreading.
Cílem hardwarové podpory multithreadingu je umožnit rychlé přepínání mezi blokovaným vláknem a jiným vláknem připraveným ke spuštění. Pro dosažení tohoto cíle je hardwarovým nákladem replikovat registry viditelné pro program a také některé řídicí registry procesoru (například čítač programu). Přepínání z jednoho vlákna na jiné vlákno znamená, že hardware přechází z používání jedné sady registrů na jinou; pro efektivní přepínání mezi aktivními vlákny musí mít každé aktivní vlákno svou vlastní sadu registrů. Například k rychlému přepnutí mezi dvěma vlákny je třeba registr hardwaru instancovat dvakrát.
Dodatečná hardwarová podpora vícevláknového zpracování umožňuje přepínání vláken provést během jednoho cyklu procesoru, což přináší zvýšení výkonu. Dodatečný hardware také umožňuje, aby se každé vlákno chovalo, jako by bylo spuštěno samostatně a nesdílelo žádné hardwarové prostředky s ostatními vlákny, což minimalizuje množství softwarových změn potřebných v rámci aplikace a operačního systému pro podporu vícevláknového zpracování.
Mnoho rodin mikrokontrolérů a vestavných procesorů má více registrových bank, které umožňují rychlé přepínání kontextu pro přerušení. Taková schémata lze považovat za typ blokového multithreadingu mezi vláknem uživatelského programu a vlákny přerušení.
Prokládaný multithreadingEdit
Účelem prokládaného multithreadingu je odstranit z vykonávacího potrubí všechna zdržení v závislosti na datech. Protože jedno vlákno je relativně nezávislé na ostatních vláknech, je menší pravděpodobnost, že jedna instrukce v jedné fázi pipeliningu bude potřebovat výstup ze starší instrukce v pipeline. Koncepčně se podobá preemptivnímu multitaskingu používanému v operačních systémech; analogií by bylo, že časový úsek přidělený každému aktivnímu vláknu je jeden cyklus procesoru.
Příklad:
- Cyklus i + 1: je vydána instrukce z vlákna B. Instrukce z vlákna B je vydána.
- Cyklus i + 2: je vydána instrukce z vlákna C.
Tento typ vícevláknového zpracování byl nejprve nazýván barelové zpracování, v němž patky barelu představují fáze pipeline a jejich vykonávaná vlákna. Modernější terminologií je prokládaný, preemptivní, jemnozrnný nebo časově rozdělený multithreading.
Kromě hardwarových nákladů diskutovaných u blokového typu multithreadingu má prokládaný multithreading další náklady spočívající v tom, že každý stupeň pipeline sleduje ID vlákna instrukce, kterou zpracovává. Protože se v pipeline současně vykonává více vláken, musí být také sdílené prostředky, jako jsou cache a TLB, větší, aby nedocházelo k thrashingu mezi jednotlivými vlákny.
Simultánní multithreadingEdit
Nejpokročilejší typ multithreadingu se uplatňuje u superskalárních procesorů. Zatímco běžný superskalární procesor vydává každý cyklus procesoru několik instrukcí z jednoho vlákna, při simultánním multithreadingu (SMT) může superskalární procesor vydávat instrukce z více vláken každý cyklus procesoru. Jelikož si uvědomujeme, že každé jednotlivé vlákno má omezené množství paralelismu na úrovni instrukcí, snaží se tento typ multithreadingu využít paralelismu dostupného ve více vláknech, aby se snížilo plýtvání spojené s nevyužitými sloty pro vydávání instrukcí.
Příklad:
- Cyklus i: instrukce j a j + 1 z vlákna A a instrukce k z vlákna B jsou vydány současně.
- Cyklus i + 1: instrukce j + 2 z vlákna A, instrukce k + 1 z vlákna B a instrukce m z vlákna C jsou vydány současně.
- Cyklus i + 2: instrukce j + 3 z vlákna A a instrukce m + 1 a m + 2 z vlákna C jsou vydány současně.
Pro odlišení ostatních typů multithreadingu od SMT se používá termín „časový multithreading“, který označuje situaci, kdy mohou být současně vydány instrukce pouze z jednoho vlákna.
Kromě hardwarových nákladů diskutovaných u prokládaného multithreadingu má SMT další náklady na to, že každý stupeň pipeline sleduje ID vlákna každé zpracovávané instrukce. Sdílené zdroje, jako jsou cache a TLB, musí být opět dimenzovány na velký počet aktivních zpracovávaných vláken.
Mezi implementace patří DEC (později Compaq) EV8 (nedokončeno), Intel Hyper-Threading Technology, IBM POWER5, Sun Microsystems UltraSPARC T2, Cray XMT a mikroarchitektury AMD Bulldozer a Zen.