installing CUDA into 32-bit Linux-box
GPGPUセミナーの感想もまだ書いてなくて順番後先なんだけれど、CUDAのインストール備忘録。
怖いのは32-bit環境と gcc-4.4と SELinuxの呪い。64-bit(実はLinuxインストール時に拾ってくるものを間違えた), gccを古いのにしておけば問題ない。
はじめからちゃんとしていたら知り得なかった情報でラッキーと思いたいけど、余計なツマヅキをしただけのような気もしなくもない。
普通に拾ってくる
CUDA zoneから Driver, Toolkit, SDKの3セットをもらってくる。
http://www.nvidia.com/object/cuda_get.html
これはまあ拾ってくるだけ。
実行する
NVidia系統の伝統に則って、アーカイブがシェルスクリプトになっているのでrootで実行する。
この際、当たり前ながら X が走っていると書き換えできないので マルチユーザCUIモードに移行しておく。
$ sudo telinit 3
あとkernel-develとgcc, gcc-c++あたりを入れておくべし。 更にSDKをコンパイルするなら freeglut-devel, libXi-devel, libXmu-develも入れておくよろし。
$ sudo sh cudadriver_2.3_linux_32_190.18.run
実行するとメニューベースで説明が出るのでそれに従ってインストール。結構簡単に終わる。
32-bitの呪い
と喜び勇んでXを立ち上げるとなぞのエラーがでる。
(EE) Sep 25 19:11:46 NVIDIA(0): Failed to initialize the NVIDIA graphics device PCI:1:0:0. (EE) Sep 25 19:11:46 NVIDIA(0): Please check your system's kernel log for additional error (EE) Sep 25 19:11:46 NVIDIA(0): messages and refer to Chapter 8: Common Problems in the (EE) Sep 25 19:11:46 NVIDIA(0): README for additional information. (EE) Sep 25 19:11:46 NVIDIA(0): Failed to initialize the NVIDIA graphics device!
なーんのこっちゃなんのこっちゃ、と悩んでいたら messagesに
octopus kernel: vmap allocation for size 16781312 failed: use vmalloc=<size> to increase size.
なんだ、そんだけのことか。というわけで grub.confに vmalloc=256Mとかした。これは64bitであれば出ない問題。
ツール, SDKを入れる
Toolkitのシェルスクリプトを実行する。
$ sudo sh cudatoolkit_2.3_linux_32_fedora10.run
SDKはユーザ権限でOK。インストール先とかtoolkitのパスとか聞かれるので答えると指定したディレクトリにユーザー権限で書き込まれる
$ sh cudasdk_2.3_linux.run
これで準備は完了。
コンパイル始める。。。その前に
LD_LIBRARY_PATHとPATHを設定したのち、おもむろに NVIDIA_GPU_Computing_SDK/C/の下で make ---といきたいところだけれど、gcc-4.4の問題でそのままだとinline関数のweakチェックで落ちる。-fno-inlineを指定する必要あり。common/common.mkの NVCCFLAGSに --compiler-option -fno-inlineを追加した後 C/のディレクトリの下に戻って make。
全部できる(筈)。
SELinuxに阻止られる
C/bin/ の下にバイナリが出来上がるので、意気揚々と実行しようとすると SELinuxにひったくられてエラー。なんとまあ。
octopus setroubleshoot: SELinux is preventing deviceQuery from loading /usr/local/cuda/lib/libcudart.so.2.3 which requires text relocation. For complete SELinux messages. run sealert -l 2dce73e5-0a92-4950-86c4-0f6290105ae4
面倒だったので、 chconでsystem_uであるべき libcudart.so.2.3をunconfined_uに強制的に変えて(ダメだよ!^^;)実行。とりあえず動く事を確認した。
$ sudo chcon --reference=deviceQuery /usr/local/cuda/lib/libcudart.so.2.3
おけーおけー
#じゃないって
しゃあないSELinuxもぼちぼち勉強しておこう。
まあ動く事を確認。
threadIdxとblockIdxを使って少し遊んでみて上手く動く事も確認。
おkーだが。
ちょっと悲しい
そうか。
CUDA Device Query (Runtime API) version (CUDART static linking) There is 1 device supporting CUDA Device 0: "GeForce 9600 GT" CUDA Driver Version: 2.30 CUDA Runtime Version: 2.30 CUDA Capability Major revision number: 1 CUDA Capability Minor revision number: 1 Total amount of global memory: 536150016 bytes Number of multiprocessors: 8 Number of cores: 64 Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 16384 bytes Total number of registers available per block: 8192 Warp size: 32 Maximum number of threads per block: 512 Maximum sizes of each dimension of a block: 512 x 512 x 64 Maximum sizes of each dimension of a grid: 65535 x 65535 x 1 Maximum memory pitch: 262144 bytes Texture alignment: 256 bytes Clock rate: 1.60 GHz Concurrent copy and execution: Yes Run time limit on kernels: Yes Integrated: No Support host page-locked memory mapping: No Compute mode: Default (multiple host threads can use this device simultaneously) Test PASSED
host page-locked memory mapping非対応なのか。あそべん。
コアが少ないことや周波数が遅い分には問題ないんだけれど、フィーチャーが少ないのは(勉強的な意味で)問題だなあ。
GTX買うかな。という訳にもいかんか。。。
#いやエミュレートすればいいじゃんとか言うのはナシでw