Videomälu

**Videomälu** ehk **pildimälu** ehk **VRAM** (inglise keele sõnadest *video random-access memory)* on puhvermälu, mis hoiab pildi kõigi pikselite väärtusi. Videomälu kasutavad kõige sagedamini videokaardid, et salvestada iga pikseli väärtust kuvataval pildil, mida videokaart renderdab.

Videomälu eelise teiste mälutüüpide ees annab selle kahepordine omadus. Nimelt saab kahepordiselt mälult samaaegselt andmeid lugeda ja sellele kirjutada. Videomälu esineb vaid laienduskaartide näol, see tähendab et integreeritud graafikatehnoloogias ehk CPU-sisestel graafikaprotsessorites eraldi videomälu ei ole. Integreeritud graafika kasutab seadme operatiivmälu. Videomälu on oluliselt kiirema andmeedastusega kui operatiivmälu.

## Ajalugu

Videomälu leiutasid Frederick Dill, Daniel Ling and Richard Matick Thomas J. Watsoni uurimiskeskuses aastal 1980. Esimene kommertsarvuti, mis rakendas videomälu tehnoloogiat, oli 1986. aastal avaldatud IBM RT PC. See oli suur edasiminek arvutusgraafika tehnoloogias ning lõi aluse tänapäevastele mäluhaldustehnoloogiatele nagu GDDR ja HBM.
## Arhitektuur

### VRAM-mälu alamtüübid
* **SGRAM** (*Synchronous Graphics RAM*) – võrdlemisi odav ning seadme sisetaktiga kooskõlas. See lubab andmeid muuta ühe tsükli jooksul selle asemel, et teha mitut lugemis- või kirjutamistsükleid.
* **RDRAM** (*Rambus Dynamic RAM*) – sisaldab Rambuse siini, mis kiirendab andmevahetust VRAM-i ja kaadripuhveri vahel. Sobib eriti hästi voogedastuseks.
* **WRAM** (*Window RAM)* – suure jõudlusega VRAM, millel on ligi 25% suurem ribalaius kui standardsel VRAM-il. Seda kasutatakse kõrge lahutusega kaadriteks.
* **MDRAM** (*Multibank Dynamic RAM*) – arendas välja MySos. 32 KB suurusteks osadeks jaotatud. Igat osa saab eraldi adresseerida. See teeb andmevahetuse kiiremaks ning parendab jõudlust.

### Tööpõhimõte
Sarnaselt operatiivmälule koosneb videomälu mälurakkudest, millest igaüks hoiavad endas ühte bitti infot. Kui mälurakule rakendatakse kõrge pinge, loetakse mäluraku väärtust üheks ning pinge puudumisel loetakse see nulliks. Mälurakud on paigaldatud ridadesse ja veergudesse, luues tabelilaadse moodustise. Mälurakkude arv sõltub kiibi tootja ridade ja veergude arvust, kuid üldiselt ulatub see arv mitme miljonini Nt Samsungi KM428C256 videomälu kiibil on 512 x 4096 ehk 2097152 mälurakku. Iga mälurakul on enda aadress, mille abil saab sealt lugeda või sinna kirjutada. See, mitmest bitist koosneb adresseerimisarv, sõltub mälurakkude arvust. Aadressi bitijada pikkust saab tuletada võttes alusega kaks logaritmi selle mälurakkude arvust. Eelnevalt mainitud videomälu kiibil on sellisel juhul tarvis 21-biti pikkust aadressi, et oleks võimalik iga mälurakuga suhelda.

{\text{aadressi pikkus}} = \log_{2}{\text{mälurakkude arv}}

### Lugemis- ja kirjutamisoperatsioonid
Et GPU suudaks luua valminud kaadri, küsib see videomälult lugemisoperatsiooniga selleks andmeid. Käsk lugeda videomälult jõuab kontrolleriteni. Neid on kaks: üks lugemisoperatsioonide ning teine kirjutamisoperatsioonide jaoks. Kahe pordi tõttu saavad need operatsioonid paralleelselt toimida ning võimaldab hea kaadrisagedusega piltide renderdamise.  

Aadressi register hoiab operatsiooni vältel algaadressi, millest hakatakse mälurakkudest infot lugema või kirjutama. Aadressi lugerid seejuures suurendavad või vähendavad algaadressi, et minna edasi järgmiste rakkude juurde. Biti maskiregister (*[[:en:Mask_(computing)|Bit mask register]]*) "katab" ebavajalikud bitid, kui on vaja väga konkreetsetesse kohtadesse lugeda või kirjutada. Ridade ja veergude dekoodrid otsivad üles aadressis kirjeldatud mäluraku lugemiseks ja kirjutamiseks. Pingete värskendaja (*[[:en:Sense_amplifier|Sense amp]])* värskendab regulaarselt mälurakkude pingeid, hoides ühebitiseid rakke kõrgena ja nulliseid madalana. Vastasel juhul võivad ajapikku andmed kaduda. Mälurakke perioodiliselt loetakse üle ning kirjutatakse samad väärtused sisse, et säilitada andmete õigsus.  

