Ubuntu上でNVIDIAのOpenCLドライバを使う


Ubuntu 14.04 LTS (64bit)環境で、NVIDIAのGPUを使ってOpenCLを試そうとしたら案外ハマったので記録。

前提

NVIDIAドライバをapt管理するため、xorg-edgersを利用します(NVIDIA本家のインストーラを使ったことがないので、どちらがいいとかはわかりません)。

$ sudo add-apt-repository ppa:xorg-edgers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-340

ヘッダファイルがない

ヘッダファイルが必要なら(当然必要ですよね)devパッケージを入れる必要があります。

$ sudo apt-get install nvidia-340-dev

/usr/include/nvidia-340/以下にCL/cl.hなどがインストールされます。

一見必要そうだけどインストールしなくて良いパッケージ

nvidia-libopencl1-340というパッケージがあるんですが、これはインストールしなくても動きます。ocl-icd-libopencl1が気にくわない時だけインストールすれば良いのだと想像しています。

libOpenCLのlinker nameが無い

libOpenCL.soへのシンボリックリンクが作られているかどうか、念のため確認しましょう。

$ ls -la /usr/lib/x86_64-linux-gnu/libOpenCL.so
lrwxrwxrwx 1 root root 18  3月 16  2014 /usr/lib/x86_64-linux-gnu/libOpenCL.so -> libOpenCL.so.1.0.0

上記のようなシンボリックリンクが存在すれば正常です。少し前に試したときは、なぜかこのシンボリックリンクを手動で作る必要がありました(nvidia-libopencl1-340のバグかもしれません…)。

$ cd /usr/lib/x86_64-linux-gnu
$ sudo ln -s libOpenCL.so.1 libOpenCL.so

それでも微妙に動かない…

この状態だと、OpenCLのclGetPlatformIDs()が失敗します。

さらに下記パッケージをインストールする必要がありました。

$ sudo apt-get install nvidia-modprobe

ちなみに、うまく動かない状態でclGetPlatformIDs()が返す値はCL_PLATFORM_NOT_FOUND_KHR(-1001)でした。