cuda 6.0をubuntu serverに導入する

昔使ってたワークステーションにXPが載ってたんですが、サポートも切れたし…ということで最近ubuntu serverに変更しました。

そのワークステーションには古いグラボが載ってて学生の頃にはcudaで遊んでたので、また遊べるようにセットアップしてみます。

cuda 6.0を選択したのは、詳しくないけど、どうせなら新しいものをということで。unified memoryなのも便利そうだし。

環境

手順

Xの停止

自分の環境ではubuntu-desktopパッケージを入れているので、まずXを止める。Xのサーバが立ってない環境では不要なはず。

sudo service lightdm stop

cuda toolkitのインストール

次にcuda toolkitを入れる。現時点でcuda 6.0はRC。

wget http://developer.download.nvidia.com/compute/cuda/6_0/rc/installers/cuda_6.0.26_rc_linux64.run
chmod 755 cuda_6.0.26_rc_linux64.run

sudo ./cuda_6.0.26_rc_linux64.run -silent -driver # ドライバのインストール
sudo ./cuda_6.0.26_rc_linux64.run # 利用許諾の同意やサンプルの導入など

.zshrc.bashrcに各種バイナリへのパスを通す。

# .zshrc

export PATH includes="/usr/local/cuda-6.0/bin"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda-6.0/lib64"

サンプルの実行(1)

これでサンプルなども含めて一式が入ったのでサンプルをビルドしてみる。

sudo aptitude install g++

cd ~/NVIDIA_CUDA-6.0_Samples
make

さっそく実行!と思ってサンプルをいくつか実行してみるも、自分の環境では以下のようなエラーが出てしまった(サンプルによって出力はことなるが、エラーコードが35)。

cudaGetDeviceCount returned 35

nvidiaドライバのインストール 

これはデフォルトで使用されているnouveauというドライバが問題なようなので、nvidiaのドライバを入れる。以下のサイトから適切なドライバをダウンロードし、インストールする。

chmod 755 NVIDIA-Linux-x86_64-331.67.run
sudo ./NVIDIA-Linux-x86_64-331.67.run

しかし、nouveauドライバが有効になっている場合にはインストールに失敗する。 この場合には自動的に/etc/modprobe.d/nvidia-installer-disable-nouveau.confというファイルが作成され次回起動時からnouveauドライバを読み込まないようになるため、再起動する。

sudo reboot

再度ドライバのnvidiaドライバのインストール。

sudo ./NVIDIA-Linux-x86_64-331.67.run

Xの再開

冒頭でXを止めた場合は再開する。

sudo service lightdm start

サンプルの実行(2)

これでようやくサンプルを実行できる。

cd ~/NVIDIA_CUDA-6.0_Samples/bin/x86_64/linux/release
./deviseQuery

出力はこんな感じ。ちゃんとCUDA 6.0が入っていて、動いているのが確認できる。

./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "GeForce 8600 GT"
  CUDA Driver Version / Runtime Version          6.0 / 6.0
  CUDA Capability Major/Minor version number:    1.1
  Total amount of global memory:                 256 MBytes (268107776 bytes)
  ( 4) Multiprocessors, (  8) CUDA Cores/MP:     32 CUDA Cores
  GPU Clock rate:                                1188 MHz (1.19 GHz)
  Memory Clock rate:                             700 Mhz
  Memory Bus Width:                              128-bit
  Maximum Texture Dimension Size (x,y,z)         1D=(8192), 2D=(65536, 32768), 3D=(2048, 2048, 2048)
  Maximum Layered 1D Texture Size, (num) layers  1D=(8192), 512 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(8192, 8192), 512 layers
  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 multiprocessor:  768
  Maximum number of threads per block:           512
  Max dimension size of a thread block (x,y,z): (512, 512, 64)
  Max dimension size of a grid size    (x,y,z): (65535, 65535, 1)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             256 bytes
  Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
  Run time limit on kernels:                     No
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      No
  Device PCI Bus ID / PCI location ID:           1 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.0, CUDA Runtime Version = 6.0, NumDevs = 1, Device0 = GeForce 8600 GT
Result = PASS

ついでにcublasも試す。

./matrixMulCUBLAS

出力はこんな感じ。なんだか昔より速くなってる気がする(うろ覚え)。

[Matrix Multiply CUBLAS] - Starting...
GPU Device 0: "GeForce 8600 GT" with compute capability 1.1

MatrixA(160,320), MatrixB(160,320), MatrixC(160,320)
Computing result using CUBLAS...done.
Performance= 21.99 GFlop/s, Time= 0.745 msec, Size= 16384000 Ops
Computing result using host CPU...done.
Comparing CUBLAS Matrix Multiply with CPU results: PASS