CUDA 4.2 インストール ~ サンプルコード作成/実行
手持ちの MacBook に CUDA を入れてみる。動作環境は下の通り。
- MacBook (2GHz Intel Core 2 Duo)
- Mac OS X 10.7.4
- CUDA 4.2
- GeForce 9400M
CUDA 4.2 のインストール
NVIDIAのサイト(http://developer.nvidia.com/cuda-downloads) から必要な物をダウンロードする。
今回は, 以下のものをダウンロード & インストールした。
- CUDA Toolkit 4.2.9
- CUDA Drivers 4.2.10
- NVIDIA GPU Computing SDK 4.2.9
インストールを終えたら, つぎは PATH の設定を行う。
zsh を使ってるのであれば, .zshrc
に以下のような内容を追加すればよい.
# CUDA 設定
export PATH=/usr/local/cuda/bin:$PATH
export DYLD_LIBRARY_PATH=/usr/local/cuda/lib:$DYLD_LIBRARY_PATH
export C_INCLUDE_PATH="/Developer/GPU Computing/C/common/inc"
export CPLUS_INCLUDE_PATH="/Developer/GPU Computing/C/common/inc"
追加したら exec zsh
あたりで設定を反映。
正しく設定されていれば, 次のような結果になる。
% nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2012 NVIDIA Corporation
Built on Sat_Apr__7_14:56:41_PDT_2012
Cuda compilation tools, release 4.2, V0.2.1221
以上で CUDA の設定は終わり。
サンプルコードのコンパイル
SDK をインストールすると付いてくるサンプルコードをコンパイルして, CUDA の動作確認をする。
サンプルコードは /Developer/GPU Computing/C
にあるので,
% cd /Developer/GPU Computing/C
% make
こんな感じでコンパイルできる。
lib/
フォルダに以下のようなライブラリファイルができていれば OK
% ls -1 lib
libcutil_x86_64.a
libparamgl_x86_64.a
librendercheckgl_x86_64.a
サンプルコード deviceQuery
を実行してみる。
以下のようにデバイス情報が出力されていれば CUDA は正しく動作している。
% ./bin/darwin/release/deviceQuery
[deviceQuery] starting...
./bin/darwin/release/deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
Found 1 CUDA Capable device(s)
Device 0: "GeForce 9400M"
CUDA Driver Version / Runtime Version 4.2 / 4.2
CUDA Capability Major/Minor version number: 1.1
Total amount of global memory: 254 MBytes (265945088 bytes)
( 2) Multiprocessors x ( 8) CUDA Cores/MP: 16 CUDA Cores
GPU Clock rate: 1100 MHz (1.10 GHz)
Memory Clock rate: 1064 Mhz
Memory Bus Width: 128-bit
Max Texture Dimension Size (x,y,z) 1D=(8192), 2D=(65536,32768), 3D=(2048,2048,2048)
Max Layered Texture Size (dim) x layers 1D=(8192) x 512, 2D=(8192,8192) x 512
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
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: 2147483647 bytes
Texture alignment: 256 bytes
Concurrent copy and execution: No with 0 copy engine(s)
Run time limit on kernels: Yes
Integrated GPU sharing Host Memory: Yes
Support host page-locked memory mapping: Yes
Concurrent kernel execution: No
Alignment requirement for Surfaces: Yes
Device has ECC support enabled: No
Device is using TCC driver mode: No
Device supports Unified Addressing (UVA): No
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.2, CUDA Runtime Version = 4.2, NumDevs = 1, Device = GeForce 9400M
[deviceQuery] test results...
PASSED
> exiting in 3 seconds: 3...2...1...done!
その他のサンプルコードも bin/darwin/release/
以下にある。
これで CUDA を使う準備はできた。
CUDAプログラムを書いてみる
第4回 実際にCUDAを使ってみる の Q3.Matrix のプログラムを実行してみる。
CPU版は問題なかったのだが, GPU版のプログラムをコンパイルすると以下のようなコンパイルエラーがでた。
% nvcc matrix_gpu.cu
Undefined symbols for architecture i386:
"_cutCreateTimer", referenced from:
_main in tmpxft_0000755b_00000000-13_matrix_ex.o
"_cutStartTimer", referenced from:
_main in tmpxft_0000755b_00000000-13_matrix_ex.o
"_cutStopTimer", referenced from:
_main in tmpxft_0000755b_00000000-13_matrix_ex.o
"_cutGetTimerValue", referenced from:
_main in tmpxft_0000755b_00000000-13_matrix_ex.o
"_cutDeleteTimer", referenced from:
_main in tmpxft_0000755b_00000000-13_matrix_ex.o
"_cutCheckCmdLineFlag", referenced from:
__cutilExit(int, char**)in tmpxft_0000755b_00000000-13_matrix_ex.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
調べてみると必要なライブラリがないときに出るエラーらしい。
なので, /Developer/GPU Computing/C/lib
にあるライブラリファイルを /usr/lib
にコピーもしくはシンボリックリンクを貼ればよいとのこと。
% sudo ln -s /Developer/GPU Computing/C/lib/libcutil_x86_64.a /usr/lib/libcutil.a
% sudo ln -s /Developer/GPU Computing/C/lib/libparamgl_x86_64.a /usr/lib/libparamgl.a
% sudo ln -s /Developer/GPU Computing/C/lib/librendercheckgl_x86_64.a /usr/liblibrendercheckgl.a
さらにコンパイル時に -lcutil
, -m64
のオプションを指定してあげると上手くコンパイルできた。
% nvcc matrix_gpu.cu -lcutil -m64 -o matrix_gpu
結果
以下, CPU版, GPU版の実行結果。
;; CPU版(最適化なし)
% ./matrix_cpu
Processing time: 68 (sec)
;; CPU版(最適化あり)
% ./matrix_cpu
Processing time: 29 (sec)
;; GPU版
% ./matrix_gpu
Processing time: 9255.196289 (msec)
最適化なしだと約7倍, 最適化あり(-O2)だと約3倍, GPU のほうが高速だった。
個人的にはもう少し差がついてると面白かったんだけど…。