Ubuntu 12.04にCUDA 4.1をインストールした時のメモ

以前にも CUDA のインストール手順を書きましたが、Ubuntuを12.04 beta 1 (64bit版) にアップグレードして CUDA も新しいバージョン (4.1) を入れ直したので、そのまとめです。

インストールは以下の順序で行います。

  1. Ubuntu 12.04
  2. NVIDIA製ディスプレイドライバ
  3. CUDA Toolkit 4.1
  4. GPU Computing SDK 4.1
  5. サンプルプログラムのコンパイルに必要なライブラリ等

CUDA Toolkit と GPU Computing SDK はインストール後に修正する必要があり、従来よりも少し面倒になっています。

最近は数値計算だけでなく Blender など一般のアプリケーションでも CUDA や OpenCL を利用するものが多くなってきたので、deb パッケージで簡単にインストールできるようになるといいのですが…。(Debian の testing と unstable には既に nvidia-cuda-toolkit というパッケージがありますが、DebianUbuntu では NVIDIAドライバー周りのパッケージングがだいぶ違うので、そのまま Ubuntu に持ってくることはできないと思います。Debian からインポートされた CUDA 4.1 のパッケージが multiverse にあるようですが、案の定ビルドに失敗していて利用できません。)

Ubuntu 12.04

インストール方法はいろいろなところに書かれているので、ここでは省略します。使用するPCが Core i7 CPU + メインメモリー 16GiB ということで、64bit版を入れました。以下の記述は 64bit 環境を想定しているので、32bit 環境にインストールする場合はファイル名などを適宜読み替える必要があります。

NVIDIA製ディスプレイドライバ

Ubuntu 12.04 の場合、Ubuntu 公式の nvidia-current パッケージが入っていれば大丈夫です。もしまだ入っていなければ、「システム設定>追加のドライバー」から「NVIDIAの高性能グラフィックスドライバー」を選択するか、

sudo apt-get install nvidia-current

を実行します。インストールが終わったら、再起動します。

Ubuntu 11.10 の場合はドライバのバージョンが古いので、Ubuntu-X team の X Updates PPA から新しいものをインストールします。

sudo add-apt-repository ppa:ubuntu-x-swat/x-updates
sudo apt-get update
sudo apt-get dist-upgrade

CUDA Toolkit

CUDAのダウンロードのページ (http://developer.nvidia.com/cuda-toolkit-41) から、以下のように Ubuntu 11.04 用の CUDA Toolkit のファイル (cudatoolkit_4.1.28_linux_64_ubuntu11.04.run) をダウンロードしてインストールします。

wget http://developer.download.nvidia.com/compute/cuda/4_1/rel/toolkit/cudatoolkit_4.1.28_linux_64_ubuntu11.04.run
chmod a+x cudatoolkit_4.1.28_linux_64_ubuntu11.04.run
sudo ./cudatoolkit_4.1.28_linux_64_ubuntu11.04.run

途中でインストール先を聞かれますが、デフォルトの /usr/local/cuda に入れます。

ライブラリ及び実行ファイルの検索パスの設定

以下の内容の /etc/ld.so.conf.d/cuda.conf というファイルを作成します。32bit 環境では1行目は要らないでしょう。

/usr/local/cuda/lib64
/usr/local/cuda/lib

この設定を有効にするために、以下のコマンドを実行します。

sudo ldconfig

以下の内容の /etc/profile.d/cuda.sh というファイルを作成します。

export PATH="/usr/local/cuda/bin:$PATH"
export LIBRARY_PATH="/usr/lib/nvidia-current:$LIBRARY_PATH"

ここで、この設定を有効にするために再ログインします。

CUDA Toolkit の修正

CUDA Toolkit のサポートする gcc のバージョンは 4.5 以下であるため、Ubuntu 12.04 の gcc 4.6 で使おうとするとバージョンのチェックの所で引っかかってしまいプログラムのビルドが通りません。そこで、このバージョンのチェックを無視するようにヘッダファイルを変更します。

ファイル /usr/local/cuda/include/host_config.h をテキストエディタで開き、82行目をコメントアウトするか、このファイルに以下のパッチを適用します。

--- host_config.orig.h  2012-01-27 17:20:57.689102815 +0900
+++ host_config.h       2012-01-27 17:29:32.037101532 +0900
@@ -79,7 +79,7 @@
 
 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5)
 
-#error -- unsupported GNU version! gcc 4.6 and up are not supported!
+//#error -- unsupported GNU version! gcc 4.6 and up are not supported!
 
 #endif /* __GNUC__> 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5) */
 

