Hogy a cuda-ba használjuk ki a VGA memóriáját?


Tegyük fel, hogy a gépedben egy viszonylag modern videókártya foglal helyet, amit csak szabadidődben használsz, munka közben csak a Compiz piszkálgatja, amúgy unatkozik. Fogjuk munkára az unatkozó VGA memóriát és gyorsítsuk a rendszerünk!

Memóriából sosem elég, már csak a file cache miatt sem. Van aki a szabad memória kapacitását egyszerűen befogja SSD-nek és azon dolgozik, van aki /tmp-nek csatolja és van aki progamot fordít benne (mondjuk ~7+GB-nyi LibreOffice mókás :)). A lényeg, hogy sosem elég.

Én, személy szerint van amikor csúnyán kifutok a 2GB-os keretből. Egy kis alkalmazás itt, egy virtuális gép ott, Firefox sok példányban sok tabbal, Clementine, Dropbox, Skype, közben Thunderbird csekkolja a leveleimet és ha épp kapok egy documentumot már indul is a LibreOffice, mindezt 8 virtuális desktopra szétdobva. Nem is csoda, hogy kifutok a memóriából, aztán várhatok míg a lassú merevlemez swappol..

Részemről a plusz memória kihasználása mint lapozóterület a legoptimálisabb, tehát a feladat: csinljunk swap-ot a szabad VGA memóriából!

Összetevők:
- Futtatott kernel forrása.
- nVidia driver 260.19.21-es vagy magasabb verziószámmal. Nem nouveau!
- CUDA egységgel rendelkező nVidia VGA.
- Gcc, automake, autoconf
- Cuda Toolkit.
- Cudaram.

