Architektura Mercedu podrobněji (2)
20.10.1999, Jindřich Šaršon, zpráva

Co vymyslel Intel tak převratného? To se dozvíte v pokračování našeho seriálu.
V minulém dílu jsme skončili u seskupování instrukcí Mercedu do balíčků a superbalíčků. Všem, co první díl seriálu nečetli, bych doporučil si ho nejprve přečíst (resp. pro pochopení druhé části to považuji za nutnost) a teprve poté pokračovat tímto dílem.
Jak funguje seskupování instrukcí
Jen pro osvěžení paměti bych připomněl, že balíček je trojice 41-bitových instrukcí které se mohou vykonat najednou, aniž by došlo ke konfliktu. Podobně superbalíček je skupina na sobě nezávislých balíčků. K objasnění toho, jak to funguje bych uvedl krátký příklad, zapsaný v pseudokódu. Představme si následující programovou posloupnost:
(1) A = 1
(2) B = 2
(3) C = 3
(4) A = A + 1
(5) B = A + 1
(6) C = C + 1
(7) Zobraz B
Pokud by tato část programu proběhla na počítači bez pipeliningu, tak by se na obrazovce objevilo číslo 4. Ovšem jak již bylo napsáno dříve, pomocí pipeliningu je možné zpracovat několik instrukcí najednou a pokud by najednou probíhaly řádky (4) a (5) a provedení řádku (5) skončilo dříve než řádek (4) (což se u procesoru s pipeliningem může docela běžně stát), byl by výsledek programu číslo 2, což je evidentně špatně. Kompilátor pro Merced proto musí rozdělit výše uvedený kód do skupin (superbalíčků), ve kterých již konflikty nejsou (za instrukcí je vždy uvedeno číslo řádku původního kódu)
Sk. 1
A = 1 (1)
B = 2 (2)
C = 3 (3)
A = A + 1 (4)
C = C + 1 (6)
Sk. 2
B = A + 1 (5)
Sk. 3
Zobraz B (7)
Procesor pak může vzít tyto balíčky a instrukce v nich provádět současně. Ušetří se tím značná část výkonu, protože není nutné provádět detekci při běhu programu.
Předvídání podmínek – verze od Intelu
O předvídání podmínek jsem již psal v článku o Apple G4, proto jen ve zkratce. Představme si následující část programu:
Pokud A = 1 pak
dělej něco
jinak
dělej něco jiného
Moderní procesory (např. G4) udržují v paměti informaci, kolikrát proběhly jednotlivé větve podmínky. Proto pokud narazí na toto rozvětvení, nečeká na vyhodnocení podmínky, ale začne zpracovávat častěji probíhající větev. Itanium na to jde trochu jinak. Kompilátor přepíše výše uvedenou část programu asi takto:
(1) Pokud A = 1 pak potvrď [1] jinak potvrď [2]
(2) [1] dělej něco
(3) [2] dělej něco jiného
Příště: Registry
Podle Firing Squad
Jak funguje seskupování instrukcí
Jen pro osvěžení paměti bych připomněl, že balíček je trojice 41-bitových instrukcí které se mohou vykonat najednou, aniž by došlo ke konfliktu. Podobně superbalíček je skupina na sobě nezávislých balíčků. K objasnění toho, jak to funguje bych uvedl krátký příklad, zapsaný v pseudokódu. Představme si následující programovou posloupnost:
(1) A = 1
(2) B = 2
(3) C = 3
(4) A = A + 1
(5) B = A + 1
(6) C = C + 1
(7) Zobraz B
Pokud by tato část programu proběhla na počítači bez pipeliningu, tak by se na obrazovce objevilo číslo 4. Ovšem jak již bylo napsáno dříve, pomocí pipeliningu je možné zpracovat několik instrukcí najednou a pokud by najednou probíhaly řádky (4) a (5) a provedení řádku (5) skončilo dříve než řádek (4) (což se u procesoru s pipeliningem může docela běžně stát), byl by výsledek programu číslo 2, což je evidentně špatně. Kompilátor pro Merced proto musí rozdělit výše uvedený kód do skupin (superbalíčků), ve kterých již konflikty nejsou (za instrukcí je vždy uvedeno číslo řádku původního kódu)
Sk. 1
A = 1 (1)
B = 2 (2)
C = 3 (3)
A = A + 1 (4)
C = C + 1 (6)
Sk. 2
B = A + 1 (5)
Sk. 3
Zobraz B (7)
Procesor pak může vzít tyto balíčky a instrukce v nich provádět současně. Ušetří se tím značná část výkonu, protože není nutné provádět detekci při běhu programu.
Předvídání podmínek – verze od Intelu
O předvídání podmínek jsem již psal v článku o Apple G4, proto jen ve zkratce. Představme si následující část programu:
Pokud A = 1 pak
dělej něco
jinak
dělej něco jiného
Moderní procesory (např. G4) udržují v paměti informaci, kolikrát proběhly jednotlivé větve podmínky. Proto pokud narazí na toto rozvětvení, nečeká na vyhodnocení podmínky, ale začne zpracovávat častěji probíhající větev. Itanium na to jde trochu jinak. Kompilátor přepíše výše uvedenou část programu asi takto:
(1) Pokud A = 1 pak potvrď [1] jinak potvrď [2]
(2) [1] dělej něco
(3) [2] dělej něco jiného
Příště: Registry
Podle Firing Squad