Adresování slov - Word addressing

V počítačové architektuře znamená adresování slov to, že adresy paměti v počítači jednoznačně identifikují slova paměti. Obvykle se používá na rozdíl od adresování bajtů , kde adresy jednoznačně identifikují bajty . Téměř všechny moderní počítačové architektury používají adresování bajtů a adresování slov je do značné míry pouze historického zájmu. Počítač, který používá adresování slov, se někdy nazývá slovní automat .

Tabulky zobrazující stejná data uspořádaná pod adresou bajtů a slov

Základy

Zvažte počítač, který poskytuje 524 288 (2 19 ) bitů paměti. Pokud je tato paměť uspořádána v bajtovém adresovatelném plochém adresním prostoru pomocí 8bitových bytů, pak existuje 65 536 (2 16 ) platných adres, od 0 do 65 535, z nichž každá označuje nezávislých 8 bitů paměti. Pokud je místo toho uspořádáno v plochém adresním prostoru adresovatelném slovem pomocí 32bitových slov, pak existuje 16 384 (2 14 ) platných adres, od 0 do 16 383, z nichž každá označuje nezávislých 32 bitů.

Obecněji řečeno, minimální adresovatelná jednotka (MAU) je vlastností konkrétní abstrakce paměti. Různé abstrakce v počítači mohou používat různé MAU, i když představují stejnou základní paměť. Například počítač může ve své sadě instrukcí používat 32bitové adresy s adresováním bajtů , ale systém koherence mezipaměti CPU může pracovat s pamětí pouze při granularitě 64bajtových řádků mezipaměti , což umožňuje identifikovat konkrétní řádek mezipaměti pouze s 26bitová adresa a snížení režie mezipaměti.

Překlad adres prováděný virtuální pamětí často ovlivňuje strukturu a šířku adresního prostoru, ale nemění MAU.

Kompromisy různých minimálních adresovatelných jednotek

Velikost minimální adresovatelné jednotky paměti může mít složité kompromisy. Použití větší MAU umožňuje pokrytí stejného množství paměti menší adresou, což může podstatně snížit paměťové nároky programu. Použití menší MAU však usnadňuje efektivní práci s malými položkami dat.

Předpokládejme, že si program přeje uložit jeden z 12 tradičních znaků západní astrologie . Jeden znak může být uložen ve 4 bitech. Pokud je znak uložen ve své vlastní MAU, budou 4 bity zbytečné s adresováním bajtů (účinnost 50%), zatímco 28 bitů bude zbytečné s adresováním 32bitových slov (účinnost 12,5%). Pokud je znak „zabalen“ do MAU s jinými daty, pak může být čtení a zápis relativně dražší. Například pro zápis nového znaku do MAU, do kterého byla zabalena jiná data, musí počítač přečíst aktuální hodnotu MAU, přepsat pouze příslušné bity a poté uložit novou hodnotu zpět. To bude obzvláště nákladné, pokud je nutné, aby program umožnil jiným vláknům souběžně upravovat další data v MAU.

Běžnějším příkladem je řetězec textu . Běžné formáty řetězců, jako jsou UTF-8 a ASCII, ukládají řetězce jako posloupnost bodů 8bitového kódu. S adresováním bajtů může být každý bod kódu umístěn do vlastní nezávisle adresovatelné MAU bez režie. Při 32bitovém adresování slov by umístění každého bodu kódu do samostatné MAU zvýšilo využití paměti o 300%, což není životaschopné pro programy, které pracují s velkým množstvím textu. Sbalením sousedních kódových bodů do jednoho slova se těmto nákladům vyhnete. Mnoho algoritmů pro práci s textem však upřednostňuje možnost nezávisle adresovat body kódu; aby to bylo možné s balenými kódovými body, musí algoritmus použít „širokou“ adresu, která také ukládá odsazení znaku ve slově. Pokud je třeba tuto širokou adresu uložit jinam v paměti programu, může to vyžadovat více paměti než běžnou adresu.

