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