Docker で OpenCL の実行環境を構築 - pocl
前回の 「node-ffi で OpenCL を使う」 では Windows 上で Node.js から OpenCL の API を呼び出してみましたが、これを Linux 上で行うために OpenCL の実行環境を Docker で構築してみました。
OpenCL の実行環境として pocl を使い、Linux は Fedora を使います。(Fedora にしたのは pocl のインストールが簡単だったから)
サンプルのソースは http://github.com/fits/try_samples/tree/master/blog/20160711/
Docker イメージ作成
Docker の公式 fedora イメージを使って OpenCL の Docker イメージを作成します。
最近の Fedora ではパッケージ管理に DNF (yum の後継) を使うようなので、dnf コマンドを使った Dockerfile を作成しました。
Dockerfile
FROM fedora RUN dnf update -y RUN dnf install -y clinfo pocl pocl-devel RUN ln -s /lib64/libpoclu.so /lib64/libOpenCL.so RUN dnf install -y tar findutils make python2 RUN dnf clean all
OpenCL を実行するだけなら pocl のインストールだけで良さそうですが、ついでに clinfo と pocl-devel もインストールしています。 (clinfo で OpenCL の環境情報を参照できます)
なお、OpenCL の標準的なライブラリ名は libOpenCL.so
のようですが、pocl をインストールしても libOpenCL.so を作ってくれなかったので、libpoclu.so
のシンボリックリンクとして作成するようにしています。※
※ node-ffi で指定するライブラリ名を libpoclu とするなら、 libOpenCL.so は無くてもよい
また、tar と findutils は nvm
で、make と python2 は node-gyp
で必要となるため、ついでにインストールしています。
Docker イメージは docker build コマンドで作成します。
ビルド例 (Docker イメージ作成)
$ docker build --no-cache -t sample/opencl:0.1 .
OpenCL 動作確認
まずは、今回の環境で動作するように 前回 のサンプルを少し書き換えます。 ライブラリ名をプラットフォームに合わせて切り替えるようにします。
/vagrant/work/platform_info.js (変更点)
・・・ const clLib = (process.platform == 'win32') ? 'OpenCL' : 'libOpenCL'; const openCl = ffi.Library(clLib, { ・・・ }); ・・・
先程作成した Docker イメージを使ってコンテナを起動します。
Docker コンテナ実行
$ docker run --rm -it -v /vagrant/work:/work sample/opencl:0.1 bash
ここからは Docker コンテナ内での操作となります。
dnf (もしくは yum) だと古いバージョンの Node.js をインストールしてしまうので、nvm を使って Node.js v6.2.2 をインストールします。
Node.js のインストール後、node-gyp と node-ffi を npm でそれぞれインストールします。
Node.js と必要なモジュールのインストール
# curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.2/install.sh | bash ・・・ # source ~/.bashrc # nvm install v6.2.2 ・・・ # npm install -g node-gyp ・・・ # cd /work # npm install ffi ・・・
最後に platform_info.js を実行すると問題なく動作しました。
platform_info.js 実行
# node platform_info.js FULL_PROFILE OpenCL 2.0 pocl 0.13, LLVM 3.8.0 Portable Computing Language