GPGPU
Julia
JuliaDay 20

JuliaでGPGPU(ArrayFire)したかった話

More than 1 year has passed since last update.

すみませんまだ書きさしです

Introduction

Julia Advent Calendar 20日目の記事...だったはずです...が,すみません予定よりだいぶ投稿が遅れてます. 大変申し訳無いです. とりあえず土日のまとまった時間に残りを書きます...
当初の予定では,「GPGPU(CPU, FPGAも使えるらしいので正確な表現では無いですが...)のライブラリである"ArrayFire"のJuliaラッパーである"ArrayFire.jl"というパッケージを用いると,標準関数と同様のインターフェイスで簡単にGPUを用いた並列計算が可能となることを紹介する.と同時にそれらのめんどくさい導入作業を省いてお試しいただけるDockerfileを作る」だけのつもりだったのですが,恥ずかしながらこのArrayFire.jlを導入するまでに至らず...本当はこんな感じのことをやりたかったのです.Jupyter notebook上で.
しょうがないので,代わりにこの記事では
* ArrayFire.jl導入時に確認された問題
* 代替として動作確認ができたCUDArt.jlを用いた例
* 現状の「ArrayFire, CUDA, CUDArt.jl]が動作するDockerfile
について述べたいと思います.環境構築をDocker上で行っていますが,本記事を読む上ではここの内容にある程度の知識しか要求されません(自分が詳しくないため).

ArrayFire.jl導入手順と発生した問題

導入の手順をざっくりと述べると以下のようになります.
1. CUDAを導入
2. ArrayFireを導入
3. ArrayFire.jlを導入
1.に関してはnvidia-dockerを使う場合イメージ名を指定するだけです.2.については公式サイトの手順に沿ってソースからビルドする方針で行います(バイナリをダウンロードするためには公式サイトにて会員登録が必要となるため).

Introで述べた通りArrayFire.jlはArrayFireライブラリのJuliaラッパーです.本体ライブラリの導入はPkg.addではやってくれないため自分で行う必要があります.また,今回はCUDAをバックエンドで用いるため,ArrayFire導入前にCUDAを導入する必要があります.以下ではNVIDIA dockerを用いてこれらの導入を行っていきます.なおNVIDIA dockerそのものの導入については公式のQuick startで話が尽きているので特に述べません.
以下では実際に

CUDAを導入

今回はnvidia/cuda:7.5をベースにコンテナを構築していきます(Ubuntu 14.04 CUDA 7.5).

FROM nvidia/cuda:7.5

ArrayFireを導入

ArrayFireを公式サイトの説明に沿って導入していきます.

ArrayFire.jlを導入

と,ここまでで一応必要なステップはすべてクリアされている(はず)なのですが,実際にJulia上でusing ArrayFiresetBackend(AF_BACKEND_CUDA)としようとするとこのようなエラーによりバックエンドをCPUからGPUへ切り替えることができませんでした.
このようなエラー
CPUバックエンドを使用する分には問題なさそうなのですが...LD_LIBRARYのパス等の設定はできていたので同様のIssueは既に幾つか挙げられていますがどれを読んでも今ひとつ原因を絞り込むことができませんでした[1][2].当面はこれらのIssueをウォッチしつつ,問題の解決を図ります.この問題の解決/回避に成功した際には,本記事を更新してその旨を記述します.

CUDArt.jl

今回使用したDockerコンテナ