LXC内でNVIDIA用OpenCLプログラムを実行する
マシン環境
本稿の内容を試したマシン環境を以下に示します。
項目 | 内容 |
---|---|
CPU | Intel(R) Core(TM) i7-4790 CPU |
GPU | NVIDIA Corporation GK107 [GeForce GTX 650] (rev a1) |
OS | Ubuntu 14.04.3 LTS (64bit) |
ホストマシンの設定
ホストマシンには、nvidiaおよびnvidia_uvmカーネルモジュールがロードされていればOKです。その具体的な方法を以下に記します。
NVIDIAのプロプライエタリドライバをインストールします。
$ sudo apt-get install nvidia-352-updates
ドライバを有効にするために一旦リブートします。
$ sudo reboot
リブート後、次のようにnvidiaドライバがインストールされていればOKです。
$ lsmod | grep nvidia
nvidia 8646656 0
drm 344064 4 i915,drm_kms_helper,nvidia
また、以下のモジュールもロードしておいてください。
$ sudo modprobe nvidia_352_updates_uvm
コンテナ(LXC)の作成
コンテナのOSには、ホストと同じUbuntu 14.04 LTSを使用します。
$ sudo lxc-create -t download -n name -- -d ubuntu -r trusty -a amd64
-nの後には、任意のコンテナ名を指定してください。また以下の説明では、nameの部分を適宜、実際の文字列に置き換えてください。
コンテナでGPUを使うための設定
/var/lib/lxc/name/configに以下の行を追加してください。
lxc.cgroup.devices.allow = c 249:0 rw
lxc.cgroup.devices.allow = c 195:0 rw
lxc.cgroup.devices.allow = c 195:255 rw
コンテナにGPU用のデバイスファイルを作成します。
$ sudo mknod /var/lib/lxc/name/rootfs/dev/nvidia-uvm c 249 0
$ sudo mknod /var/lib/lxc/name/rootfs/dev/nvidia0 c 195 0
$ sudo mknod /var/lib/lxc/name/rootfs/dev/nvidiactl c 195 255
ログインのための設定
$ sudo chroot /var/lib/lxc/name/rootfs
root@name:/# passwd
一般ユーザーを作る場合、以下のコマンドを実行します。user_nameの部分を適宜変更してください。
root@name:/# adduser user_name
また、sshを使ってログインできるようにするには、以下のコマンドを実行しておきます。
root@name:/# apt-get update; apt-get install openssh-server
コンテナの起動とのソフトウェアのセットアップ
$ sudo lxc-start -n name
以下、コンテナ内の操作ですので、ホストと間違えなようにご注意ください。
# sudo apt-get install nvidia-352-updates
lightdmがGUIを起動しようとすることがあるので、削除しておきます。
# dpkg --purge lightdm nvidia-prime
clinfoで動作確認
clinfoがインストールされていない場合、以下のコマンドでインストールしてください。
# apt-get install clinfo
clifnoを実行して、次のように表示されればOKです。
# clinfo
Number of platforms: 1
Platform Profile: FULL_PROFILE
Platform Version: OpenCL 1.2 CUDA 7.5.23
Platform Name: NVIDIA CUDA
Platform Vendor: NVIDIA Corporation
(以下省略)
カーネルコードの動的なビルド確認
最後に、カーネルコードの動的なビルドを含むサンプルコードを実行してみましょう。必要なツールやヘッダをインストールします。もちろん、すでにインストールされている場合、スキップできます。
# apt-get install g++
# apt-get install opencl-headers
次の3つのファイルをダウンロードして、ひとつのディレクトリに配置してください。
ビルド、実行してみてください。このテストプログラムは、ランダムな2つの数値の足し算をOpenCLを用いて行います。次の様な出力が得られれば、動的なビルドにも成功しています。
$ make
g++ testocl.cc -std=c++11 -lOpenCL -o testocl
$ ./testocl
Platfrom ID: 0x12fe550
Device ID: 0x12fe610
i: 0, 0.840188 + 0.394383 => 1.234571
i: 1, 0.783099 + 0.798440 => 1.581539
i: 2, 0.911647 + 0.197551 => 1.109199
i: 3, 0.335223 + 0.768230 => 1.103452
i: 4, 0.277775 + 0.553970 => 0.831745
i: 5, 0.477397 + 0.628871 => 1.106268
i: 6, 0.364784 + 0.513401 => 0.878185
i: 7, 0.952230 + 0.916195 => 1.868425
i: 8, 0.635712 + 0.717297 => 1.353009
i: 9, 0.141603 + 0.606969 => 0.748571
まとめ
本稿では、試行錯誤に適するコンテナ内で、NVIDIAのGPUを用いたOpenCLプログラムの実行方法を紹介しました。