cuda 6.0をubuntu serverに導入する
昔使ってたワークステーションにXPが載ってたんですが、サポートも切れたし…ということで最近ubuntu serverに変更しました。
そのワークステーションには古いグラボが載ってて学生の頃にはcudaで遊んでたので、また遊べるようにセットアップしてみます。
cuda 6.0を選択したのは、詳しくないけど、どうせなら新しいものをということで。unified memoryなのも便利そうだし。
環境
- OS: ubuntu server 13.10
- GPU: Leadtek WinFast PX8600 GT (GeForce 8600GT)
- CUDA 6.0.26 RC
手順
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