CUDA4.0をDebian Linuxにインストールしてみた

GPGPUには興味があったものの,なかなか機会がなかったのだけれど,土曜日ひさびさに午前中に目が覚めたので自宅マシンにCUDAをインストールすることにした.既にウェブ上情報が豊富にあるものの,いくつかハマったのでインストール作業をメモ.

マシンのOS

CUDAの開発環境には,以下の3つが必要らしい.それぞれをnVIDIAのウェブページからダウンロードする.CUDAツールキットはDebian用がなかったのでUbuntuを選択.それぞれカッコ内は自分の環境用に選択したインストーラ

  • CUDAドライバ (devdriver_4.0_linux_64_270.41.19.run)
  • CUDAツールキット (cudatoolkit_4.0.17_linux_64_ubuntu10.10.run)
  • CUDA SDK (gpucomputingsdk_4.0.17_linux.run)

それぞれを上記の順番にインストール.

ドライバを入れる前にXを落としておく.

# service gdm stop

ドライバを入れる際にカーネルツリーがどーのこーのと怒られてしまったので,linux-headersをaptで入れる.

# aptitude install linux-headers-2.6.32-5-amd64

これで後はインストーラを使ってインストール.

# sh devdriver_4.0_linux_64_270.41.19.run

基本的にYESマン.すべての選択肢にYESと答える.カーネルコンパイルしたgccとバージョン違うよ,いいの? というようなことを聞かれるが,NOを選択すると無視して進めることができた.無事にインストール終了.

ここでXを上げてよいらしい

# service gdm start

つづいてツールキットのインストール.

# sh cudatoolkit_4.0.17_linux_64_ubuntu10.10.run

インストール場所を聞かれるが,デフォルト設定の /usr/local/cuda をそのまま利用.こちらは問題なく終了.


忘れないうちにライブラリパスを追加しておく.64bit OSの場合は/usr/local/cuda/lib64にパスを張ればよいみたい.LD_LIBRARY_PATH環境変数に追加してもよい.

# vi /etc/ld.conf.d/cuda.conf
/usr/local/cuda/lib64

# ldconfig

nvccコンパイラも /usr/local/cuda/bin 以下にあるので,こちらはユーザの$PATH環境変数なんかに入れておくと便利.


最後にCUDA SDKをインストールする.これはどうやらユーザのホームディレクトリにインストールするらしいので,一般ユーザでインストールスクリプトを実行

% sh gpucomputingsdk_4.0.17_linux.run

インストール場所が聞かれるが,デフォルトの~/NVIDIA_GPU_Computing_SDK を選択.


ライブラリは自分の環境でコンパイルしなければいけないらしいので,~/NVIDIA_GPU_Computing_SDK/C/src に移動してmakeコマンドを実行

