reklama
Aktuality  |  Články  |  Recenze
Doporučení  |  Diskuze
Grafické karty a hry  |  Procesory
Storage a RAM
Monitory  |  Ostatní
Akumulátory, EV
Robotika, AI
Průzkum vesmíru
Digimanie  |  TV Freak  |  Svět mobilně

programování GPGPU

klouda (13)|21.6.2010 02:35
Našel by se někdo kdo by mi mohl poradit kudy vede cesta k řešení těchto příkladů popř. odkázat na nějaké specializované fórum zabývající se touto problematikou ? Něco málo vím o technologích CUDA, ATI Stream, OpenCL a DirectCompute ale netuším kterou technologii zvolit, pro efektivní řešení. Díky.

Pro vhodné paralelizovatelné numerické výpočty vytvořit program, který bude výpočty realizovat přes vícejádrový CPU a přes GPU a porovnat rychlosti výpočtů a vhodnost použití různých technologií. Analyzovat vliv frekvence GPU a počtu výpočtových jednotek.

Vytvořit aplikaci, která na základně vhodných numerických výpočtů bude umožňovat porovnání výpočtového výkonu různých grafických karet (benchmark). Aplikace vypíše také typ GPU, frekvenci a počet výpočtových jednotek.
Logout (4018)|21.6.2010 10:25
Na rootu vyšel článek s přímým návodem, jak udělat cuda aplikaci. Tak bych začal tím... Jinak v ČR nic moc, pro openCL a spol asi budeš muset do zahraničí
Dojigiri (1629)|21.6.2010 10:37
Asi před rokem jsem si s tím trochu hrál, konkrétně s CUDA ... jako, můžu říct, že na některý výpočty (tj. ty, který jsou podporovaný CUDA a zejména více současných výpočtů stejným algoritmem z různých dat), je to fakt masakr - co jsem si tak měřil na mojí zkušební aplikaci, výpočet za pomoci mojí GeForce 8800GTS cca 100x rychlejší než na mým 4-jádru Q6600. Je otázka, co už o tom víš a co vědět potřebuješ. Konkrétně s CUDA, nejlepší napsat si nějakej zkušební výpočet, přeložit nv compilátorem a prostě si to zkoušet, CUDA je poměrně dobře dokumentovaná.
S CUDA jsem pár problémů měl, nevím, jestli už jsou v současnosti vyřešený - např. schopnost počítat pouze v přesnosti float (ale někde jsem zahlíd, že to záleží na graf. kartě a že novější graf, karty už by měly umět počítat i v přesnosti double), nebo určitej limit na dobu provédění skriptu (něco kolem 10s - pokud mi výpočet trval dýl, nedoběhnul (skončil po těch cca 10s jakoby "ok", ale výstupní data nebyly spočítaný) a docela často i zaseknul grafickej driver, zkoušel jsem to na Linuxu ale na Windows byl údajně problém stejnej - v takovým případě bylo nutno výpočet rozdělit, ovšem to se blbě dělá když člověk neví dopředu jak dlouho to bude trvat).

Co se týká ATI, nevím, to si nemám kde zkusit :)

Jinak samozřejmě z hlediska obecnosti by bylo nejlepší používat OpenCL, kde by mělo být možný mít jeden zdroják a ten používat na všechny typy graf. karet který by byly podporovaný (nv, ati, larabee), ale nevím v jakým je to teď stavu jestli už je to v nějakým stádiu použitelnosti (naposled když jsem si o OpenCL něco hledal tak byla jenom nějaká úvodní specifikace ale podpora pro skutečný výpočty na graf. kartách zatím nebyla).
klouda (13)|21.6.2010 20:20
[quote=Dojigiri;383309]Asi před rokem jsem si s tím trochu hrál, konkrétně s CUDA ... jako, můžu říct, že na některý výpočty (tj. ty, který jsou podporovaný CUDA a zejména více současných výpočtů stejným algoritmem z různých dat), je to fakt masakr - co jsem si tak měřil na mojí zkušební aplikaci, výpočet za pomoci mojí GeForce 8800GTS cca 100x rychlejší než na mým 4-jádru Q6600. Je otázka, co už o tom víš a co vědět potřebuješ. Konkrétně s CUDA, nejlepší napsat si nějakej zkušební výpočet, přeložit nv compilátorem a prostě si to zkoušet, CUDA je poměrně dobře dokumentovaná.
S CUDA jsem pár problémů měl, nevím, jestli už jsou v současnosti vyřešený - např. schopnost počítat pouze v přesnosti float (ale někde jsem zahlíd, že to záleží na graf. kartě a že novější graf, karty už by měly umět počítat i v přesnosti double), nebo určitej limit na dobu provédění skriptu (něco kolem 10s - pokud mi výpočet trval dýl, nedoběhnul (skončil po těch cca 10s jakoby "ok", ale výstupní data nebyly spočítaný) a docela často i zaseknul grafickej driver, zkoušel jsem to na Linuxu ale na Windows byl údajně problém stejnej - v takovým případě bylo nutno výpočet rozdělit, ovšem to se blbě dělá když člověk neví dopředu jak dlouho to bude trvat).