GPU poolt kogutud andmed saadetakse kaadripuhvrisse SAM (*[[SRAM|Static access memory]]*). Seal vastab iga kuvatav piksel mingile asukohale puhvri sees. Valminud andmed edastatakse kuvarisse, mis interpreteerib need andmed vaatlejale arusaadavaks pildiks.   

### VRAM ribalaius

Videomälu üheks oluliseks parameetriks on selle ribalaius. Ribalaius iseloomustab videomälu kiipide andmeedastuskiirust. Mida suurem ribalaius on videomälul, seda parem. Ribalaius on oluline parameeter, sest võimas GPU ei saavuta oma maksimaalse efektiivsuse, kui selle pudelikaelaks on videomälu ribalaius. 

Ribalaiust iselmooustavad kolm parameetrit: taktsagedus, mälu tüüp ning andmesiini laius. Taktsagedus on mälukiipide enda sisekell. Mälu tüüp määrab, kuidas andmeid edastatakse. Vanemat sorti videomälu kasutas SDR (*single data rate*) tüüpi mälu, mis edastas ühe takti jooksul ühe korra andmeid. Tänapäevased videomälud kasutavad eri põlvkondi DDR (*double data rate*) tüüpi mälu, mis suudavad kaks korda andmeid edastada ühe takti jooksul. Andmesiini laius näitab, mitu bitti andmeid saab korraga edastada. Tüüpiliselt on see vahemikus 32 – 256 bitti. Ribalaiust saab arvutada korrutades taktsageduse, mälu tüüpi iseloomustava kordaja (DDR puhul 2, sest edastatakse kaks korda andmeid takti jooksul) ning andmesiini laiuse. 

{\text{ribalaius}} = {\text{taktsagedus}} \times {\text{mälu tüüp}} \times {\text{andmesiini laius}}

Nt Geforce RTX 4070 puhul on taktsagedus 1313 MHz, mälutüüp GDDR6X ning mälu laius 192 bitti. Sellise kaardi videomälu ribalaius on 1313 x 2 x 192 = 504,2 GB/s.

Andmesiinilt tulevad bitid jaotatakse töötlemiseks võrdselt videomälu moodulite vahel 32-bitisteks osadeks. Sellise seaduspäraga saab arvutada välja videokaardi mälumoodulite arvu. 

{\text{mälumoodulite arv}} = {\text{andmesiini laius}} \div 32

Geforce RTX 4070 puhul on andmesiini laius 192 bitti. Seega on sellisel videokaardil 192 / 32 = 6 mälumoodulit.

## Jõudlus

#### Tekstuuri kvaliteet
Videomängude või muudes arvutigraafika valdkondades on videomälu hulk tähtis tekstuuride renderdamisel. Mida kõrgem on tekstuuride detailsus, seda rohkem videomälu on tarvis, et neid kiiresti kuvada ning heal kaadrisagedusel jooksutada. 

Tihtipeale ei kuvata tekstuure kõige suurema detailsusega kui need asuvad objektidel, mis on vaatlejast kaugemal. Sellist protsessi kutsutakse MIPmappinguks ja see suurendab graafilise maailma jooksutamise sujuvust. Selle tehnoloogia kasutamiseks on aga tarvis videomälus lisaks kõige kõrgema detailsusega tekstuuride salvestamiseks hoida ka madalama lahutuse ja detailsusega koopiaid samast tekstuurist, mis kokkuvõttes suurendab ka nõutava videomälu kogust.

#### Kiirtejälitus (Ray tracing)
Videomälu kasutab ka kiirtejälitus. Kiirtejälitus simuleerib arvutigraafikas valguse käitumist, selle langemist ja põrkumist eri pindadelt. Sellega kaasneb rohkete primitiivide genereerimine, mida on vaja hoida videomälus.

### Piirangud
Kõige tüüpilisem probleem videomälu puhul on selle puudujääk. Kui videomälu ei ole piisavalt, peab GPU küsima kaadri kokkupanemiseks vajalikku infot operatiivmälust. Sellepärast on videomälul DRAM pordid, mis toimib tagavara mäluna. 

Operatiivmälu kasutamine aga võtab palju rohkem aega, sest see on loomult aeglasem – sellel on väiksem ribalaius ning see asub füüsiliselt kaugemal GPU-st. Sellise mälu laenamine põhjustab nt videomängudes madalamat kaadrisagedust ja kaadritõrkeid, mis võivad kesta mälu mõistes väga kaua (millisekundid kuni sekundid) ning on piisav, et vaatleja seda muutust tajuks. Samuti võib tekstuuride renderdamine olla vale või üldsegi puududa. Halvimatel juhtudel võib programm ka kokku joosta. 

Paljud videomängud pakuvad sätteid, mis vähendavad videomälu vajadust, vähendades tekstuuride kvaliteeti, nende lahutust, varjude kvaliteeti, peegeldusi, detailsust jne.

## Viited