% cd ~/NVIDIA_GPU_Computing_SDK/C/src
% make
...
/usr/bin/ld: cannot find -lGLU
collect2: ld returned 1 exit status
make[1]: *** [../../bin/linux/release/marchingCubes] エラー 1
make[1]: ディレクトリ `/home/suhara/NVIDIA_GPU_Computing_SDK/C/src/marchingCubes' から出ます
make: *** [src/marchingCubes/Makefile.ph_build] エラー 2

怒られてしまった.どうやら,環境によってコンパイルに失敗するのもあるけれど,気にしなくてよいみたいなので-iオプションを使って無視.

% make -i


~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release/ 以下にいろいろ実行ファイルができている.この中でdeviceQueryを使うと,自分のGPUバイスの情報を得ることができる.

% ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release/deviceQuery
[deviceQuery] starting...
bin/linux/release/deviceQuery Starting...

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

Found 1 CUDA Capable device(s)

Device 0: "GeForce GTX 460"
  CUDA Driver Version / Runtime Version          4.0 / 4.0
  CUDA Capability Major/Minor version number:    2.1
  Total amount of global memory:                 1023 MBytes (1072889856 bytes)
  ( 7) Multiprocessors x (48) CUDA Cores/MP:     336 CUDA Cores
  GPU Clock Speed:                               1.35 GHz
  Memory Clock rate:                             1800.00 Mhz
  Memory Bus Width:                              256-bit
  L2 Cache Size:                                 524288 bytes
  Max Texture Dimension Size (x,y,z)             1D=(65536), 2D=(65536,65535), 3D=(2048,2048,2048)
  Max Layered Texture Size (dim) x layers        1D=(16384) x 2048, 2D=(16384,16384) x 2048
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 32768
  Warp size:                                     32
  Maximum number of threads per block:           1024
  Maximum sizes of each dimension of a block:    1024 x 1024 x 64
  Maximum sizes of each dimension of a grid:     65535 x 65535 x 65535
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and execution:                 Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Concurrent kernel execution:                   Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support enabled:                No
  Device is using TCC driver mode:               No
  Device supports Unified Addressing (UVA):      Yes
  Device PCI Bus ID / PCI location ID:           2 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 4.0, CUDA Runtime Version = 4.0, NumDevs = 1, Device = GeForce GTX 460
[deviceQuery] test results...
PASSED

Press ENTER to exit...

さて,インストールは大体終わったのでサンプルプログラムを書いてコンパイルしてみる.CUDAプログラミングが何もわかっていないので,とりあえず最小単位のコードを書いてみた.

#include <stdio.h>
#include <cutil.h>

int main( int argc, char** argv )
{
  CUT_DEVICE_INIT(argc, argv);
  CUT_EXIT(argc, argv);
  return 0;
}

さてこれをコンパイルしてみる.

% nvcc prac.c
(たくさんエラー)

ここでしばらくはまった.「どうやらnvccコンパイラに拡張子が.cuである必要があるらしい」そんなん知らんがな.

% mv prac.c prac.cu
% nvcc prac.cu

それでもエラーが出る.cutilライブラリを-lで指定しなければいけないみたい.

% nvcc -lcutil prac.cu
/usr/bin/ld: cannot find -lcutil
collect2: ld returned 1 exit status

あれー,見つからないぞ.どうやら,さきほど~/NVIDIA_GPU_Computing_SDK/C/lib 以下にできたライブラリにパスを通さなければいけないらしい.

こいつら.

% ls ~/NVIDIA_GPU_Computing_SDK/C/lib
libcutil_x86_64.a  libparamgl_x86_64.a  librendercheckgl_x86_64.a

さて,ld.so.confに書いたり,ライブラリを/usr/local/libなどにコピーする方法もあるのだけれど,nvccのデフォルトオプション設定を指定すれば解決する.CUDA依存の話なので,今回はこの方法で解決することにする.(参考: http://d.hatena.ne.jp/flick-flick/20101226)

# vi /usr/local/cuda/bin/nvcc.profile

TOP              = $(_HERE_)/..
HOME             = <%%PATH_TO_HOME%%>/NVIDIA_GPU_Computing_SDK

LD_LIBRARY_PATH += $(TOP)/lib:$(TOP)/extools/lib:
PATH            += $(TOP)/open64/bin:$(_HERE_):

INCLUDES        +=  "-I$(TOP)/include" "-I$(TOP)/include/cudart" $(_SPACE_) "-I$(HOME)/C/common/inc"

LIBRARIES        =+ $(_SPACE_) "-L$(HOME)/C/lib" "-L$(TOP)/lib$(_TARGET_SIZE_)" -lcudart

CUDAFE_FLAGS    +=
OPENCC_FLAGS    +=
PTXAS_FLAGS     +=

おっしゃ,これで解決,と思ったらまだ見つからない,と怒られる.どうやら,いつの間にかライブラリ名に_x86_64とかついているので,そこまでつけてあげるとコンパイルがとおる.

% nvcc -lcutil_x86_64 prac.cu
% ./a.out
Using device 0: GeForce GTX 460

Press ENTER to exit...

ここまで長かった...


さて,いちいち_x86_64とつけるのは面倒くさいので,シンボリックリンクをつくっておく

% cd ~/NVIDIA_GPU_Computing_SDK/C/lib
% ln -s libcutil_x86_64.a libcutil.a


これで-lcutilでライブラリパスが通るようになる.

% nvcc -lcutil prac.cu

ふぅ,ようやく開発環境が整った.

というわけでインストールとコンパイルの確認まで終了.ハマった時間含めても設定に1-2時間くらいで終わったので非常に簡単な印象.いつぞや先輩に聞いたときは開発環境を揃えるのがとても大変と聞いていたので,インストーラがかなり整備されてきたのだろう.また,先人がたくさんいるのでハマったらエラーメッセージで検索すれば解決方法が見つかると思う.さぁ,いろいろ試してみよう.

参考文献