Unified Shader-arkkitehtuuri

Grafiikkaprosessoreiden ja kiihdytinpiirien käyttämä "klassinen" arkkitehtuuri (pipeline - liukuhihna) on pysynyt perusluonteeltaan lähes samanlaisena 20 vuotta. Ensimmäinen PC-ympäristössä toiminut 2D-grafiikkakiihdytin oli IBM:n 1980-luvulla valmistama 8514-prosessori, mikä pystyi kiihdyttämään yksinkertaisten primitiivien ja pikseleiden laskentaa. 1990-luvun alussa Microsoft suunnitteli ohjelmoitavan laitteistopohjaisen GDI-rajapinnan (GDI - Graphics Device Interface) ja seuraavana vuonna S3 esitteli jo sille ensimmäisen S3 86C911-kiihdytinpiirillä toimineen näytönohjaimen. 1990-luvun aikana 2D-prosessoreista kehittyi vähitellen 3D-vektorimatriiseja laskevia suoritusyksiköitä, mitkä pystyivät samalla myös pinnoittamaan primitiivit ja kuviot sekä laskemaan erilaisia tehosteita pintoihin. Ohjelmoitavat grafiikkaprosessorit ilmestyivät markkinoille vuonna 2002.



Nykyisten grafiikkaprosessoreiden klassinen arkkitehtuuri muodostuu lineaarisesti indeksoidusta ja kiinteästä liukuhihnasta, mikä sisältää erilaisia vaiheita esimerkiksi primitiivien muodostamisesta aina lopulliseen pikseliin kuvaruutupuskurissa. Liukuhihnassa on myös kiinteä määrä erityyppisiä vektoreita käsitteleviä suoritusyksiköitä (ALU:t), mitkä pystyvät suorittamaan vain niille suunnattuja käskyjä ja operaatioita. Esimerkiksi G71-grafiikkaprosessorin fragmenttiprossorit eivät voi muodostaa primitiivejä tai suorittaa verteksilaskuja, mutta pystyvät laskemaan pikselin värinarvon ja yhdistämään sen tekstuurinäytteeseen. Klassinen grafiikkaprosessoreiden arkkitehtuuri asettaa myös muutamia merkittäviä rajoituksia, koska yksinkertaisen käskyn tai operaation on käytävä liukuhihnan kaikki vaiheet läpi riippumatta siitä, mitä käsky tai operaatio sisältää.

Unified Shader-arkkitehtuuri perustuu yhtenäiseen arkkitehtuuriin, missä suoritusyksiköt ovat monitoiminnallisia (multipurpose functional unit) ja pystyvät suorittamaan rinnakkain useita erityyppisiä verteksi-, geometria-, pikseli- tai GPGPU-käskyjä sekä operaatioita. Suoritusyksiköt saattavat suorittavat myös tarvittavat laskut primitiivien ja pikselineliöiden muodostamista varten kuten esimerkiksi perspektiivin muunnokset ja verteksien sekä pikseleiden ominaisuudet. Yhtenäisempi arkkitehtuuri mahdollistaa lisäksi aikaisempia arkkitehtuureja vapaamman ja nopeamman resurssien hallinnan (kiinteät ja väliaikaiset rekisterit), kun käskyjen ja operaatioiden ei tarvitse enää käydä läpi tarpeettomia liukuhihnan vaiheita. Unified Shader-arkkitehtuuri sisältää kuitenkin edelleen muutamia samoja vaiheita kuin klassinen arkkitehtuuri, mutta yhtenäisemmän arkkitehtuurin ansioista vaiheet ovat huomattavasti tehokkaammat ja rajoitukset minimaalisia.

