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時間くらいで終わったので非常に簡単な印象.いつぞや先輩に聞いたときは開発環境を揃えるのがとても大変と聞いていたので,インストーラがかなり整備されてきたのだろう.また,先人がたくさんいるのでハマったらエラーメッセージで検索すれば解決方法が見つかると思う.さぁ,いろいろ試してみよう.
参考文献
はじめてのCUDAプログラミング―驚異の開発環境[GPU+CUDA]を使いこなす! (I・O BOOKS)
- 作者: 青木尊之,額田彰,第二I O編集部
- 出版社/メーカー: 工学社
- 発売日: 2009/11
- メディア: 単行本
- 購入: 11人 クリック: 310回
- この商品を含むブログ (29件) を見る