64-bitu-revoluce-nebo-jen-marketing
Hardware Článek 64 bitů - revoluce nebo jen marketing?

64 bitů - revoluce nebo jen marketing?

Petr Koc

Petr Koc

4. 9. 2006 01:00 123

Seznam kapitol

1. 16, 32 a 64bitové procesory 2. AMD64 - rozšíření x86 3. Windows XP Professional x64 Edition 4. Kompatibilita mezi programy a ovladači 5. 64bit aplikace: kde se berou a co výkon? 6. FAQ - často kladené otázky: 64-bit vs 32bit

64 bitové čipy jsou, společně s dvoujádrovými procesory typu 2-in-1, bezesporu největší inovací v oblasti procesorů určených pro osobní počítače, která proběhla za posledních deset let. Vzhledem k tom, že 64 bitů vyvolává "optický dojem", že se jedná o dvojnásobek 32 bitů, slibují si někteří uživatelé od těchto procesorů až 2x vyšší výkon, než který podávají dnešní procesory v 32 bitovém režimu. Proč se 64 bitové procesory prosazují tak pomalu? Hraje se s námi nekalá hra?

Reklama

Limity x-bitových procesorů

Termín "64 bitový procesor" je dnes velmi moderní, avšak často nesprávně chápaný pojem. Co vlastně takový čip umí? Kdysi dávno byl procesor poměrně jednoduché zařízení, které mělo jen jednu instrukční pipeline. Ta na vstupu vzala číslo (nebo čísla) + instrukci a provedla příslušnou operaci. Čísla byla pouze celočíselná, a proto i instrukce byly pouze "celočíselné". Bylo tak možné spočítat například 1 + 5 nebo 8 * 9 atp. Nešlo už ale vypočítat 4,8 * 6, první z těchto dvou čísel totiž není celé. Tato celočíselná pipeline používala pouze ALU (aritmeticky logickou jednotku).

První procesory byly osmibitové. To znamená, že jejich výpočetní schopnost pro čísla byla sestavena z osmi kombinací nul a jedniček. Z kombinatoriky je možné odvodit, že celkový počet hodnot jednoho osmibitového čísla je 2 na osmou, neboli 256. Těchto 256 možností bylo rozděleno na dva typy:

  1. Celočíselné kladné (unsigned integer): od 0 do 255.
  2. Celočíselné se znaménkem (signed integer): od -128 do +127.

Způsob nakládání s číslem (tj. zda binární zápis "11111111" znamená +256 nebo +127) byl určen čistě použitou instrukcí. Celočíselné sčítání se znaménkem a celočíselné sčítání bez znaménka tak generují zcela odlišné výsledky i přesto, že data jsou stejná.

Z uvedených rozsahů plyne, že osmibitový procesor je schopen počítat výsledky v rozsahu buďto 0 až 255 nebo -128 až +127. Uvažujme nyní pouze unsigned integer. Je tedy možné spočítat například 80 + 90 (= 170), není už ale možné počítat 85 + 200. Výsledek 285 je totiž větší, než co dovoluje rozsah (max. 255). Pokud zadáme osmibitovému procesoru úlohu 85 + 200, výsledek nebude 285, ale 30. Proč ? Dojde totiž k přetečení (overflow) a po číslu 255 bude následovat sekvence čísel 0, 1 atd.

64 bitů - revoluce nebo jen marketing?
i Zdroj: PCTuning.cz

Jak vidíte, osmibitový procesor je značně limitován svým číselným rozsahem. Reálných úloh, které se vejdou do rozsahu 0 až 255 je totiž velmi málo. To je také důvod, proč osmibitové procesory neměly dlouhého trvání.

Přepočet na větší rozsah - kombinování čísel

V tomto popise lehce zjednodušuji a to v tom smyslu, že i pomocí osmibitového procesoru je možné počítat větší čísla. Stačí totiž zkombinovat dvě osmibitová čísla v jedno šestnáctibitové - jednoduše provést toto: [15:8][7:0]. Takto je možné, aby horních osm bitů v podstatě říkalo, jaké bude první číslo u dolních osmi bitů. Jinými slovy pokud se [15:8] bude rovnat nule, bude mít [7:0] rozsah 0 až 255 (osmibitový). Pokud se [15:8] bude rovnat jedné, bude mít [7:0] rozsah 256 až 511 (taktéž osmibitový)  Opět z kombinatoriky 256 * 256 = 2 na šestnáctou, neboli 65536 možných hodnot (tj. rozsah 0 až 65535, případně -32768 až 32767 u signed integer). Problémem je, že tento způsob je neskutečně pomalý. Procesor totiž nepočítá jednu operaci, ale hned několik. Musí přičítat ke dvěma osmibitovým číslům naráz a musí kontrolovat overflow. Výkon se tak prakticky sníží přibližně na jednu čtvrtinu.

16bitové a 32bitové procesory