Chcete -li vyhodnotit tyto efekty na kompletním programu, zvažte webový prohlížeč zobrazující velkou a složitou stránku. Část paměti prohlížeče bude použita k ukládání jednoduchých dat, jako jsou obrázky a text; prohlížeč se pravděpodobně rozhodne ukládat tato data co nejefektivněji a zabere přibližně stejné množství paměti bez ohledu na velikost MAU. Jiná paměť bude představovat model různých objektů prohlížeče na stránce a tyto objekty budou obsahovat mnoho odkazů: navzájem, na obrazová a textová data atd. Velikost paměti potřebné k uložení těchto objektů bude do značné míry záviset na šířce adresy počítače.

Předpokládejme, že pokud by všechny adresy v programu byly 32bitové, zabírala by tato webová stránka asi 10 gigabajtů paměti.

  • Pokud webový prohlížeč běží na počítači s 32bitovými adresami a pamětí adresovatelnou bajty, adresní prostor pokryje 4 gigabajty paměti, což je nedostatečné. Prohlížeč buď nebude schopen zobrazit tuto stránku, nebo bude muset být schopen příležitostně přesunout některá data na pomalejší úložiště, což podstatně poškodí jeho výkon.
  • Pokud webový prohlížeč běží na počítači se 64bitovými adresami a adresovatelnou pamětí, bude k uložení větších adres vyžadovat podstatně více paměti. Přesná režie bude záviset na tom, jak velká část z 10 gigabajtů je jednoduchá data a jak velká je objektová a hustá s referencemi, ale číslo 40% není nepravděpodobné, celkem je požadováno 14 gigabajtů. To je samozřejmě v možnostech 64bitového adresního prostoru. Prohlížeč však obecně vykazuje horší lokalitu a hůře využívá paměťové mezipaměti počítače v počítači za předpokladu, že má stejné zdroje jako alternativy.
  • Pokud je webový prohlížeč spuštěn na počítači s 32bitovými adresami a pamětí adresovatelnou na 32bitová slova, bude pravděpodobně vyžadovat další paměť kvůli suboptimálnímu balení a potřebě několika širokých adres. Tento dopad bude pravděpodobně relativně malý, protože prohlížeč bude pro většinu důležitých účelů používat balící a neširoké adresy a brwoser se pohodlně vejde do maximálního adresovatelného rozsahu 16 gigabajtů. V důsledku rozšířeného používání zabalených dat pro obrázky a text však může dojít k značné režii běhu. Ještě důležitější je, že 16 GB je relativně nízký limit, a pokud webová stránka výrazně roste, tento počítač vyčerpá svůj adresní prostor a začne mít některé stejné potíže jako počítač s adresou s bajty.
  • Pokud je webový prohlížeč spuštěn na počítači se 64bitovými adresami a pamětí adresovatelnou na 32 bitových slov, bude trpět oběma výše uvedenými režijními náklady za běhu: vyžaduje podstatně více paměti pro umístění větších 64bitových adres, což poškozuje lokalita, a zároveň vznikají režijní náklady na práci s rozsáhlým balením textových a obrazových dat. Adresování slov znamená, že program může teoreticky adresovat až 64 Exabajtů paměti namísto pouhých 16 Exabajtů, ale protože program zdaleka nepotřebuje tolik paměti (a v praxi to žádný skutečný počítač není schopen poskytnout), neposkytuje to žádnou výhodu .

Adresování slov tedy umožňuje počítači adresovat podstatně více paměti, aniž by se zvětšila jeho šířka adresy a došlo k odpovídajícímu velkému nárůstu využití paměti. To je však cenné pouze v relativně úzkém rozsahu velikostí pracovních sad a může to v závislosti na aplikaci zavést značné režijní náklady za běhu. Programy, které relativně málo pracují s bajtově orientovanými daty, jako jsou obrázky, text, soubory a síťový provoz, mohou mít největší prospěch.

Přístupy pod slovem a široké adresy

Program spuštěný na počítači, který používá adresování slov, může stále pracovat s menšími jednotkami paměti emulací přístupu k menší jednotce. Pro načtení to vyžaduje načtení uzavíracího slova a poté extrahování požadovaných bitů. U obchodu to vyžaduje načtení uzavíracího slova, přesunutí nové hodnoty na místo, přepsání požadovaných bitů a následné uložení uzavíracího slova.

Předpokládejme, že čtyři po sobě jdoucí body kódu z řetězce UTF-8 musí být zabaleny do 32bitového slova. První kódový bod může zabírat bity 0–7, druhý 8–15, třetí 16–23 a čtvrtý 24–31. (Pokud by paměť byla adresovatelná v bajtech, bylo by to trochu endianové pořadí bajtů.)

