RDNA (mikroarhitektuur)

**RDNA arhitektuur** on AMD Graphics Core Nexti arhitektuuri järglane. Seda esitles Computexi näitusel AMD tegevjuht Lisa Su. 

Uus arhitektuur töötati välja eeskätt arvutimängude, konsoolide ja pilvelahenduste tarbeks, võttes eesmärkideks väikese latentsuse ja energiakulu. See on siiski tagasiühilduv GCN arhitektuuriga. Sellel tehnoloogial põhinevad RX-seeria graafikakaardid tulid turule 2019. aasta juulis. RDNA on esimene arhitektuur, mis põhineb TSMC 7nm TinFET tehnoloogial ja mis kasutab liidesena PCIe 4.0-i. 

RDNA edasiarendus RDNA2 toodi avalikkuse ette 2020. aasta oktoobris. See on aluseks AMD RX 6000 seeria graafikakaartidele ja ka Playstation 5 ning Xbox Series X graafikakaartidele. Järgmine põlvkond RDNA3, avalikustatakse eeldatavasti 2022. aastal või varem AMD plaani järgi ja põhineb uuel tootmisprotsessil, mida pole veel avaldatud.
RDNA arhitektuuri programmeerimisjuhis on saadaval GPUOpeni veebilehel.

## RDNA Arhitektuur

RDNA protsessor on vektor ja skalaar aritmeetika-loogika üksus, et käitada keerukaid paralliseeritud programme. See on paralleelse mikroarhitektuuriga, mis on hea andmetöötluse kui ka graafiliste rakenduste jaoks. RDNA seadmel on paralleelandmete protsessorite massiiv, käsuprotsessorid, mälukontroller ja muu loogika, nagu video kodeerimisüksus. Käsuprotsessorid loevad sisse käsud, mida hostseade (Host CPU) on kirjutanud süsteemimälu aadressiruumi, seejärel saadavad riistvaraliselt tekitatud katkestused tagasi hostile, kui käsk on täidetud. RDNA mälukontrolleril on otseühendus seadmemälule ja hosti määratud süsteemimälu osadele. Mälukontroller käitub ka kui otsemälupöördumiste (DMA) kontroller, et rahuldada lugemis- ja kirjutamiskäsud. See arvutab mäluaadressimuutusi, vastavalt küsitud andmetele. 

Töötav rakendus RDNA keskkonnas koosneb kahest osast:
* Programm, mis töötab hostseadmes
* kernelid (samuti programmid), mis jooksevad RDNA protsessoril
RDNA programme juhivad hosti käsud, mis:
* seavad üles sisemised registrid
* täpsustavad aadressiruumi
* puhastavad RDNA GPU vahemälud
* panevad RDNA GPU täitma mingit programmi

Vajalik draiver töötab hostseadmes. See vahetab API käske ja infot protsessoriga, kasutades PCIe 4.0 liidest, mille andmevahetuskiirus on 16 GT/s, kahekordne võrreldes vanema põlvkonna 3.0 liidesega.

Paralleelandmete protsessorite massiiv on organiseeritud kui töörühma protsessorite torud, igaüks iseseisev ja võimeline töötama nii ujukomaarvude kui ka täisarvudega voogudega. Need torud saavad töödelda andmeid või läbi mälukontrolleri kirjutada või lugeda andmeid. Mõlemat saab teha tingimuslikuks.

RDNA protsessor koosneb:
* skalaaride aritmeetika loogika üksusest, mis töötab ühe väärtusega iga laine kohta
* vektorite aritmeetika loogikaüksus, mis töötab unikaalsete väärtuste kallal iga tööelemendi kohta
* Lokaalne andmehoidla (LDS), mis laseb ühe töögrupi tööelementidel omavahel andmeid jagada ja suhelda
* Skalaarmälu
* Vektormälu

Kui töögrupi protsessor saab käsu, laeb see juhised ja info mälust ning töötab kuni kerneli lõpuni. RDNA riistvara loeb juhised automaatselt vahemällu, ilma, et tarkvaraliselt oleks vaja midagi teha. Kernelid saavad laadida andmeid välisest mälust üldkasutatavatesse registritesse (GPR).

Programmi töö käigus tekkivaid ujukoma erindeid suudab seade leida ja tekitada katkestus. Neid saab ka salvestada, et hiljem uurida. Varjamaks latentsust, on korraga sadu erinevaid protsesse ja samal ajal on nii arvutusprotsessid kui mälust lugemise protsessid.
RDNA-ga tuli uus QoS teenus Asynchronous Compute Tunneling, mis laseb protsessoril tegeleda kõige latentsustundlikuma ja tähtsamate töödega.
RDNA arhitektuur on hästi skaleeritav, sest GPU-d koosnevad mitmest kindla riistvara komplektidest. Vastavalt GPU-le on võimalik neid komplekte ja komponente lisada.