Dalším krokem ve vývoji po osmibitových byly procesory šestnácti- a třicetidvou-bitové. Už z názvů plyne, že tyto čipy umí počítat s čísly, které jsou tvořeny z dvě na šestnáctou, resp. dvě na třicátou druhou kombinací. Příslušné rozsahy jsou tedy následující:

  • 16bit unsigned integer: 0 až 65535
  • 16bit signed integer: -32768 až +32767
  • 32bit unsigned integer: 0 až 4294967295
  • 32bit signed integer: -2147483648 až +2147483647

S těmito čísly je možné, narozdíl od osmibitových procesorů při kombinování čísel, počítat v jednom průchodu, tedy podstatně rychleji. Šestnáctibitové procesory ještě znamenaly určitý limit, jelikož situací, kdy potřebujeme větší čísla, nastává poměrně hodně. Dvaatřicetibitové ale už většinou postačují. V nejhorším případě i ty umožňují výpočet 64bit čísel pomocí přepočtu. Z tohoto pohledu tedy 32bit procesory neznamenají limitaci.

Výpočty s desetinnou čárkou - floating point výpočty

V souvislosti s x86 procesory je nutné zmínit jeden důležitý fakt. Je jím to, že ne všechny typy výpočtů jsou celočíselné (integer).

Od dob Pentia všechny procesory obsahují integrovanou FPU jednotku. Ta slouží k výpočtu čísel s desetinnou čárkou (tedy například 6,4 * 8,15). Tato jednotka zpracovává instrukce x87, což je rozšíření původních x86 právě o výpočty s desetinnou čárkou. FPU jednotka je zcela oddělená od celočíselné ALU jednotky - je na ní nezávislá. Má vlastní instrukce a vlastní datové typy. Standardně pracuje s 32bit, 64bit, popřípadě s 80bit číselnými typy.

  • float: kladné / záporné znaménko, 8bit exponent, 23bit mantissa
  • double: kladné / záporné znaménko, 11bit exponent, 52bit mantissa
  • long double: kladné / záporné znaménko, 15bit exponent, 64bit mantissa

Tato čísla se ukázala jako plně dostačující. Pro velkou přesnost se dnes standardně používá typ double, některé programovací nástroje dokonce vůbec long double nevyužívají kvůli přílišné náročnosti na výpočetní zdroje procesoru (např. Visual C++ od Microsoftu).

SIMD operacee

Zkratka SIMD značí Single Instruction Multiple Data. V podstatě jde o to, že jedna instrukce je schopná spočítat vektor čísel, ať už vůči jinému vektoru nebo skalárně. Zřejmě nemá smysl zabíhat do detailů, z hlediska 64 bitů je totiž podstatné jedno - že SSE instrukce umožnily celočíselné 64 bitové operace dávno před příchodem 64bit procesorů.

64 bitů - revoluce nebo jen marketing?
i Zdroj: PCTuning.cz

Výpočet SSE instrukcí probíhá na datovém poli o velikosti 128 bitů. To je "pakováno" z několika klasických datových typů. Může být nastaveno jako šestnáct osmibitových čísel, osm šestnáctibitových, čtyři dvaatřicetibitové nebo dvě 64bit. (obdobně existují i varianty pro čísla s desetinnou čárkou s typy float a double). Jinými slovy pomocí SSE instrukcí (podporované počínaje Pentiem III z roku 1999) je možné spočítat 64bit celá čísla, a tak fakticky obejít "limitaci" 32bit celočíselných jednotek ALU.

Jediný drobný problém SSE byl (až do uvedení Core 2 Duo) v tom, že byly považovány za specializované, málo využívané instrukce. Procesory na ně nebyly optimalizovány. SSE tak měly větší latence než x86 zpracovávané v ALU jednotkách, tj. výpočty s nimi byly pro jednotlivá čísla (ne pro vektory) relativně pomalé. Dalším faktorem hrajícím ve prospěch výpočtů na bázi přepočítávání dvou 32bit čísel v ALU bylo, že instrukce SSE nemusel podporovat každý procesor - programátor obecně nechce řešit to, aby jeho program fungoval jen někde a za určitých okolností jinde, on chce, aby fungoval všude. A to i když ho to bude stát nějaký ten výkon.

64 bitů - revoluce nebo jen marketing?
i Zdroj: PCTuning.cz

Konečně největším nedostatkem SSE je, že programátor musí napsat kód přímo pro ně. Nikdo pracující pro peníze si nebude dělat práci těžší, než je nutné. A proto využije standardně nabízeného datového typu v prostředí svého oblíbeného vývojového nástroje. Například takové Visual C++ samozřejmě nabízí 64bit číselný datový typ. Ten je ale založen na přepočítávání dvou 32bit, nepočítá nic pomocí SSE instrukcí. Reálná využitelnost SSE jakožto náhražky za nedostatek 32bit ALU je proto diskutabilní.

Více paměti - veliký přínos 64bit procesorů

Patrně si teď říkáte, k čemu že vlastně ty 64bit procesory jsou dobré, když tak velká čísla nejsou téměř potřeba a pokud náhodou ano, existují hned dva způsoby, jak je spočítat jinak. Odpověď zní: paměť.