Co se týká ATI, nevím, to si nemám kde zkusit :)

Jinak samozřejmě z hlediska obecnosti by bylo nejlepší používat OpenCL, kde by mělo být možný mít jeden zdroják a ten používat na všechny typy graf. karet který by byly podporovaný (nv, ati, larabee), ale nevím v jakým je to teď stavu jestli už je to v nějakým stádiu použitelnosti (naposled když jsem si o OpenCL něco hledal tak byla jenom nějaká úvodní specifikace ale podpora pro skutečný výpočty na graf. kartách zatím nebyla).[/quote]
Také bych se přikláněl k řešení pomocí OpenCL, existuje nějaké vývojové prostředí pro tuto technologii ve kterém by se daly tyto příklady naprogramovat? Nainstaloval jsem si OpenCLStudio, které po mě žádalo instalaci SDK a drivery pro moji grafickou kartu, jenže moje grafika není touto technologií podporována. Hledám spíše něco univerzálního, co by nebylo přímo závyslé na použitém grafickém akcelerátoru.
Logout (4018)|21.6.2010 23:06
Úplně univerzální není nic. CUDA poběží na většině NVidii, ale je závislá na architektuře a s nepříliš dobrou budoucností. OpenCL bude asi časem obecně přijmanej standard (implementuje ho Nvidia i ati) a měl by běžet na ledasčem (aspoň 1.0 na Ati a 1.1 na nvidiách - ale asi jen na nejnovějších generacích).
Co máš za GK?
klouda (13)|21.6.2010 23:32
desktop: grafika: ATI Radeon X1950 PRO (256MB)
procesor:Intel Core2 Duo E6750 2,66GHz

notebook: grafika: ATI mobility Radeon X700 (128 MB)
procesor: Mobile AMD Sempron LV, 1800 MHz (9 x 200) 3000+
Logout (4018)|21.6.2010 23:51
Hmm, tak bojim se, že na tědle kartách nerozjedeš nic. Ati stream 1.4 chce nejmíň 2xxx rodinu, 2.1 4xxx.
Bude to chtít upgrade. Pozor, pokud bys chtěl double precision, tak nejmíň x800 grafiku, kde x je 4 nebo 5.
klouda (13)|22.6.2010 16:53



Dojigiri (1629)|22.6.2010 17:31
Hmm na těchhle kartách by snad mohlo ject jedině ATI CTM (Close To Metal), přímo v něm se ale příliš snadno neprogramuje (taky jsem na to kdysi koukal, ale je spíš podobný assembleru, na rozdíl od ATI Stream a CUDA který jsou založený na C/C++).

