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

Frissítés & fontos: A Cudaram jelenleg nem működik. A kutya ott van elásva, hogy maga a projekt több, mint négy éve nem változott. Nem ígérek semmit, de ahogy időm engedi, megpróbálom fixálni.

Tegyük fel, hogy a gépedben egy viszonylag modern videoká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 programot 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 2 GB-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 dokumentumot, 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: csináljunk swapot 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ölthető az nVidia oldaláról (http://developer.nvidia.com/object/cuda_3_2_downloads.html), a Cudaram pedig a Githubró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 rootké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:

# 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 nincsenek, 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 swapnak, 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 250 MB-os állományt, amit másolgattam a ramdrive-ba.

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

# 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:

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:

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

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

# 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:

# 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 swapként formázzuk és csatoljuk, valahogy így:

# 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.

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