Počítače PC a kompatibilní už od začátku bojují s datovými omezeními. Nejvíce jsou tyto vidět na pevných discích. Mnozí si určitě ještě pamatují problémy s disky o velikosti nad 540 MB, 8 GB, 32 GB a naposledy také 128 GB. Toto všechno bylo způsobeno snahou šetřit. Disk s kapacitou nad 128 GB potřebuje velmi značné množství bitů k tomu, aby bylo možné adresovat všechny "paměťové bloky". Více bitů znamená větší nároky na výkon a to stojí peníze. Peníze, které nechce nikdo zaplatit, protože typický BFU (Běžný Franta Uživatel) chodí do obchodu kupovat to nejlevnější, co tam najde (např. kritériem při výběru DVD-RW mechaniky není její kvalita, ale to, že stojí o 30 Kč méně). Omezení plynoucí ze snahy šetřit se netýkaly jen pevných disků, ale také například času - vzpomeňme na tolik proslavený Y2K bug, kdy po 31. prosinci 1999 následuje 1. ledna 1900 (klasická ukázka overflow).

V poslední době se dostáváme i k limitaci velikosti paměti. 32bit procesory totiž trpí značnými omezeními z hlediska možné velikosti paměti RAM.  Pro přístup k paměti RAM (např. DDR SDRAM) musí být známá adresa. Máme-li program, který chce číst nějaká data, musí vědět, odkud je má číst. K účelům adresování existuje pointerr (ukazatel). To je celé číslo, které říká, kde konkrétně se nachází požadovaná data. Při lineárním adresování začínáme od nuly a postupujeme po jednom až k maximální velikosti. Budeme-li mít v počítači 1 GB RAM, pak budou existovat lineární adresy od 0 do 1073741823. Každá z těchto adres bude udávat jinou pozici v RAM.

Pokud budeme vědět, že od nějaké adresy každých osm bitů znamená jedno číslo (např. vsazené číslo ve Sportce), pak můžeme všechna čísla přečíst tak, že do pointeru uložíme počáteční adresu a další čísla vždy získáme přičtením jedničky k pointeru (pro jeden byte) a přečtením příslušné adresy v paměti RAM. Obdobným způsobem můžeme číst 16bit (+2) nebo 32bit (+4) integery. Těmito výpočty s pointerem tak můžeme mapovat celou paměť.

64 bitů - revoluce nebo jen marketing?
i Zdroj: PCTuning.cz


Instrukce čte data do registru ecx na základě pointeru v registru eax

Z popisu je zřejmé, že množství použitelné paměti RAM závisí na tom, jaké velikosti je schopen pointer dosáhnout, tj. s jakými čísly může operovat. U 32bit procesorů je maximální velikost čísla dvě na třicátou druhou - tudíž je možné adresovat 4294967296 bytů. To je přesně 4 GB. Takové množství paměti je pro dnešní počítače limitující. 1 GB RAM je dnes již vyšší standard a požadavky některých uživatelů se posunují k 2 GB. Nárůst nutné kapacity lze očekávat i od systému Windows Vista, který je už za dveřmi.

To ale stále mluvíme pouze o domácích počítačích. Existují ale i servery, kde je zapotřebí řádově vyšší kapacity. Rozsáhlé databáze poskytují nejlepší výkon tehdy, když jsou celé načtené (cacheované) v paměti RAM. Máme-li databázi o velikosti např. 6 GB, je zřejmé, že 32bit procesor nestačí.

Tohoto problému si byl Intel vědom už před více jak deseti lety. V roce 1995 zavedl pro Pentium Pro režim PAE (Physical Address Extensions). Ten umožňoval pomocí dalších čtyřech bitů zvětšit adresovatelný prostor na 64 GB. To už je pro většinu nasazení postačující. Problém ale je, že toto adresování má určité limitace. Vyžaduje totiž podporu operačního systému, který přemapovává (v podstatě přepočítává) 4 GB bloky v režimu dodatečných čtyřech bitů a standardní 32bit adresy, tedy [35:32][31:0]. Programy stále pracují s 32bit pointery, přičemž operační systém jim případně zaručuje přechod do dalšího 4 GB bloku. Takové řešení sice funguje, ale je pomalé.

Řešením omezení v množství adresovatelné paměti RAM je zvětšení pointeru. Díky 64bit celým číslům se tak pointer u 64bit procesorů zvětšuje na 64 bitů, tudíž umožňuje adresovat 17179869184 GB. Protože žádný dnešní počítač nemůže mít takové množství paměti (tolik se jí za celou historii transistorů snad ani nevyrobilo), bývá reálně adresace omezena na 40 bitů, případně 48 bitů, protože je to tak jednodušší v hardware navrhnout. Rozdíl (tedy například horních 24 bitů pointeru) jsou jednoduše nuly - to ale vůbec nevadí, protože taková fyzická adresa beztak neexistuje.

Předchozí
Další
Reklama
Reklama

Komentáře naleznete na konci poslední kapitoly.

Reklama
Reklama