Pentium 4 a programování (aneb co je pod povrchem)

V době, kdy se bojovalo o "metu 1GHz" vznikla teorie, že zvyšování frekvence procesoru je výborným marketingovým tahem. Podle ní pak "běžným uživatelům" stačí, že jejich nový počítač má "vyšší číslo" než ten starý - bez ohledu na jeho efektivní výkon. Od této myšlenky je jen krůček k "rychlostnímu lobbování" (ze strany PR oddělení) u konstruktérů nových procesorů. Bylo tomu tak i u návrhu Pentia 4? Vše nasvědčuje tomu, že asi ano...

 

Z globálního pohledu je provádění programu na procesorech 8086 až 80386 jednoduché a charakteristické pro CISC procesory:

  • procesor přečte instrukci a dekóduje ji
  • v případě potřeby načte data z paměti
  • provede modifikaci registrů a stavu procesoru dle instrukce
  • v případě potřeby provede zápis výsledku do paměti

Tyto úkony provádí procesor sekvenčně a v době např. výpočtu fyzické adresy pro čtení dat z pamětí dekodér instrukcí zahálí.

Inisider: RISC a CISC procesory

RISC (Reduced Instruction Set Computing)

Na konci 70 let si návrháři procesorů začali uvědomovat, že se procesory stávají čím dále tím více složité ale programy 80% času využívají jen 20% všech instrukcí. Vznikla tedy teorie, že je možné sestavit velmi rychlý procesor s malým počtem vysoce specializovaných instrukcí. Procesory měly být menší, levnější a tedy i komerčně úspěšné. Táto idea nebyla nikdy plně realizována. Snaha návrhářů se odvrátila od zmenšování počtu instrukcí (Podíváme-li se na instrukční sady skutečných RISC procesorů uvidíme vždy minimálně 100 instrukcí.) spíše k jejich uniformitě. Poněkud zavádějící zkratka RISC ale zůstala a charakterizuje procesory jednoduchými příkazy s pevnou délkou (ve světě PC mají instrukce délku 1 až 8 bajtů), většinou prováděných právě v jednom cyklu procesoru a velkým množstvím registrů. Instrukce čtení a zápisu jsou odděleny od ostatních operací.

Tedy např. na PC běžnou instrukci:
ADD AX,[BX] (přičti k AX obsah paměti, na kterou ukazuje BX, výsledek zapiš do AX)
bychom museli rozdělit na dvě instrukce.

CISC (Complex Instruction Set Computing)

Technologie uplatňovaná při návrhu procesorů založená na snaze vybavit procesor co možná největším počtem vykonatelných instrukcí (včetně složitých a kombinovaných funkcí) a s velkým počtem adresovacích režimů. Nevýhodou je nutnost použití velkého počtu tranzistorů (cena, energetické nároky). Výhodou je kratší kód (především z hlediska efektivnějšího využití vyrovnávací paměti procesoru).

Novější procesory mají mnohem složitější strukturu, která se více podobá RISC procesorům. Základním požadavkem bylo, aby procesory kvůli zpětné kompatibilitě i nadále akceptovaly všechny instrukce předchozích generací ale vývojáři se zároveň nechtěli vzdát výhod RISC architektury. Proto CISC-RISC mezivrstva převádí původní instrukce na řadu mnohem jednodušších, které pak provádí RISCové jádro.

Paralelní zpracovávání instrukcí

Procesory 486 a novější se skládají z několika funkčních bloků, které na rozdíl od předchozích generací procesorů pracují všechny souběžně. Velmi zjednodušeně řečeno: v době, kdy se provádí zápis výsledku instrukce N do paměti se zároveň provádí instrukce N+1, převádí na mikrooperace instrukce N+2, a načítá instrukce N+3. Ve skutečnosti mají současné procesory mnohem více takových souběžných bloků (Pentium 4 jich má 20). Procesory 486 tedy „virtuálně“ provádějí více instrukcí najednou ovšem v každém cyklu se konči provádění maximálně jedné instrukce.

Vývojáři Pentium šli s myšlenkou paralelního zpracování ještě dále. Kritická část zvaná ALU (aritmeticko logická jednotka), která procesor nejvíce brzdila, byla v tomto procesoru zdvojena. Vzniklo tak jakési rozštěpení proudu instrukcí (Intel je nazval proudy U a V, přičemž proud V byl poněkud zjednodušený a nebyl schopen provádět všechny instrukce) a procesor tak mohl skutečně v ideálním případě provádět až 2 instrukce současně.

Nová architektura přinesla řadu nových problémů pro tvůrce procesorů ale i pro vývojáře software. Co se stane, když je nějaká instrukce závislá na výsledku předchozí instrukce? Např.

INC BX (zvětši BX o jedničku)
MOV AX,BX (zkopíruj obsah registru BX do registru AX)

nelze provést kopírování dokud není známa hodnota registru BX. Dekódovaná instrukce MOV proto nemůže vstoupit do ALU a zdržuje tak celou kolonu prováděných příkazu. Další problémy nastaly v případě nesprávného řazení příkazů. Pokud do procesoru přišly 2 instrukce, které dokázal zpracovat pouze proud U došlo také ke zdržení přestože třeba další instrukce mohla být provedena V proudem. Pro procesory 486 mohlo být pořadí instrukcí libovolné a neovlivnilo rychlost běhu - u Pentia tomu však bylo jinak. Proto bylo nutno pro optimální běh programů na těchto procesorech vyvinout nové překladače, které respektují pravidla tzv. párování instrukcí a snaží se udržovat instrukce navzájem závislé co nejdále od sebe.

