Jak pracuje vektorový procesor

V Computerworldu č. 44/99, kde jsme věnovali Téma Technology Worldu superpočítačům, byla mj. řeč o vektorových poč


V Computerworldu č. 44/99, kde jsme věnovali Téma Technology Worldu
superpočítačům, byla mj. řeč o vektorových počítačích. Ty mívají obvykle různé
funkční jednotky pro skalární a vektorové operace nebo alespoň různou metodu
zpracování "vektorů" a "skalárů". Pojďme se na jejich architekturu dnes podívat
podrobněji.
Pipelining
Začněme jednoduchou matematickou operací, sčítáním. Pouze navenek se zdá, že se
všech (řekněme) 64 složek obou vektorů sčítá najednou. Ve skutečnosti to
probíhá trochu jinak. Mechanismus, na němž je paralelita ve vektorovém
procesoru založena, se nazývá pipelining ("protlačování potrubím, rourou") a
vychází z těchto zásad:
Vektorové funkční jednotky jsou segmentovány na části se specifickým určením:
provádějí obvykle dílčí operace (elementární kroky), které trvají jeden takt.
Složité instrukce (např. operace v pohyblivé čárce) se rozčlení na elementární
kroky, z nichž každý se může realizovat v jednom taktu.
Každý krok se může realizovat jen ve specifickém segmentu funkční jednotky.
Nové operandy se mohou začít zpracovávat v každém dalším taktu a rozpracované
operace se posouvají po běžícím pásu ("protlačují se rourou") v jednotlivých
segmentech funkční jednotky.
Na konci roury vystupuje v každém taktu jeden hotový výsledek, např. operace v
pohyblivé čárce.
Pipelining si nyní vysvětlíme detailně na zpracování operace sčítání dvou
vektorů ve vektorovém procesoru. Mějme dva vektory (dostatečné délky): x=
(x1,x2,...), y = (y1,y2,...), jejichž součet má být umístěn v paměti jako
vektor z.
Operace sčítání dvou čísel (skalárů, nikoli vektorů "skalárem" se na rozdíl od
vektoru rozumí jedno reálné číslo) je v počítači obvykle tvořena těmito dílčími
úkony:
1. Přečti oba sčítance z registrů do funkční jednotky.
2. Posuň mantisu s menším exponentem na úroveň druhé mantisy.
3. Sečti mantisy.
4. Normalizuj a vypočti exponent.
5. Ulož součet do registru.
Schéma na této straně znázorňuje postup zpracování, který nyní popíšeme.
Předpokládejme pro názornost, že funkční jednotka našeho vektorového počítače
má alespoň 5 segmentů, z nichž každý realizuje některý z úkonů 1 5, a že každý
z těchto úkonů je realizován v jednom cyklu procesoru:
V 1. cyklu zavede 1. segment do funkční jednotky složky x1 a y1.
Ve 2. cyklu zavede 1. segment do funkční jednotky složky x2 a y2 a současně 2.
segment posune menší z mantis složek x1, y1 (2. dílčí úkon).
Ve 3. cyklu zavede 1. segment do funkční jednotky složky x3 a y3, současně 2.
segment posune menší z mantis složek x2 a y2 a současně 3. segment sečte
mantisy složek x1 a y1 (3. dílčí úkon).
Podobně se postupuje i dále.
Ve schématu vidíme, že teprve po pěti cyklech (v 6. cyklu) je v registru k
dispozici prvý součet z1=x1+y1, od této chvíle však je do registru dodána v
každém cyklu jedna další složka vektoru z.
Je tedy zřejmé, že je třeba n+4 cyklů na sečtení dvou vektorů o n složkách. (To
je pravda ovšem jen v tom případě, že všechny složky obou vektorů byly v
registrech. Registry však mají určitou délku, která je specifická pro každý
vektorový počítač; bývá to 64 nebo 128. Jestliže mají sčítané vektory větší
délku, je v registrech k dispozici nejprve prvých 64 složek obou vektorů a
zbývající složky se zpracovávají až v "dalších etapách". To může znamenat různý
postup podle architektury počítače: další složky mohou být v jiném registru
nebo se musejí použité registry znovu naplnit atd.)
Vraťme se nyní k našemu časovému diagramu: Po zahájení operace sčítání
neprodukuje funkční jednotka po dobu čtyř cyklů žádný výsledek. Tento čas se
nazývá startovací ("startup time") a je také pro architekturu vektorového
počítače charakteristický. Je potřeba ho brát v úvahu při všech kalkulacích
souvisejících s vektorizací programů. Kompilátory na vektorových počítačích
dělají vektorizaci do značné míry automaticky, a znají-li délku zpracovávaných
vektorů, provádějí i tuto kalkulaci. V některých případech to může vést k tomu,
že kompilátor "nepustí" krátké vektory do vektorových funkčních jednotek, ale
nechá je postupně zpracovat ve skalární jednotce, jejíž rychlost nesouvisí
obecně vůbec s rychlostí vektorových jednotek i to musí kompilátor "uvážit".
V reálném vektorovém počítači je pipelining ještě rafinovanější, než jsme si na
našem jednoduchém příkladě ukázali, takže zrychlení ("speedup") vektorového
počítače zvyšuje ještě více. V uvedeném schématu si všimněte, že v 7. cyklu už
1. segment "zahálí". Architektura počítače umožňuje, aby tyto segmenty, kterých
již není třeba pro dobíhající (vektorovou) operaci, mohly začít zpracovávat
následující operaci. Kompilátor o tom ví a zařídí to, kdykoli to je možné.
Paměti vektorových superpočítačů
Druhou velmi významnou specifickou vlastností vektorových počítačů je
organizace paměti, kterou popíšeme nyní.
Registry jsou velmi rychlá paměťová zařízení, která mohou předat procesoru svůj
obsah v jednom taktu. Bohužel jsou tak drahé, že jich v počítači musí být
relativně málo ne více než několik set. Vektorový počítač však musí mít v
operační paměti miliony či miliardy čísel, a kdyby měla být tato paměť
konstruována jako registry, dosáhla by cena počítače astronomické výše.
Háček je v tom, jak zorganizovat činnost počítače, aby spolupráce mezi
procesorem a obecně pomalejší pamětí byla dostatečně rychlá. Nejběžnější způsob
je založen na tom, že se paměť rozdělí do několika např. 64 nebo 128 bloků
(anglicky "bank") a procesor může současně komunikovat s každým z nich. Tak se
kompenzuje to, že každé čtení z paměti nebo zápis do ní trvá několik taktů. Při
dobré vyváženosti systému a správně napsaném programu může procesor i z
levnější a pomalejší paměti dostat v každém taktu jednu položku: kompilátor
zajistí, aby se složky všech vektorů ukládaly postupně do různých bloků. Teprve
když byly všechny bloky využity a vektor není ještě celý umístěn, začne se zase
od začátku.
Doba, kterou paměť potřebuje k tomu, aby realizovala jednu komunikaci mezi
blokem a procesorem, se nazývá cyklus bloku. Je zřejmé, že systém je vyvážený
(tj. umožní, aby se do procesoru v každém taktu dostala jedna položka),
jestliže je paměť rozdělena alespoň do tolika bloků, kolik taktů trvá jeden
cyklus bloku. 9 3319 / pen









Komentáře
K tomuto článku není připojena žádná diskuze, nebo byla zakázána.