Jep. Összekaptam magam egy nehéz hét után, és legyűrve a lustaságot, nekiveselkedtem az új videókártyámat igazi programozóhoz méltó módon letesztelni.
A kártya egy AMD Ati HD4670, játékokat nagyon viszi, kicsit volt drágább húszezer forintnál.
Hozzávalók:
A hozzávalókat feltelepítjük. Az első probléma, hogy az AMD Stream kit egy korábbi studioexpresshez készült, ezért a programok egy részét újra kell fordítani. Ezt arról lehet felismerni, ha esetleg azt a hibát kapnád, miszerint
No appropriate map technique found
Ez tehát azért van, mert nem stimmelnek a futásidejű állományok a verziók között, ezen viszont segíthetsz néhány egyszerű lépésben
- Nyisd meg a "$(BROOKROOT)\platform\brook.sln" projectet
- Ha nem 32 bites rendszeren nyomod, javítsd ki a 'Project Properties' - 'Linker' - 'General' - 'Additional Library Directories' bejegyzést "$(CALROOT)\lib\LH64" vagy az egyéb platform nevére (kileshető a fájlnevekből)
- illetve a 'Build Events' - 'Post-Build Event' - 'Command Line to read' 'copy "$(TargetDir)\$(TargetFileName)" "$(BROOKROOT)\sdk\lib\" (Program Files (x86)' bejegyzés verziótól függően tartalmazhat szóközöket, ezek hibásak, törölni kell
- A "runtime" projectet fordítsd újra mind release mind debug módban. Ez a lényeg.
- Végül a megfelelő .lib fájlokat másold át a "$(BROOKROOT)\platform\runtime\lib\xp_x86_64" típusú helyről (itt a saját platformod van) a "$(BROOKROOT)\sdk\lib" könyvtárba
(köszönet ezért bizonyos foxx1337 fórumozónak)
No most már nagyon jó a helyzet, ugyanis ha bármelyik példaprogramot megnyitod a VS2008-ban, frankón lefordul és fut.
A példaprogramok között sokféle van, nekem Gigaflop hajhászáshoz elsőre legmegfelelőbbnek az optimized-matmult tűnt. Egy egy unrolled mátrixszorzás, ami a Gigaflopvadászok mindenkori kedvenc totemállata. Hát még GPU-n, ugyebár.
Nos, a program az alapbeállítások mellett a GPU csúfos vereségét hozza ki, na de az alapbeállítás egy 64x64 mátrix egyszeri szorzása. Ez olyan, mintha Concorde járattal mennék a sarki trafikba. Egy tisztességes GPU-nak való feladat ennél szebb, egyrészt a mátrix nagyobb, másrészt ismételjük meg a műveletet néhányszor. Ez utóbbi már fekszik a GPU-nak, arra találták ki, hogy csörgedezzenek az adatfolyamok. 1280x1280 mátrixnál (semmi extra hátsó szándék, csak megúntam a 128x128-at), 1000 iteráció még kivárhatóan lefutott, körülbelül egy percig tartott. Ez pedig 56 GigaFlop.
Ha esetleg volt sok pénzed nagyobb videókártyákra, esetleg 4870x2-re, a fentieket futtasd le te is, kíváncsi vagyok az eredményekre. Ha skálázható az eredmény, akkor a HD4670 320 kisprocija mellett a 4870x2 1600 kisprocika az 56 GigaFlopot arányosan 280 GigaFlopra nyomja fel. (sőt, erős a gyanúm ennek komoly túlteljesítésére a megnövelt memóriasebesség miatt) Az előző postban teraflopokat ígértem, de ez egy gyakorlati feladat, nem igazán reális ezt elérni.
Miért nem lehet elérni a maximális elméleti teljesítményt? Mert ahhoz az kéne, hogy minden matematikai művelet pontosan annyi ideig tartson, ameddig a következő művelethez szükséges memóriaműveletek, így a kisproci nem vár a memóriára. A mátrixszorzásban csak szorzás van, ez vélhetően hamarabb befejeződik, mint a memóriamozgatás. Emellett jelentős overhead a szálak szinkronizálása, és az adat elosztása, ezek skálázhatósági kérdések is.
Update: elérhető a 72 GigaFlop is ugyanezzel a programmal