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)でした。