- プログラミング
- 輪講
Halide, Darkroom – 画像処理並列化のためのソフトウェア
Halide, Darkroom – 画像処理並列化のためのソフトウェア
社内勉強会のネタです.
HalideとDarkroomという画像処理を並列化するためのソフトウェアの研究についてのちょっとしたサーベイ発表のスライドを公開します.
Halideについては,サンプルコードも書いてみました.
とある画像処理を,下のメソッドチェーンで記述するだけで,「画像全体を8行毎に切って,それをマルチスレッドで処理し,8行毎の処理は内部的に4ピクセル毎にベクタライズして処理する」という並列化処理に置き換えられてしまいます.
ゴイスー.
temp.split(y, y, yi, 8).parallel(y).vectorize(x, 4);
例えば,25×25のサイズフィルタを畳み込むぼかし処理を上記の並列化で高速化した場合,画像サイズが768×1024のケースで,15倍くらい高速化することができました.
また,HalideはC++にインラインでそのまま書けるのでポータビリティも最高です.
大元のリポジトリに行くとiOS向けのサンプルコードとかもあるので,様々な環境でちょっとした画像処理を簡単に高速化できるのがさらにすごいところだと思います.
プレゼンではビルド方法等について話さなかったので,ここでちょっと紹介します.
Macの場合は,llvmのバイナリをダウンロードして,Halideのソースコードの内部に設置し,環境変数をセットするだけで簡単に試すことができました.
実際,llvmはビルドしてもいいのかもしれませんが,私は面倒なのでしませんでした.
> git clone https://github.com/halide/Halide.git
> cd Halide
> curl -L -O http://llvm.org/releases/3.7.0/clang+llvm-3.7.0-x86_64-apple-darwin.tar.xz
> tar zxf clang+llvm-3.7.0-x86_64-apple-darwin.tar.xz
> export LLVM_CONFIG=(your path)/Halide/llvm/bin/llvm-config
> export CLANG=(your path)/Halide/llvm/bin/clang
> make
チュートリアルのサンプルコードは,以下のようにしてビルド&実行できます.
(リンカのパスがなんかおかしい気がするんだけど・・・・まぁいいか・・・)
> make tutorial_lesson_02_input_image
> ln -s ./tutorial/images ./images
> ./bin/tutorial_lesson_02_input_image
私もHalideのソースコードを書いてみました.
繰り返しになりますが,そのままC++のコードとしてかけるのがすごい・・・.
そして,スケジュールのメソッドチェーンを書くだけで,処理スピードが10倍とかになるので,かなり実応用にも有効かと考えます.
Halideの講演のビデオが非常にわかりやすいのでオススメです.