A Cuda Toolkit letölhető az nVidia oldaláról ( http://developer.nvidia.com/object/cuda_3_2_downloads.html), a Cudaram pedig a github-ról ( https://github.com/peper/cudaram ) szerezhető be, a többit a saját Linux disztribúciód szállítja.

A Cuda Toolkit telepítése egy egyszerű next-next-finish után kész is van.

A Cudaram telepítése sem sokkal bonyolultabb. Minden műveletet természetesen továbbra is root-ként csinálunk.

0. Rand() a lelke mindennek, szóval dolgozzunk a /usr/src-be:
# cd /usr/src/

1. Klónozzuk le a Git repóból a forrást:
# git clone git://github.com/peper/cudaram.git

2. Futtassuk le a bootstrap-et:

1
2
# cd cudaram
# ./bootsteap

3. Konfiguráljuk a forrást, pl.:
# ./configure --with-kernel=/usr/src/linux-2.6.36-gentoo-r5/ --with-cuda=/opt/cuda/

4. Fordítsuk le:
# make

5. Telepítsük:
# make install

6. Töltsük be a kernel modult:
# modprobe cudaram

7. Elvileg létrejött a /dev alatt 4 node cudaram0, cudaram1 és cudaramctl0, cudaramctl1 néven. Ha nincsennek, néz dmesg-et, valami gond lehet.

8. Csekkoljuk le, mennyi memória van a VGA-nkon. Legegyszerűbben az nvidia-settings-ben lehet megnézni. az lshw és lspci nem feltétlen ad hasznos választ.

9. Indítsuk el, a cudaram modult vezérlő userspace programot:
A "0" a /dev alatti node száma, a 400 pedig a foglalandó memória mérete.
# ./cudaramd/cudaramd 0 400

Ha "[ERR] Allocating cuda data failed" üzenettel találkozol, semmi baj, csak túl sok memóriát akartál elvenni a VGA-tól. Csökkentsd a méretet.

Mielőtt befognánk swap-nak, nézzük meg mekkora adatátviteli sebességet tud a rendszermemóriához képest. Én a /dev/urandom és dd segítségével csináltam egy 250MB-os állományt, amit másolgattam a ramdrive-ban.

10. Készítsük el a teszt állományt.

1
2
3
4
# dd if=/dev/urandom of=/ramdrive/test.iso bs=$((1000*1000)) count=250 conv=fdatasync
250+0 records in
250+0 records out
250000000 bytes (250 MB) copied, 33.8635 s, 7.4 MB/s

11. Memória -> Memória sebesség:

1
2
3
4
dd if=/ramdrive/test.iso of=/ramdrive/test2.iso bs=$((1000*1000)) count=250 conv=fdatasync
250+0 records in
250+0 records out
250000000 bytes (250 MB) copied, 0.343233 s, 728 MB/s

12. Formázzuk meg ext2-vel az új "partíciónkat". Úgy viselkedik mint bármilyen más blokk eszköz:
# mkfs.ext2 /dev/cudaram0

13. Csatoljuk:

1
2
# mkdir /mnt/cudaswap
# mount /dev/cudaram0 /mnt/cudaswap/

14. Másoljuk át rá a teszt adatokat:

1
2
3
4
# dd if=/ramdrive/test.iso of=/mnt/cudaswap/test.iso bs=$((1000*1000)) count=250 conv=fdatasync
250+0 records in
250+0 records out
250000000 bytes (250 MB) copied, 0.599043 s, 417 MB/s

Kb. fele olyan gyors mint a rendszer RAM és a PCIE 2-es szabványtól 83MB/s-el (500MB/s) le van maradva.

15. Hasonlítsuk össze a rendszerlemezzel:

1
2
3
4
# dd if=/ramdrive/test.iso of=/root/test.iso bs=$((1000*1000)) count=250 conv=fdatasync
250+0 records in
250+0 records out
250000000 bytes (250 MB) copied, 5.17288 s, 48.3 MB/s

Tehát, a fájlrendszer elérését ~8,6x-osára gyorsítottuk. Ha figyelembe vesszük, hogy esetleg "dugó" lehet az északi hídnál, akkor is legalább 8x gyorsabb elérése számíthatunk, mint a merevlemez esetén.

Az automatikus indításhoz berakjuk a kernel modul nevét (cudaram) a /etc/modules.autoload.d/kernel-2.6 állományba és csinálunk egy egyszerű init scriptet ami elindítja a cudaramd-ot a megfelelő paraméterekkel és a fenti műveletet (formázás, csatolás) megcsinálja.

Párhuzamosan is lehet használni a régi és új swap partíciókat. Egyszerűen csak az /dev/cudaram0 -t swap-ként formázzuk és csatoljuk, valahogy így:

1
2
# mkswap /dev/cudaram0
# swapon /dev/cudaram0 -p 0

A -p paraméterrel be lehet állítani az előnyben részesítendő swap partíciót. minél nagyobb, annál hangsúlyosabban lesz használva.

1
2
3
4
 swapon -s
Filename                                Type            Size    Used    Priority
/dev/cudaram0                           partition       368636  0       0
/dev/sda9                               partition       4691964 0       -1

CUDA

Tisztelt Szerző!

Ha van hasonló írásod a CUDA magok kihasználásáról linux alatt akkor én azt szívesen olvasnám.
pl.: videókonvertálás, videónézés (FULL HD), programok gyorsítása, stb..

Előre is köszönöm.

Még nincs.

Még nincs tapasztalatom a CUDA ilyen irányú kihasználásáról, de megnézem majd mit tudok erről találni.

Egy kis frissítés. Gondolom

Egy kis frissítés.

Gondolom egyértelmű, hogy a videók dekódolásában sokat segít a VGA. Azonban most találtam egy cikket a hoc.hu oldalon, ahol VGA-val is kódolnak (sajnos fizetős, Windows-ra írt programokkal). http://hoc.hu/index.php?option=com_easyblog&view=entry&id=12&Itemid=396

Érdemes elolvasni az utána következő cikket is, amiben leírja, hogy nem minden a sebesség.

eszed van

de pénzed még 2-4 giga RAM-ra nincs?

adjak??? :D

amúgy le a kalappal, a cikk nagyon tetszett!

32GB-ra gyűjtök...

... ami persze nem igaz, de nem is ez a cikk lényege :)

Örülök hogy tetszett :)