Video, jossa selitetään aika paljon Navin arkkitehtuuria
https://www.youtube.com/watch?v=V7wwDnp8p6Y
Arkkitehtuuri eroaa oikeasti huomattavasti GCNstä, ei todellakaan ole mikään GCNn viilaus kuten Vega oli.
Oleellisia pointteja arkkitehtuurista:
* GCN:ssä kaikki laskuoperaatiot voitiin aloittaa vain neljän kellojakson välein, ja niillä oli neljän kellojakson viive. Välissä laskettiin joko vektorioperaatioiden muita linjoja, tai muiden wavefronttien skalaarikäskyjä. Koskaan ei liukuhihna stallannut datariippuvuuksien takia.
Navissa ei tälläista interleavausta ole, vaan käskyn suoritus voidaan aloittaa millä kellojaksolla tahansa. Jos käskyllä on datariippuvuuksia vielä kesken olevasta käskystä, liukuhihna stallataan. Kääntäjä toki yrittää sijoittaa peräkkäin käskyjä, joiden välillä ei ole datariippuvuuksia.
* 64-kokoisten wavefronttien lisäksi tuetaan myös 32-leveitä. Kumpia tahansa voidaan käyttää, 64lle on kaksi syytä, yhteensopivuus vanhan 64-leveitä vektoreita sisältävän koodin kanssa, sekä sillä saadaan parempi utilisaatio, jos työtä on paljon ja haarautumisia vähän. 32 taas mahdollistaa nopeamman suorituksen tilanteessa, jossa työtä laskettavaksi on vähän, tai koodissa on hyvin paljon haarautumisia. (64 usein parempi throughputille, 32 viiveelle).
64-leveässä moodissa ekalla kellojaksolla lasketan linjat 0-31, seuraavalla kellojaksolla linjat 32-63, sama periaate kuin GCNssä mutta jako kahteen eikä neljään.
* SIMD-yksiköt on nyt 16 linjan sijasta 32 linjaa leveitä, eli 32-kokoinen wavefront menee yhdessä kellojaksossa. Useimmilla operaatiolla on tosin viiden kellojakson viive, eli 32-leveässä moodissa voi joskus tulla datariippuvuuksien takia neljäkin stallia käskyjen väliin, ja 64-leveässä moodissa kolme stallia, jos heti seuraava käsky haluaa tätä juuri laskettua dataa käyttää.
* Tämä rakenne mahdollistaa sen, että piirin hyvään utilisaatioon tarvitaan paljon pienempi määrä work-itemeita kuin CGN vaati. GCN vaati käytännössä vähintään linjamäärä * 4 verran (eli esim. RX590llä 2304*4 = 9216 work itemia hyvään utilisaatioon(silloin kun mitään muistinkäytöstä johtavia stalleja ei tule), RDNAlla riittää 32-leveillä wavefronteilla suoraan piirin linjamäärä eli esim. tuolla ekalla piirillä 2560 kpl, eli siis käytännössä 4x pienempi linjamäärä, ja 64-leveullä wavefronteilla tuplasti piirin linjamäärä, eli ekalla piirillä 5120kpl.
Se, että piirin saa työllistettyä hyvin pienemmällä work item-määrällä ei kuitenkaan hyödytä vain silloin, kun työstä on pulaa, vaan se auttaa myös siihen, että kun kerrallaan aktiivisia work-itemeja on vähemmän(ja ne suoriutuvat nopeammin), välimuisteissa on pienemmän määrän säikeitä dataa kilpailemassa välimuistien kapasiteetista, välimuisteille saadaan parempi osumatarkkuus ja muistiaccesseja ulomman tason välimuisteihin tai ulkoiseen DRAMiin voi tulla vähemmän.
* Välimuistiin on tuotu yksi taso väliin
* Piirin pitäisi samalla jännitteellä kellottua korkeammalle kuin Vegan. Tuo 5 kellojakson viive useimmille operaatioille GCNn neljän sijaan tukisi sitä, että tämä ei ole vain propagandaa.
Tässä on sitten vähän omaa tulkintaa:
* Tuo NAVIN käsite "compute unit" tuntuu nyt olevan ihan höttöä, joka pidetään olemassa vain sen takia, että se on sellainen määrä laskentakapasiteettia, joka vastaa yhtä GCN:n CU:ta. Tekee vertailun GCNään helpommaksi.
Piirin arkkitehtuuri perustuu oikeasti "dual compute unit"eihin, jotka on ne oikeat ytimet, ja nämä ovat tuplasti isompia. Yhdessä DCU:ssa on L1-välimuisti, ja neljä clusteria joista jokaisessa on skalaariyksikkö ja 32-leveä SIMD-yksikkö. Ja täysin keinotekoisesti kahta tällaista clusteria, puolikasta DCUta kutsutaan CU:ksi.
Yhden DCU:n rakenne näkyy kohdassa 4:46,
yhden clusterin rakenne näkyy kohdassa 5:30
Lisää omaa tulkintaa, kohdassa 6:54 olevasta slidestä:
Tuossa tuo GCN laskee tuon koodin 16 kellojaksossa, mutta käsittääkseni se laskisi efektiivisesti samassa ajassa yhdellä CUlla sen koodin käytännössä neljään kertaan, neljälle eri wavefrontille. Kellojaksolla 1 voisi alkaa toinen wavefront, kellojaksolla 2 kolmas, kellojaksolla 3 neljäs, ja kun näitä suoritetaan monta peräkkäin, aina 16 kellojaksin sisällä voi alkaa ja valmistua 4 wavefronttia.
Navi taas käytännössä pystyy yhdessä CUssa laskemaan tuota tuossa esitetystä koodista kahta wavefrontia rinnakkain,
Eli GCN laskee tuota esimerkkikoodia käsittääkseni 256 WI / 16 kellojaksoa = 16 WI/kellojakso,
WARP32-NAVI 64 WI / 8 kellojakso = 8 WI/kellojakso, WARP-64-NAVI 128WI/9 kellojaksoa = 14.22 WI/kellojakso, eli käsittääkseni tällä koodilla GCNllä olisi kuitenkin paras throughput,
mikäli se saadaan työllistettyä hyvin
Joten Navi on radikaalisti nopeampi kuin GCN vain silloin kun GCNää ei saisi työllistettyä kunnolla, tai koodissa on paljon skaari-kokonaisluku-operaatioita joita GCN ei suostu laskemaan kuin neljän kellojakson välein mutta navi vaikka joka kellojakso. Ja jos WAVE64-moodi saadaan työllistettyä kunnolla, ja koodissa on paljon datariippuviiksia, tuo uusi WAVE32-moodi voi käydä selvästi hitaammaksi kuin WAVE64-moodi.
Sitten pointteja tuosta ekasta piiristä:
* Tuo ensimmäinen navi-piiri on pinta-alataan 251mm (vertailun vuoksi: samalla valmistustekniikalla valmistettu vega 20("radeon vii") oli 331mm^2
* ROPien määrä on 64. Eli sama kuin vegassa, tuplasti enemmän kuin RX580ssä.
.