Képjavítási lehetőségek az MPC-HC-ben

Avagy shaderek használata és a tapasztalatok

Shader - nagy vonalakban

Shader - nagy vonalakban

A shaderek (magyarul: árnyalók) speciális számolóegységek a videokártyákon. Olyan instrukciók, amelyek a megjelenítés bizonyos effektjeit, az objektumra eső árnyékokat, vagyis a színeket számolják. Innen ered a neve is. Praktikusan a GPU megjelenítő pipeline-jának programozására használhatóak, egyedi hatásokkal bővítve működését.

Programozására a GLSL (OpenGL Shading Language), illetve a Direct3D API-ra alapozó HLSL (High Level Shading Language) használható. A GLSL első sorban a platformfüggetlenségre törekszik, a HLSL viszont a Microsoft fejlesztése és szinte együtt fejődik az nVidia Cg nyelvével.

A programozás mögött nem kell valami ördögi dologra gondolni. A HLSL egyik nagy előnye például, hogy a Microsoft a DirectX-hez hasonlóvá tette a fejlesztést, így aki ismeri a DirectX programozásra is használatos C nyelvet, ismeri a shaderek programozásának a nyelvét is (nagyjából).

A már említett GPGPU technika ötlete hívta életre a "kivülről is programozható GPU" megalkotását, illetve a programozható shaderek kidolgozását. Ma már univerzális shaderekkel találkozhatunk, vagyis unified shaderekkel, de régebben külön volt a vertex, a pixel és később a geometry shader egység és külön futószalagokat, időzítőket is használtak a gyártók. Az összevonásnak a legfőbb oka a teljesítmény jobb kihasználása volt. Az eredmény egy általános számoló egység lett, amely mindhárom műveletre kiosztható. A DirectX 10 megjelenése hozta a geometry shadereket, illetve a vele megjelenő Shader Model 4 általánosította a pixel, vertex, geometry shaderek specifikációját, így még könnyebbé vált a programozásuk.

Ahogy látható, sokkal hatékonyabb összevonni a különböző shadereket a kihasználtság szempontjából
/forrás: mips.com/

Kezdetben az ATI használta az összevont egységeket, de ők is főleg az Xbox-ban tesztelték. Az nVidia tiltakozott az egész koncepció ellen, de aztán végül ők mutatták be elsőként a G80 újdonságaként a unified shader modellt és nem sokra rá az R600-ban is megjelent az ATI részéről a PC-s vonalon.

Unified shader egységek tömörülnek össze a stream processzorokban, amelyeknek egyetlen feladata, hogy a bemenő adatfolyamon egy előre meghatározott műveletet végezzenek el, majd a kimenetre tegyék a módosított adatfolyamot - tulajdonképpen különálló ALU-k. Ezekből a shadereket 16-os blokkokba szerveződő stream processzorokból több százat is implementálnak egy-egy modern grafikus kártyára. Az egyszerű műveletek és a gyors végrehajtás, valamint a nagy számuk miatt elég jelentős számítási teljesítmény rejlik bennük, amire szükség is lehet, hiszen egy teljes képernyős kép több millió pixelt is tartalmazhat.

A kiszámolt hatásokat (effektek), mint antialiasing, HDR, multisampling végül a ROP (Raster Operations Pipeline) egységek teszik láthatóvá a puffereken keresztül, így ezek száma sem elhanyagolható.

Dióhéjban összefoglalva
/forás: Multimedia VLSI Lab/

CUDA és a shaderek

Kapcsolódik a témához, így érdemes megemlíteni, hogy az nVidia már jó ideje alkalmazza az úgynevezett CUDA (Compute Unified Device Architecture) egységeit, amely a unified shaderekre épül. Persze azért kicsit más, mint a shaderek. A shaderek alapvetően minden pixelt diszkretizálnak (raszterizálnak), vagyis minden pixel elindít egy shadert (programot). A CUDA ezzel szemben a többszálú programozáshoz nagyon hasonló elven működik. Több szálat indíthatunk és ezek a szálak több pixelt is kezelhetnek egyszerre. A shaderek viszont gyors upsampling és downsampling műveletekre is képesek, amire a CUDA nem.

Mivel külső programozási nyelvekkel (pl.: C) általános feladatokra is programozhatóak és így masszívan párhuzamosítható, többszálas műveletek számításait is ki lehet osztani ezeknek az egységeknek, amelyek messze leköröznek egy hagyományos processzort. Érdekes, hogy jelenleg a CUDA előrébb tart a fejlődésben, mint az ATI, holott először elvetették még az ötletét is a unified shadereknek, így még SDK-t is az ATI adott ki először (2006 nyarán, Stream néven), amit végül ATI Streamnek neveztek el. A CUDA népszerűsége kétségtelen, de hátránya, hogy csak nVidia kártyákon használhatóak, míg az ATI törekvése egy általános megoldás szállítása.

Shaderek és a videózás

Mivel a stream processzorok általános célokat szolgálnak, befoghatóak multimédiás célokra, akár videofolyamok dekódolásának bizonyos részfolyamataiba is. (Ezt használja ki elég jól a CUDA a DXVA API-n keresztül nem dekódolható HD filmek GPU általi dekódolásában is.) Egy-egy keret dekódolása után úgynevezett post process műveletek végezhetőek még el a képen a shaderek segítségével az eredmény javítására. Tipikusan ilyenek a szűrők alkalmazása, a képjavító eljárások, színkorrekció (színtérváltás). Ezek némelyike igencsak számításigényes feladat és a kevés shader egységet tartalmazó, alsóbb kategóriás grafikus kártyák ilyenkor rendesen meg is szenvedhetnek a műveletek elvégzésével, nem beszélve a szoftveres optimalizáltság fontosságáról. Mivel a shader utasítások nem több ezer soros programkódok, oda kell figyelni - a teljesítmény fokozása érdekében - egy hatékony kód írására.

És itt érkeztünk el a történetben az MPC-HC shader opciójához... A műveletekhez legalább egy Shader Model 2.0 verziót ismerő DirectX 9-es VGA szükséges. Ez a modell tartalmazza azokat az alapvető utasításokat, amelyeket végre tud hajtani egy-egy stream processzor.

A cikk még nem ért véget, kérlek, lapozz!

Előzmények