### Kernelid
RDNA kernelid on protsessori üldised programmid, mis võtavad mälust andmeid, töötlevad neid ja panevad tulemused tagasi mällu. Programmi jaoks vajalikud tööelemendid grupeeritakse kas 32-või 64-steks ja kernel töötleb neid korraga. Need tööelemendid moodustavad lained, kas wave32 või wave64. Varjutaja riistvara on põliselt wave32 jaoks. Et teha wave64 operatsioone, antakse käske kaks korda, algul esimese 32 tööelemendi ja siis ülejäänute jaoks. Kui kummagi puhul pole vaja midagi teha, siis saab selle vahele jätta.
Wave32 on parem, sest sellel on väiksem latentsus, lühem laine eluiga, see on efektiivsem poolikute lainetega ja omab paremat juurdepääsu mälule. Wave64 lubab aga rohkem tööelemente ja on efektiivsem „attribute interpolation“ eesmärkidel. Kompilaator teeb otsuse, kumba kasutada. Arvutus ja „vertex“ varjutajad on wave32, piksli varjutaja on wave64.Kerneli juhtimine, näiteks if- või loop-lausete abil, on skalaar ALU juhiste abil, mis kehtivad tervele lainele. Vektor juhised töötavad laines ühel hetkel kõikidele laine tööelementidele. Lainel on eraldi atribuut määramaks, mis tööelemendi kallal viiakse vektorjuhis läbi ja millisel mitte.

### WGP
Eelmise põlvkonna väikseima põhilise arvutusüksuse asemel on töögrupi protsessor (WGP). Igas WGP-s on kaks arvutusüksust, kummaski 2 SIMD32 üksust, mis jagavad oma rada mäluni, mõlemas 32 ALU-d. Lisaks LDS-i, mälu, skalaarvahemälu ja aritmeetika-loogika üksused. Igal SIMD-l on 10 kB skalaarregistrifail, 128 pesa ühe laine kohta. Skalaar ALU SIMD-is kasutab skalaar registrifaili ja teeb 64-bitiseid aritmeetikatehteid, mis on juhtimise jaoks . Näiteks arvutab hargnemise juhud või mingi väärtuse, mis läheb tervele lainele. See arvutab ka aadresse, kui kirjutatakse või loetakse skalaarvahemälust. Skalaarvahemälu on jagatud kõikide töögrupi protsessori SIMD-de vahel. See on 16 kB *write-back* mälu.
Peamine 32-liiniga vektor ALU on disainitud "fused multiply-accumulate" (FMA) tehete jaoks, mis vähendab voolutarvet ja suurendab arvutustäpsust. Liinid saavad efektiivselt teostada tehteid erinevate bitiliste arvudega. Kui on näiteks 16-bitiste arvude korrutamine, siis tulemus on 32-bitine, et ei oleks andmekadu. Mõned süsteemi versioonid toetavad muid andmetüüpe, peamiselt masinõppe kiirendamiseks.

Sellise WGP eelised võrreldes varasema arhitektuuriga on järgmised:
* väiksem latentsus ja suurem IPC
* tugi wave32-le kui ka wave64-le, varasem GCN oli ainult wave64
* üksiktaktide ajal käsu jagamine, GCN jagas uue käsu iga 4 takti tagant
* kahe arvutusüksuse ressursid on igas WGP-s
* topelt skalaarmälud
* transtsendentaalsete aritmeetiliste toimingute samaaegne täitmine
* vektormälu parandused