Možná by to mohlo jít rozchodit s použitím BrookGPU překladače, ten má ale podporu CTM v alfa verzi, ale mohlo by to možná jít při použití DirectX nebo OpenGL backendu (http://graphics.stanford.edu/projects/brookgpu/start.html).
Logout (4018)|22.6.2010 20:09
IMHO ale evidentně to dělá jako semestrálku. V tu chvíli bych rozhodně doporučil dělat něco, co má smysl, a to je opencl nebo max cuda. Ty zbylý tehcnologie je myslím slepá větev (rozhodně CTM, brook moc neznam).
klouda (13)|23.6.2010 00:56
Týká se to školy, ale jak tedy na to ? Vím, že bych měl použít technologii OpenCL, bude vzhledem ke své univerzálnosti a možnostem asi nejvhodnějším řešením. Teď se ale naskýtá otázka řešení, nejprve je tedy potřeba mít nějaké vývovojé prostředí, které umožnuje práci s touto technologií. Byla mi doporučována implementace ATI Stream SDK(zatím nemám patřičný HW) a vývojové prostředí Visual Studio. Mohu tedy zatím pracovat na výpočtech jen za pomocí CPU, které je vzhledem k instrukční sadě SSE3 touto technologíí podporováno. Existuje nějaké API pro toto řešení, nebo jakým způsobem mám provázat VisualStudio s OpenCL ?
klouda (13)|23.6.2010 01:24
..a který procesor budu moci k výpočtům použít, SDK od ATi pravděpodobně nebude podporovat Core2Duo, To se budu muset obrazet spíše s pátráním u nVidie, pokud to dobře chápu ? Na Sempronu by jet možná mohlo...
Logout (4018)|23.6.2010 09:43
PRo OpenCL na CPU jde použít cokoli.

Osobně bych bejt tebou koupil nějakou levnou grafiku, co openCl používá. Na ty nejlevnější si vyděláš i za den v supermarketu.
Dojigiri (1629)|23.6.2010 09:45
To jo no, samozřejmě nejlepší by bylo začít rovnou s OpenCL který se jeví do budoucna jako nejperspektivnější.

Teď jsem koukal, že by na něm mohla ject i CPU emulace, s proc. AMD (příklad třeba zde http://www.khronos.org/message_boards/viewtopic.php?f=28&t=2425); ale na skutečný zkoušení by to pak chtělo mít odpovídající železo (tj. podporovanou grafickou kartu).
klouda (13)|23.6.2010 15:35
Doporučíte mi nějakou konkrétní graf. která by byla vhodná pro tento účel? zašel bych si pro ni.
Líbí se mi třeba Sapphire HD 5670 Ultimate, abych se vešel tak nějak do 3tisic. ;)
Logout (4018)|23.6.2010 17:09
Jestli chceš double precision, tak u Ati grafik X800 (kde X in {4,5}) - z toho pohledu by byla zajímavá 4850. Levný nvidie snad co vim double precision zvládaj, ale dosti pomalu, na výpočty jsou ale stejně považovaný za lepší než Ati. Ale to hlavně kvůli cudě.
klouda (13)|23.6.2010 22:03
to je hezké ale co to znamená v praxi? beru to tak že mi výsledek výpočtu vyjde o něco přesněji. Jde o to jak moc se liší výsledky zpracování na jednoduché a dvojité přesnosti. Která karta tedy zpracuje výsledek rychleji a která s přesnějším výsledkem? :oops:
Logout (4018)|24.6.2010 00:44
Jak se liší single a double precision? O 32bitů. Některý věci (fyzika) se v single precision nedaj počítat, některý daj.
Zbytek otázky moc nechápu, která karta? Spočítá co?
klouda (13)|24.6.2010 01:05
Má to vliv nějak na rychlost výpočtu nebo spíš jde o přesnost ?
Logout (4018)|24.6.2010 09:47
No double precision je dosti pomalejší, přestože jde o dvojnásobnou přesnost - tzn. se počítá s dvakrát tolik bitama - takže minimálně dvakrát.
Navíc grafiky maj většinou jen single precision jednotky, takže výsledek double precision
emulujou (např. spočítaj součet obou půlek a pak to daj nějak dohromady), takže v praxi je to často ještě horší, na prefermi nvidiích to bylo cca 8x pomalejší. Přesnost výpočtu je dvojnásobná, protože výsledek je v double precision a ne single precision.
Co vůbec znamená single a double precision si najdi na wikipedii.
Dojigiri (1629)|24.6.2010 15:36
Pokud by se double emulovalo, bylo by to ještě o hodně pomalejší (něco jsem o tom taky někde čet, že to nějak emulovat lze a výkon je pak opravdu hodně slabej proti single precision, ovšem nevím jak, když grafiky, který nepodporujou double, údajně vůbec double nepovolí a všechny double hodnoty automaticky bez upozornění konvertujou na float - tedy co se týká nvidie CUDA).

Nevím jak Fermi, ale zpomalení při double u grafik NVidia, který double podporujou (GTX260,280) je údajně daný spíš tím, že multiprocesor obsahuje 8 single-precision jednotek a pouze jednu double-precision, tj. proto jsou prý výpočty double precision cca 8x pomalejší než single precision (samotnej výpočet je zhruba stejně rychlej, akorátže se jich udělá za stejnou dobu 8x míň).

(https://www.cs.virginia.edu/~csadmin/wiki/index.php/CUDA_Support/Enabling_double-precision)
Logout (4018)|24.6.2010 16:12
Jo, omlouvám se, máš pravdu. Já si myslel, že to nvidia emuluje pomocí single precision (kdyby to emuloval shaderovej kód, tak by to bylo tak hrozný, ale kdyby ta emulace byla přímo v křemíku (podobně jako např. PIV emulovaly 64bit pomocí spojení 32bit jednotek), tak by výkon byl sice blbej, ale použitelnej.
Nicméně, není to tak a omlouvám se za mystifistifikaci.....
klouda (13)|25.6.2010 15:31
Když zapojím HD 5770 a 1950Pro do Crosfire budou vypočty probíhat rychleji nebo přesněji ?
faugusztin (453)|25.6.2010 17:07
Nijak, tie 2 karty do crossfire nezapojis.
klouda (13)|10.7.2010 13:13
graf. kartu už mám je to HD 5770, takže pro můj účel bude stačit. Teďka bych chtěl přejít k řešení toho programu. Jaký paralelní algoritmus zvolit pro srovnání rychlosti výpočtu CPU a GPU ?