Yksi Unified Shader-arkkitehtuurin tuomia etuja verrattuna klassiseen arkkitehtuuriin on käskyjen ja operaatioiden uudelleen järjestely (scheduling) sekä kuorman tasapainottaminen (load-balancing) suoritusyksiköiden kesken riippumatta onko käskyt tai operaatiot verteksi-, geometria-, pikseli- tai GPGPU-käskyjä ja operaatioita. Kuorman tasapainottamisen suhdetta voidaan lisäksi muuttaa riippuen ympäristöstö ja verteksi- sekä pikselioperaatioiden laadusta ja määrästä. Esimerkiksi pikseli-intensiivisessä ympäristössä missä ei tarvita geometriaa, voidaan kuorman tasapainoa siirtää tarpeen mukaan pikselioperaatioihin. Optimaalisella käskyjen ja operaatioiden uudelleen järjestelyllä sekä kuorman tasapainottamisella pystytään tehokkaasti myös minimoimaan toimettomat (idlaavat) suoritusyksiköt grafiikkaprosessorissa sekä vähentämään tarpeettomien tai samojen vaiheiden määrää. Hyvin toteutetun Unified Shader-arkkitehtuurin hyötysuhde (IPC - instructions per clock) suoritusyksiköiden välillä on kellojaksossa 95 - 100 %.



Alla on kaksi esimerkkiä kuinka G71-grafiikkaprosessorin klassinen arkkitehtuuri toimii erilaisissa ympäristöissä. Ensimmäinen esimerkki on verteksi- ja geometriaintensiivisestä ympäristöstä ja toinen on pikseli-intensiivisestä ympäristöstä.





Kuten kuvista näkee, G71-grafiikkaprosessorin kuorman tasapainottamisen hyötysuhde on lähes olematon yhdenlaatuisilla operaatioilla, kun operaatioita ei voida jakaa kiinteiden verteksi- ja fragmenttoprosessoreiden kesken. Erikoiskäskyt (SF - special function) voidaan kuitenkin suorittaa rinnakkain G71-grafiikkaprosessorissa perinteisten verteksi- ja fragmenttokäskyjen kanssa, mikä parantaa monimutkaisten käskyjen ja operaatioiden hyötysuhdetta niitä käytettäessä.

Seuraavaksi esimerkki kuinka G80-grafiikkaprosessorin Unified Shader-arkkitehtuuri toimii samanlaisessa ympäristöissä. Ensimmäinen esimerkki on verteksi- ja geometriaintensiivisestä ympäristöstä ja toinen on pikseli-intensiivisestä ympäristöstä. Mukaan on lisätty myös Triagle Setup-vaihe, missä muodostetaan laskettavat primitiivit.





Unified Shader-arkkitehtuurin ansiosta G80-grafiikkaprosessori pystyy tasapainottamaan ohjelmien kuormaa tehokkaasti suoritusyksiköiden kesken. Kun verteksiohjelmien tarve on vähäinen, voi G80-grafiikkaprosessori siirtää hyötysuhdetta pikseliohjelmiin tai toisiin operaatioihin. Kun kaikenlaisia ohjelmia käytetään yhtäaikaa tai niiden määrä nousee, kuorma tasapainottuu kaikkien ohjelmien kesken. Primitiivien muodostaminen perinteisten verteksi- ja pikseliohjelmien rinnalla nostaa suoritusyksiköiden hyötysuhdetta ja tehokkuutta.

Sivulla 3 käsitellään tarkemmin NVIDIA:n G80-grafiikkaprosessorin Unified Shader-arkkitehtuuria ja sen ominaisuuksia. Mukana on myös viitteitä ATI:n Xenos-grafiikkaprosessorin (R500) Unified Shader-arkkitehtuurista.

DirectX 10, Direct3D ja SM4.0-ominaisuudet

Microsoftin kehittämä DirectX-ympäristö ohjelmistoille ja laitteistoille on kehittynyt versioon 10. DirectX 10 sisältää paljon uusia ja päivitettyjä peli- ja multimediaominaisuuksia kuluttajille sekä monipuolisemman ympäristön ohjelmistokehittelijöille kuin aikaisemmat DirectX-versiot. Microsoftin mukaan ensimmäiset DirectX 10-ympäristöä hyödyntävät pelit ja ohjelmistot julkaistaan kevään 2007 aikana. Kattavalta ohjelmistolistalta löytyy esimerkiksi Suomalaisen Remedy-peliyrityksen kehittämä ja Microsoftin Game Studiosin lanseeraama Alan Wake-peli. Uudistetun kehitysalustan takia päivitetyt DirectX 10-ominaisuudet ovat yhteensopivia ainoastaan vain Microsoftin Vistan kanssa ja ne eivät toimi vanhemmissa Windows XP/2000-ympäristöissä. Microsoft julkaisee Vistan ja DirectX 10:n tammikuun lopulla.