Aby bylo možné jasně objasnit kód nezbytný pro přístupy pod slovy, aniž by byl příklad příliš vázán na konkrétní architekturu adresovanou slovy, následující příklady používají sestavení MIPS . Ve skutečnosti je MIPS architektura adresovaná bajty s přímou podporou načítání a ukládání 8bitových a 16bitových hodnot, ale příklad bude předstírat, že poskytuje pouze 32bitové načítání a ukládání a že se kompenzuje v rámci 32bitového slova musí být uloženy odděleně od adresy. MIPS byl vybrán, protože je to jednoduchý jazyk sestavení bez specializovaných zařízení, které by tyto operace usnadnily.

Předpokládejme, že si program přeje přečíst třetí kódový bod do registru r1ze slova na adrese v registru r2. Při absenci jakékoli jiné podpory ze sady instrukcí musí program načíst celé slovo, posunout doprava o 16, aby odstranil první dva body kódu, a poté maskovat čtvrtý bod kódu:

  ldw  $r1, 0($r2)        # Load the full word
  srl  $r1, $r1, 16       # Shift right by 16
  andi $r1, $r1, 0xFF     # Mask off other code points

Pokud není ofset staticky znám, ale místo toho je v registru uložen bitový offset, r3je vyžadován poněkud složitější přístup:

  ldw  $r1, 0($r2)        # Load the full word
  srlv $r1, $r1, $r3      # Shift right by the bit offset
  andi $r1, $r1, 0xFF     # Mask off other code points

Předpokládejme místo toho, že si program přeje přiřadit bod kódu v registru r1ke třetímu bodu kódu ve slově na adrese v r2. Při absenci jakékoli jiné podpory ze sady instrukcí musí program načíst celé slovo, zamaskovat starou hodnotu tohoto kódového bodu, přesunout novou hodnotu na místo, sloučit hodnoty a uložit celé slovo zpět:

  sll  $r1, $r1, 16       # Shift the new value left by 16
  lhi  $r5, 0x00FF        # Construct a constant mask to select the third byte
  nor  $r5, $r5, $zero    # Flip the mask so that it clears the third byte
  ldw  $r4, 0($r2)        # Load the full word
  and  $r4, $r5, $r4      # Clear the third byte from the word
  or   $r4, $r4, $r1      # Merge the new value into the word
  stw  $r4, 0($r2)        # Store the result as the full word

Opět platí, že pokud je místo toho uložen offset r3, je vyžadován komplexnější přístup:

  sllv $r1, $r1, $r3      # Shift the new value left by the bit offset
  llo  $r5, 0x00FF        # Construct a constant mask to select a byte
  sllv $r5, $r5, $r3      # Shift the mask left by the bit offset
  nor  $r5, $r5, $zero    # Flip the mask so that it clears the selected byte
  ldw  $r4, 0($r2)        # Load the full word
  and  $r4, $r5, $r4      # Clear the selected byte from the word
  or   $r4, $r4, $r1      # Merge the new value into the word
  stw  $r4, 0($r2)        # Store the result as the full word

Tato sekvence kódu předpokládá, že jiné vlákno nemůže souběžně upravovat jiné bajty ve slově. Pokud je souběžná úprava možná, může dojít ke ztrátě jedné z úprav. K vyřešení tohoto problému musí být posledních několik instrukcí přeměněno na atomovou srovnávací a výměnnou smyčku, aby souběžná modifikace jednoduše způsobila, že bude operaci opakovat s novou hodnotou. V tomto případě nejsou vyžadovány žádné paměťové bariéry.

Dvojice adresy slova a odsazení ve slově se nazývá široká adresa (také známá jako tlustá adresa nebo tlustý ukazatel ). (To by nemělo být zaměňováno s jiným použitím širokých adres pro ukládání jiných druhů doplňkových dat, jako jsou hranice pole.) Uložený offset může být buď bitový offset, nebo byte offset. Sekvence kódu výše těží z offsetu denominovaného v bitech, protože jej používají jako počet posunů; architektura s přímou podporou pro výběr bytů může dávat přednost pouze uložení bajtového posunu.