(参考:http://wiki.blender.org/index.php/Doc:2.6/Manual/Render/Cycles/GPU_Rendering)

GPU Computing SDK

GPU Computing SDK は、追加のライブラリやサンプルプログラム、ドキュメント類のセットです。これをインストールしなくてもCUDAのプログラムは作成できますが、参考になるので入れておく方がいいでしょう。
CUDA Toolkitと同じ場所から gpucomputingsdk_4.1.28_linux.run をダウンロードし、インストールします。

wget http://developer.download.nvidia.com/compute/cuda/4_1/rel/sdk/gpucomputingsdk_4.1.28_linux.run
chmod a+x gpucomputingsdk_4.1.28_linux.run
./gpucomputingsdk_4.1.28_linux.run

途中でインストール先を聞かれますが、デフォルトの $HOME/NVIDIA_GPU_Computing_SDK に入れます。

GPU Computing SDK の修正

そのままだと、サンプルプログラムのビルド時に次のようなエラーが出てしまいます。

../../lib/librendercheckgl_x86_64.a(rendercheck_gl.cpp.o): In function `CheckBackBuffer::checkStatus(char const*, int, bool)':
rendercheck_gl.cpp:(.text+0xfbb): undefined reference to `gluErrorString'
collect2: ld はステータス 1 で終了しました
make[1]: *** [../../bin/linux/release/recursiveGaussian] エラー 1
make[1]: ディレクトリ `/home/irie/NVIDIA_GPU_Computing_SDK/C/src/recursiveGaussian' から出ます
make: *** [src/recursiveGaussian/Makefile.ph_build] エラー 2

これは ~/NVIDIA_GPU_Computing_SDK/C/common/common.mk というファイルの中でライブラリをリンクする順序が間違っているためです。
そこで、このファイルの 270, 274, 281 行目の $(RENDERCHECKGLLIB) をそれぞれ先頭の方に移動するように修正します。以下のパッチを参考にして下さい。

--- common.orig.mk      2012-01-27 14:34:13.129127766 +0900
+++ common.mk   2012-01-27 14:24:10.433129269 +0900
@@ -267,18 +267,18 @@
 
 # If dynamically linking to CUDA and CUDART, we exclude the libraries from the LIB
 ifeq ($(USECUDADYNLIB),1)
-     LIB += ${OPENGLLIB} $(PARAMGLLIB) $(RENDERCHECKGLLIB) ${LIB} -ldl -rdynamic 
+     LIB += $(RENDERCHECKGLLIB) ${OPENGLLIB} $(PARAMGLLIB) ${LIB} -ldl -rdynamic 
 else
 # static linking, we will statically link against CUDA and CUDART
   ifeq ($(USEDRVAPI),1)
-     LIB += -lcuda   ${OPENGLLIB} $(PARAMGLLIB) $(RENDERCHECKGLLIB) ${LIB} 
+     LIB += -lcuda   $(RENDERCHECKGLLIB) ${OPENGLLIB} $(PARAMGLLIB) ${LIB} 
   else
      ifeq ($(emu),1) 
          LIB += -lcudartemu
      else 
          LIB += -lcudart
      endif
-     LIB += ${OPENGLLIB} $(PARAMGLLIB) $(RENDERCHECKGLLIB) ${LIB}
+     LIB += $(RENDERCHECKGLLIB) ${OPENGLLIB} $(PARAMGLLIB) ${LIB}
   endif
 endif
 

(参考:http://forums.developer.nvidia.com/devforum/discussion/3486/linkingmake-error-while-compiling-sdk-on-ubuntu-11.10/p1)

サンプルプログラムのコンパイルに必要なライブラリ等

Ubuntuの公式のパッケージを利用します。

sudo apt-get install g++ freeglut3-dev libxi-dev libxmu-dev

ただしこれだけでは、MPIを利用するサンプル (simpleMPI) がビルドできません。simpleMPIもビルドしたい場合は Open MPI 関連のパッケージもインストールします。

sudo apt-get install openmpi-bin openmpi-dev
サンプルプログラムのビルド
cd ~/NVIDIA_GPU_Computing_SDK/C
make

ビルドが終わると、$HOME/NVIDIA_GPU_Computing_SDK/C/bin/linux/release にいろいろなバイナリが生成されているので、動かしてみます。例えばnbodyというのは、N体問題を解くプログラムです。

cd ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release
./nbody
たぶん64bit環境固有の問題

前回も書いたように、64bit環境では書籍「はじめてのCUDAプログラミング」のサンプルプログラム (http://www.kohgakusha.co.jp/support/cuda/index.html) をビルドしようとすると、「/usr/bin/ld: cannot find -lcutil」というエラーが出て止まってしまいます。以下のように、$HOME/NVIDIA_GPU_Computing_SDK/C/lib 内にシンボリックリンクを作成すると、正常にビルド及び実行が出来るようになるはずです。

cd ~/NVIDIA_GPU_Computing_SDK/C/lib
for i in *_x86_64.a; do ln -sv $i ${i%_x86_64.a}.a; done

はじめてのCUDAプログラミング―驚異の開発環境[GPU+CUDA]を使いこなす! (I・O BOOKS)

はじめてのCUDAプログラミング―驚異の開発環境[GPU+CUDA]を使いこなす! (I・O BOOKS)