DirectX-ympäristö muodostuu niin sanotuista rajapinnoista, joita ovat Direct3D (3D-grafiikka), DirectDraw (2D-grafiikka), DirectInput (peliohjaimet), DirectSound (ääni), DirectPlay (verkko), DirectMusic (musiikki), DirectSetup (DirectX-asennus) ja DirectX Media Object (mediavirrat). Rajapintojen avulla pelien ja ohjelmistojen kehitys on huomattavasti helpompaa ja nopeampaa, kun käyttöjärjestelmä sisältää valmiit kirjastot sekä kutsut suoraan laitteistolle. Näytönohjaimien ohjelmistokehitystä varten Microsoft tarjoaa valmistajille Windows Vistan näyttöajurin mallin (WDDM - Windows Vista Display Drivers Model), joka sisältää Direct3D ja DirectDraw-rajapintoja varten erilaisia vaatimuksia.

DirectX 10:n yhtenäisempi ohjelmistoarkkitehtuuri (Unified Shader) tuo mukanaan paljon uudistuksia Direct3D-rajapinnan sisältämiin ominaisuuksiin ja vaatimuksiin. Microsoft on esimerkiksi parantanut sen suorituskykyä suunnittelemalla rajapinnan ohjelmistoarkkitehtuurin uusiksi ja lisäämällä ominaisuuksia, mitkä vähentävät huomattavasti prosessorin tarvetta, kun ohjelmat pystyvät lähettämään prosessit suoraan näytönohjaimelle. Prosessit ovat yleensä rajapinnan kutsuja tai kokonaisia liukuhihnan vaiheita kuten rasterointi tai kuvaruutupuskurin hallinta. Vaatimustasolla DirectX 10 poistaa niin sanotut "capsit" Direct3D-ympäristöstä, joiden avulla oli aikaisemmin mahdollista lisätä uusia ominaisuuksia ohjelmisto- ja laitteistotasolla. Microsoftin yhtenäisempi ohjelmistoarkkitehtuuri DirectX 10-ympäristössä ei vaadi Unified Shader-arkkitehtuurista tukea laitteistolta, mutta laitteistojen on kuitenkin tuettava kaikkia DirectX 10:n asettamia vaatimuksia ohjelmistotasolla.

Uusia Direct3D 10-rajapinnan ominaisuuksia ovat:


DirectX Shader Model DX8 SM1.0 DX9 SM2.0 DX9 SM3.0 DX10 SM4.0
Verteksikäskyjä
Vertex Instructions
128 256 512 65535
Pikselikäskyjä
Pixel Instructions
4 + 8 32 + 64 512 65535
Pysyviä verteksirekistereitä
Vertex Constants
96 256 256 16 x 4096
Pysyviä pikselirekistereitä
Pixel Constants
8 32 224 16 x 4096
Väliaikaisia verteksirekistereitä
Vertex Temps
16 16 16 4096
Väliaikaisia pikselirekistereitä
Pixel Temps
2 12 32 4096
Verteksin syöterekistereitä
Vertex Inputs
16 16 16 16
Pikselin syöterekistereitä
Pixel Inputs
4 + 2 8 + 2 10 32
Renderöintikohteita
Render Targets
1 4 4 8
Verteksitekstuureja
Vertex Textures
- - 4 128
Pikselitekstuureja
Pixel Textures
8 16 16 128
Tekstuurin enimmäiskoko
2D Tex Size
- - 2048 x 2048 8192 x 8192
Kokonaislukuoperaatiot
Int Ops
- - - Kyllä
Latausoperaatiot
Load Ops
- - - Kyllä
Johdannaiset käskyt
Derivatives
- - Kyllä Kyllä
Verteksin vuonohjaus
Vertex Flow Control
- staattinen staattinen
dynaaminen
dynaaminen
Pikselin vuonohjaus
Pixel Flow Control
- - staattinen
dynaaminen
dynaaminen
Geometriaohjelmat
Geometry Shaders
- - - Kyllä
HLSL-tuki
HLSL Support
- Kyllä (9) Kyllä (9) Kyllä (10)
Microsoftin ympäristö
Microsoft's platform
Windows 9x
Windows ME
Windows 2000
Windows XP Windows XP Vista