V těchto sekvencích kódu by musel být dodatečný offset uložen vedle základní adresy, což by efektivně zdvojnásobilo celkové požadavky na úložiště adresy. To u textových automatů neplatí vždy, především proto, že samotné adresy často nejsou nabité jinými daty, aby byly přístupy efektivnější. Například Cray X1 používá 64bitová slova, ale adresy mají pouze 32 bitů; když je adresa uložena v paměti, je uložena ve svém vlastním slově, a tak může být posunutí bajtu umístěno do horních 32 bitů slova. Neefektivnost používání širokých adres v tomto systému je jen veškerá logika navíc pro manipulaci s tímto ofsetem a extrahování a vkládání bytů do slov; nemá žádný vliv na využití paměti.

Související pojmy

Minimální adresovatelná jednotka počítače nemusí být nutně stejná jako minimální velikost přístupu do paměti instrukční sady počítače. Počítač může například používat adresování bajtů bez poskytnutí pokynů k přímému čtení nebo zápisu jednoho bajtu. Od programů se očekává, že budou tyto operace emulovat v softwaru s bitovými manipulacemi, stejně jako výše uvedené příklady kódových sekvencí. To je poměrně běžné u 64bitových počítačových architektur navržených jako nástupce 32bitových superpočítačů nebo minipočítačů, jako jsou DEC Alpha a Cray X1 .

Standard C uvádí, že se očekává, že ukazatel bude mít obvyklou reprezentaci adresy. C také umožňuje vytvoření ukazatele na jakýkoli objekt kromě bitového pole; to zahrnuje každý jednotlivý prvek pole bajtů. Kompilátory C pro počítače, které používají adresování slov, často používají různé reprezentace pro ukazatele na různé typy v závislosti na jejich velikosti. Ukazatel na typ, který je dostatečně velký na to, aby vyplnil slovo, bude jednoduchá adresa, zatímco ukazatel jako char*nebo void*bude široký ukazatel: dvojice adresy slova a odsazení bajtu v rámci tohoto slova. Převod mezi typy ukazatelů proto nemusí být nutně triviální operací a může dojít ke ztrátě informací, pokud je proveden nesprávně.

Protože velikost C structnení vždy známa při rozhodování o reprezentaci ukazatele na to struct, není možné spolehlivě použít výše uvedené pravidlo. Kompilátory možná bude nutné zarovnat začátek a struct, aby mohl používat efektivnější reprezentaci ukazatele.

Příklady

  • ERA 1103 používá slovo řešení s 36-bitovými slovy. Pouze adresy 0-1023 odkazují na paměť s náhodným přístupem; ostatní jsou buď nemapovány, nebo odkazují na paměť bubnu.
  • PDP-10 používá slovo řešení s 36-bitovými slovy a 18-bitové adresy.
  • Většina superpočítačů Cray z 80. a 90. let používá adresování slov pomocí 64bitových slov. Cray-1 a Cray X-MP pouze 24bitové adresy, zatímco většina ostatních pouze 32bitové adresy.
  • Tyto X1 Cray použití byte řešení s 64-bitové adresy. Nepodporuje přímo paměťové přístupy menší než 64 bitů a takové přístupy musí být emulovány v softwaru. Kompilátor C pro X1 byl prvním kompilátorem Cray, který podporoval emulaci 16bitových přístupů.
  • Prosince Alpha používá byte řešení s 64-bitové adresy. Starší procesory Alpha neposkytují žádnou přímou podporu pro 8bitové a 16bitové přístupy do paměti a programy jsou povinny např. Načíst bajt načtením obsahujícího 64bitového slova a poté samostatně extrahovat bajt. Protože Alpha používá adresování bajtů, tento offset je stále zastoupen v nejméně významných bitech adresy (spíše než samostatně jako široká adresa) a Alpha pohodlně poskytuje načítání a ukládání nevyrovnaných instrukcí ( ldq_ua stq_u), které tyto bity ignorují a jednoduše načítají a uložte obsahující zarovnané slovo. Pozdější rozšíření bajtových slov do architektury (BWX) přidala 8bitová a 16bitová zatížení a úložiště, počínaje Alpha 21164a. Toto rozšíření bylo opět možné bez závažné nekompatibility softwaru, protože Alpha vždy používala adresování bajtů.

Viz také

Reference