EVENT REPORTイベントレポート
ヒカラボレポートとは、開催されたヒカラボにおいて、登壇者が伝えたい講演内容を記事としてまとめたものです。ご参加された方はもちろん、ヒカラボに興味があるという方も是非ご覧ください。
ヒカラボレポートとは、開催されたヒカラボにおいて、登壇者が伝えたい講演内容を記事としてまとめたものです。ご参加された方はもちろん、ヒカラボに興味があるという方も是非ご覧ください。
イベントレポートvol.44
2017/12/05(火)更新2017/11/16(木)19:30~21:30
11月16日のヒカラボでは、画像処理の高速化を実現するプログラミング言語、Halideをテーマに、株式会社フィックスターズの丸岡氏と近村氏に登壇いただきました。Halideの基本的な構造や活用事例、フィックスターズのHalideについての取り組みなどについて詳しくお話しいただいたので、レポートをお届けします。
講演者プロフィール
講演者プロフィール
Halideは、画像処理の計算に特化したドメイン固有言語(DSL)。C++の内部DSLとして提供されているため、C++と組み合わせて活用できます。
Halideの最大の特徴は「アルゴリズム」と「スケジュール」を分けて記述できるところ。「アルゴリズム」は「計算式」を記述するもの、「スケジュール」は「計算の順序やデータの持ち方などをはじめとした、ハードウェアに対する最適化方法」を記述するもので、これらを分けることによってコード量を大幅に短縮できるそうです。
▲C++ではこのように書かれるコードも、下記のように簡潔に記述できる。
▲上の画像と同じ処理のコードを、Halideで書いた例。
そして、Halideの2つ目の特徴は、マルチプラットフォームに対応していること。Halideだけでも主要なCPUやGPUに対応していますが、C言語のソースコードも出力できるため、Cコンパイラを持つプラットフォームであれば、Halideの恩恵を受けることができます。また、ハードウェアごとに異なるスケジュールを記述できるので、コードに対する変更を最小限に抑えてさまざまハードウェアに対して最適化することができます。
▲CPUとGPUの切り替えも1行で可能。
講演ではこうした機能を実現するコンパイラそのものについても話が及び、会場に訪れたエンジニアのみなさんも熱心に耳を傾けていました。
続いて、画像のぼかし処理や、輪郭を抽出するエッジ処理などに使用される「2次元コンボリューション」を例に取り、Halideの言語仕様と実装例についても紹介いただきました。下記は、アルゴリズムを記述するために使用する関数の定義方法について。
▲Halideにおける関数の定義方法の1例。
▲2次元コンボリューション処理を行うアルゴリズムの記述例。
続いてスケジュールの実装例について。スケジュールはハードウェアによって効果が異なるということでしたが、今回はCPUの場合について解説いただきました。
▲「void schedule() {」以下が、スケジュールの記述。ループ展開を行う「unroll」や、スレッド並列化を行う「parallel」が使用されている。
Halideを使ってこのように記述することで、Intelの6コアCPU上では、C++で書いたコード(最適化なし)に比べて、なんと127.7倍も処理速度が向上するそうです。
▲②は①をHalideで書き換えただけ(アルゴリズムのみ)の記述。それだけで60倍の速度向上がみられたそうです。③はスケジュールにunrollを使用した記述で、②から1.14倍の向上、④はそれらにparallelというスケジュールの記述を加えたもので、全体で127.7倍の速度向上を実現できるとのこと。
さらに講演では、近村氏からフィックスターズでのHalideの取り組みについても語られました。フィックスターズでは、HalideからFPGA向けのC/C++コードを出力するコンパイラを開発しており、このコンパイラを使用して開発されたFPGA向けIPコアをHalide to FPGAというベータ版サイトにて提供しているそうです。興味のある方はぜひ下記のリンクをチェックしてみてください。
質疑応答だけでなく、講演中にも積極的に質問が飛び交い、Halideは非常に注目度の高いプログラミング言語であることが感じられました。
より深くHalideについて理解を深めたい方は、イベントで使用されたスライドを読んで、その魅力を感じ取ってみてください。