Spekulatnivní provádění instrukcí

Novější procesory disponují technologii spekulativního provádění instrukcí - dokážou za jistých okolností přeházet prováděné instrukce tak, aby bylo využití výpočetních jednotek optimální. Moderní procesory mají v záloze ještě jeden trik jak urychlit programy, které byly určeny původně pro procesory starší. Jedná se o „Register Renaming“- přejmenovávání registrů. Procesor si udržuje přehled o tom, které registry obsahují potřebná data, které budou v budoucnu využity a které obsahují neužitečná data.

Tím však problémy zdaleka nekončí. Co když je třeba provést podmíněný skok? V závislosti na výsledku instrukce se teprve zjistí adresa příští prováděné instrukce. V této situaci musí všechny bloky počkat až se provede předcházející instrukce a teprve pak může provádění pokračovat. V případě P4 by mohlo dojít k výluce až 20 cyklů dlouhé! Proto moderní procesory disponují pravdivostní tabulkou naposledy prováděných skoků a na její základě se zvolí nejpravděpodobnější varianta a podle ní výpočet pokračuje. Pokud se později zjistí, že byl odhad dobrý není třeba podnikat žádné následující kroky. Pokud byl však chybný je nutno vrátit zpět všechny akce provedené na základě chybné větve. V tomto případě dojde vlastně k "vyprázdnění" celé fronty příkazů a tím k velkému zdržení. Naštěstí lze v praxi skoky předpovídat s velkou přesností.

Paměti cache

Rychlost procesoru přímo závisí na rychlosti přísunu dat. Pokud nejsou k dispozici zastaví se provádění programu do doby, než bude paměť schopna příslušná data dodat. Proto výrobci integrují do procesorů tzv. vyrovnávací paměti. Většinou se jedná o menší a extrémně rychlou paměť první úrovně (L1) a vetší, pomalejší paměť druhé úrovně (L2), ve které se snaží udržovat data, která s největší pravděpodobností bude potřebovat procesor v nejbližší budoucnosti. Čím větší je tato paměť, tím větší část programu a dat se do ní vejde a v optimálním případě kdy si celý algoritmus vejde do vyrovnávací paměti první úrovně - je prováděn s optimální rychlostí, na přístup do ní čeká procesor jen 3 cykly.

Na přístup do vyrovnávací paměti druhé úrovně je nutno počkat až 20 cyklů a do hlavní paměti 130 cyklů (Měřeno pomocí programu LATENCY na Athlonu s násobitelem 8 na chipsetu KT133A. Se zvyšujícím se násobitelem bude poměr v neprospěch hlavní paměti ještě narůstat.).

Z tohoto příkladu je patrné, jak jsou vyrovnávací paměti pro procesor důležité. Producenti procesorů se proto snaží stále zlepšovat architekturu těchto paměti a zásobovat tak hladové jádra procesorů. Intel do svého Pentia III zabudoval vyrovnávací paměť s 256bitovou šířkou datové sběrnice a procesor je proto schopen přečíst z paměti současně až 32 po sobě následujících bajtů. AMD se vydalo jinou cestou - používá tzv. exkluzivní cache, díky tomu data obsažená v L1 se neduplikují v L2 oproti tomu v procesorech Intelu je celý obsah L1 přítomen zároveň v L2.

FSB - externí sběrnice procesoru

Procesor musí komunikovat s okolím - s pamětí, grafickou, zvukovou, síťovou kartou, řadičem pevných disků a řadou dalších zařízení. Tuto komunikace zajišťuje sběrnice FSB (Front Side Bus) mezi procesorem a severním mostem (Northbridge) čipové sady. Čím větší je násobitel procesoru tím větší je pravděpodobnost, že dojde k zahlcení tohoto komunikačního kanálu. Je nutno si uvědomit, že zde přecházíme z mikrosvěta procesoru do makrosvěta základní desky. Obvod taktovaný řádově stovkami megahertzů se chová jako obvod s rozprostřenými parametry, každý kousek vodivé dráhy na základní desce se chová jako induktor, každá mezera mezi nimi jako kapacitor. To zhoršuje kvalitu signálu, především se snižuje strmost hran. Je třeba počítat také s rušením. Za těchto okolnosti je zvyšování propustnosti nesnadné.

Nové a rozšířené instrukční sady

Výrazným prvkem při zvyšování výkonu procesorů, alespoň tak se nás snaží přesvědčit marketingová střediska výrobců procesorů, jsou nové instrukční sady. Jedná se především o sadu sedmapadesáti MMX (MultiMedia eXtensions, implementují je všechny současné procesory) instrukcí. Mají tzv. SIMD (Single Instruction, Multiple Data) architekturu- umožňují provádět jednoduché operace (aritmetické, logické, posuvy, přesuny, konverze) na více operandech současně (respektive na více částech operandu současně) a pracují jen s daty v pevné řadové čárce. Pro práci s daty v pohyblivé řadové čárce slouží sada SSE(2) v procesorech Intel a 3DNow! v procesorech AMD.

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , ,