Ubuntu Weekly Recipe

第456回 Ubuntu 16.04 LTSでCUDA 8.0を使用する

この記事を読むのに必要な時間:およそ 15 分

インストール後の設定

パッケージ版にしろスクリプト版にしろ,ツールキットのコマンド群は/usr/local/cuda-8.0/binに,各種ライブラリは/usr/local/cuda-8.0/lib64にインストールされます※6⁠。どちらもUbuntu標準の設定ではコマンドやライブラリの検索対象にならないため,まずは検索対象にする設定を行いましょう。特定のユーザーのみCUDAを使うのであればセッションローカルな方法で,そのシステムのすべてのユーザーがCUDAを使う予定があるのならシステムワイドな方法で設定します。

※6
スクリプト版インストーラーの途中でシンボリックリンクを作るように回答していれば,/usr/local/cuda/bin/usr/local/cuda/lib64がそれぞれのシンボリックリンクとして作られています。

セッションローカルに設定する方法

Ubuntu標準のBashを使用しており,セッションローカルで設定したい場合は,環境変数のPATHLD_LIBRARY_PATH~/.profileに記述するのが一番無難です。

環境変数PATH「コマンドを実行する時の検索パス」です。fooコマンドを実行したとき,PATHに設定されているパスから順番に実行できるfooファイルを探す仕組みになっています。

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Ubuntuの標準のPATHの値はおおよそ上記のとおりです。/usr/local/cuda-8.0/binが含まれていないため,CUDAのコンパイラであるnvccを実行したい時は,わざわざ/usr/local/cuda-8.0/bin/nvccと入力しなくてはなりません。そこでログインした時点でPATHに,/usr/local/cuda-8.0/binを追加するよう~/.profileを編集します。

Ubuntuでアカウントを作成するとBashがログインシェルとして設定されます。UbuntuのBashはログインシェルとして実行された時には~/.profile~/.bashrcを,さらに単純にシェルとしてBashが起動するたびに~/.bashrcを読み込みます※7⁠。加えてBashには環境変数をexportすると,その環境から起動したプログラムにも環境変数の値が引き継がれるという仕組みが存在します。Ubuntuの環境変数PATHはあらかじめexportされているので,ログインシェルで一度設定すれば良いということになります。

※7
一般的にBashは/etc以下の他のファイルも読み込みますし,たとえば~/.bash_profileがあれば~/.profileの代わりにそちらを優先的に読み込みます。設定ファイルの優先度に関してはBashのmanページを参照してください。Ubuntuの場合,まず/bin/shがBashではなくDashになっています。このDashが~/.profileのみ読み込むため,伝統的にログインシェル用の設定は~/.profile⁠,Bash固有の設定は~/.bashrcという使い分けを行なっているようです。

環境変数LD_LIBRARY_PATHは,コマンドを実行する時に「ローダーが必要なライブラリを検索するためのパス」を設定します。環境変数PATHのライブラリファイル版ぐらいに思っておけば良いでしょう。こちらはUbuntuにログインした時点では特に設定はされていませんので,明示的にexportする必要があります。

ということで~/.profileに次の最初の3行を記述しましょう。

## set PATH and libs for CUDA
PATH="/usr/local/cuda-8.0/bin${PATH:+:${PATH}}"
export LD_LIBRARY_PATH="/usr/local/cuda-8.0/lib64/${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}"

通常は末尾に記載すれば問題ありません。ただしByobuを利用している場合は別です。Byobuをログイン時に自動的に実行するよう設定すると~/.profileの末尾にbyobu-launchを実行するコードを追記します。この行より後ろで環境変数を設定したとしても実際には反映されませんので,Byobuを使用している場合は,次のようにByobu関連の設定よりは前に環境変数の設定が来るようにしてください。

## set PATH and libs for CUDA
PATH="/usr/local/cuda-8.0/bin${PATH:+:${PATH}}"
export LD_LIBRARY_PATH="/usr/local/cuda-8.0/lib64/${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}"

_byobu_sourced=1 . /usr/bin/byobu-launch 2>/dev/null || true

システムワイドに設定する方法

システムワイドに設定を反映させたい場合は,やり方が若干異なります。

まず環境変数PATHを設定するために,cuda.shという名前で以下の設定スクリプトファイルを/etc/profile.dに置きます。

## set PATH for CUDA
PATH="/usr/local/cuda-8.0/bin${PATH:+:${PATH}}"

ログインシェルが/etc/profileを読み込んだあとに/etc/profile.d以下のファイルが順番に読み込まれていきます。なお,ファイル名の末尾が.shでないものは無視されます。また実行権限を付けておく必要はありません。

ライブラリの検索パスは,ローダーの設定ディレクトリ/etc/ld.so.conf.dを使用します。このディレクトリにcuda.confという名前で作成してください。こちらもファイルの末尾は.confにしておく必要があります。

## CUDA support
/usr/local/cuda-8.0/lib64

ld.so.conf.dを変更したので,次のコマンドでld.so.cacheを再構築します。

$ sudo ldconfig

動作確認

環境変数の設定を反映させるために,一度ログアウトしてから再度ログインしてください。最後に期待通り設定されているか確認しておきましょう。

$ echo $PATH
/home/shibata/bin:/home/shibata/.local/bin:/usr/local/cuda-8.0/bin::/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

$ which nvcc
/usr/local/cuda-8.0/bin/nvcc

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Sun_Sep__4_22:14:01_CDT_2016
Cuda compilation tools, release 8.0, V8.0.44

$ ldconfig -p | grep cuda
        libnvrtc.so.8.0 (libc6,x86-64) => /usr/local/cuda-8.0/lib64/libnvrtc.so.8.0
        libnvrtc.so (libc6,x86-64) => /usr/local/cuda-8.0/lib64/libnvrtc.so
(後略)

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。