Võrreldes GCN-i arvutusüksustega vajavad RDNA WGP üksused palju vähem laineid, et tervet süsteemi täismahus utiliseerida. GCN-i 2 arvutusüksuse jaoks on vaja kokku 512 tööelementi. WGP vajab 128 tööelementi. Kui iga WGP jaoks on 256 tööelementi, siis praktikas on 90% ALU-st kasutusel. Kui on 64 tööelementi, siis GCN-i puhul koondatakse need kõik ühte SIMD16 üksusesse, RDNA-l aga jaotatakse need kahe SIMD32 peale. Mõlemad arhitektuurid vajavad lisalaineid, et peita mälu latentsust.
GCN-i SIMD16 üksused said igaüks kuni 10 lainet ja nad andsid käske iga 4 takti tagant. RDNA SIMD32 üksused annavad aga uue käsu iga takti tagant. Igal SIMD32 üksusel on 1024 füüsilist registrit (VGPR), need jaotatakse lainete vahel ära nii, et iga laine saab kuni 256 registrit. Üks wave32 laine saab võrreldes wave64-ga kaks korda rohkem registreid. Näiteks 8 wave32 puhul saab iga laine 128 registrit, sama palju wave64 laine saab 64 registrit.
Iga WGP jaoks on 128 kB jagatud LDS, mis laseb väikese latentsusega suhelda tööelementidel omavahel. Mälul on 64 panka, igal 512 4-baidist pesa. Seda saab kasutada ka kui tarkvaralist vahemälu, kus hoida korduvalt kasutatavalt andmeid, mida on näiteks vaja teatud tekstuuri funktsioonidel. LDS-l on kompilaatori poolt juhutavat kaks töörežiimi: CU mood ja WGP mood. Esimese puhul jagatakse mälu pooleks 4 SIMD32 vahel ning neis töödeldavad elemendid ei saa omavahel suhelda. See aga võib kiirendada tööd. Teise puhul on LDS üks suur mälu kõigile juurdepääsetav. Kirjutamis/Lugemiskiirus on 32 sõna taktis, mis on kahekordistatud võrreldes GCN-ga. LDS-mälul on ka igas pangas oma ALU, mis teeb atoomilisi operatsioone nagu näiteks FP min või FP max. Mälul on oma *crossbar* liigutamaks infot panga ja lainete vahel. Kui mitu elementi tahavad ligipääsu samale pangale ühe takti ajal, siis riistvara automaatselt paneb need üksteise järele.
RX 5700XT graafikakaardi igal WGP-l on lisaks 32 kB käskude vahemälu, mis töötab 64B andmeplokkidega, 16 kB skalaarvahemälu, mis 64 B andmeplokkidega, ning 2x16 kB L0-vahemälu, mis töötab 128B andmeplokkidega.  L0 mälu on "write-through" ja kasutab kõige viimasena kasutatud asendussüsteemi (LRU). L1-s hoiustatakse graafika tekstuure.
RDNA seadmed kasutavad 64 kB globaalset mälu (GDS), mida saavad kasutada kõik WGP-d. Mälus on 32 panka, igas 512 4-baidist pesa. Iga takti ajal antakse ligipääs 128 baidile. Mälu saab kasutada, et hoida tähtsat kernelite juhtimisinfot või teha sisseehitatud loogikaga andmete pakkimist.

Uuenenud vahemäluga toimuvad vähem kirjutamisi kiibivälisesse mällu. See on saavutatud sellega, et L2 kliendid on nüüd kõik elemendid, varem kirjutas Copy Engine otse mällu. Esimest korda on ka L1-vahemällu. L1-vahemälu on WGP komplektidele 128 kB, 128 B andmeplokiga, L2-vahemälu on tervele protsessorile 4 MB, 128 B andmeplokiga. Suuremate andmeplokkide tõttu on mälu kiirem ja L1-vahemälu lisandumisega on väiksem latentsus. Samuti L1-mälu tõttu on üldjagataval L2-mälul koormus väiksem ja selle ehitus lihtsam. L2-mälu on neljaks sektsioonitud ja igal on oma 64-bitine mälukontroller. Need mälukontrollerid on ühendatud 2 32-bitise GDDR6 DRAM-ga, mis on ühendatud 16 Gb/s liidesega, topelt võrreldes eelmise põlvkonna GDDR5 mäluga.

## RDNA2
RDNA teist põlvkonda esitleti avalikkusele 28. oktoobril 2020 ja esimesed graafikakaardid selle arhitektuuriga tulid müügile sama aasta 18. novembril.

WGP uuendusena on juures kiirtejälituskiirendi (*ray accelerator*). 1 kiirendi on kummalgi WGP arvutusüksusel ja need arvutavad valguse liikumist ja annavad reaalaja valgusefektide loomise. Kiirtejälitus kasutab BVH (*bounding volume hierarchy*) töötlemist. Selle abil leiab efektiivselt kiire ja kolmnurga ristumiskohti. Riistvaralise kiirendi abil on kiirtejälitus 10 korda kiirem kui tarkvaraline lahendus varjutajatega.
Protsessoril on juures esimest korda L3 vahemälu, nimega Infinity Cache, mille suurus on 128 MB, mõnedel mudelitel 96 MB. Selle tõttu on väiksem vajadus küsida infot välise GDDR6 mälu käest, mis on ühendatud 256-bitise andmeliiniga.
Uue arhitektuuriga on ühilduvad DirectX 12 Ultimate ja Microsoft Direct Storage. Viimane laseb graafikakaardi mälul suhelda otse NVMe SSD-ga, kiirendamaks laadimist. Optimeeritud arhitektuuriga on graafikakaardid võimelised taktsagedusele üle 2 GHz.

## Kodeerimine
Arhitektuuril on olemas eraldi üksused kodeerimiseks ja dekodeerimiseks ja dekodeerimiseks. Seda tööd saab ka teha WGP-de peal, kuid eriüksused on selles paremad ning lasevad WGP-del tegeleda muude operatsioonidega. Varasem videoüksus on ümber disainitud 4K- ja 8K-ekraanide jaoks, mis on HDR toega. Videoüksus saab töödelda H.264, HEVC ja VP9 formaati, kuid viimast suudab ainult dekodeerida. H.264 formaadis 4K videot dekodeerib üksus 150 kaadrit sekundis, kodeerib aga 90 kaadrit sekundis. HEVC formaadis 4K-videot dekodeerib ja kodeerib 90 kaadrit sekundis, seda kas 8-või 10-bitise värvisügavusega. VP9 formaadis dekodeerib sama moodi.

## Viited