スキップしてメイン コンテンツに移動

投稿

「A Survey of FPGA Based Neural Network Accelerator」の邦訳

A survey of FPGA Based Neural Network Accelerator 今回は2/17日にドワンゴさんで行われたFPGAXでの発表で紹介したサーベイ論文「A Survey of FPGA Based Neural Network Accelerator」の邦訳を掲載することにする。 稚拙ながら発表スライドも以下にあるので興味のある方はぜひ御覧ください。( ´∀`) https://www.slideshare.net/leapmind/an-introduction-of-dnn-compression-technology-and-hardware-acceleration-on-fpga-88557866 A Survey of FPGA Based Neural Network Accelerator Kaiyuan Guo, Shulin Zeng, Jincheng Yu, Yu Wang, Huazhong Yang https://arxiv.org/abs/1712.08934 Abstruct ニューラルネットは画像やスピーチ、ビデオ認識などの領域に適用され、良い結果を残している。しかし、その計算のストレージや複雑度が、アプリケーションでの活用を難しくしている。CPUでの計算は難しいため、GPUが最初の選択肢となる。 一方で、FPGAを基にしたアクセラレータも研究の対象となってきている。なぜなら、特化したハードウェアの設計はGPUを速度とエネルギー効率で超えるための、有力な選択肢であるためである。様々なFPGAベースのアクセラレータがソフトウェアとハードウェアの最適化手法を用いて提案されてきている。本稿では、それらの全体図とそれらの主要な技術の要約を行う。この調査はFPGAベースのNNアクセラレータについて、そのソフトウェア側からハードウェア側、回路レベルからシステムレベルに渡...

「Halide: A Language and Compiler for Optimizing Parallelism, Locality, and Recomputation in Image Processing Pipelines」の邦訳と感想(その1)

Halide: A Language and Compiler for Optimizing Parallelism, Locality, and Recomputation in Image Processing Pipelines 最近、趣味の実装にばかり時間を割いていたため、また前の投稿から少し空いてしまったが、 今書き溜めていている分を少しずつ公開していくことにしようと思う。 今回から2回にかけて画像処理用DSLのHalideの論文を訳を公開していこうと思う。元から素晴らしい技術であったが、近年のDeepLearningブームで再度脚光を浴びつつあるように感じる。 お恥ずかしながら、実は主もその名前は知ってはいたが、内容を読んだのはDLブームの後のことである。(^q^) 最近ではTVM-NNVMフローなんかでも主要な技術として応用されている。 本家: http://halide-lang.org/ より詳しい長編版: https://people.csail.mit.edu/jrk/halide12/halide12.pdf 「Halide: A Language and Compiler for Optimizing Parallelism, Locality, and Recomputation in Image Processing Pipelines」の邦訳と感想(その1) # Abstract 画像処理パイプラインはステンシル計算とストリームプログラムの挑戦の組み合わせである。それらはグローバルまたはデータ依存のアクセスパターンを含むステージと複雑なリダクション処理、異なるステンシルステージの巨大なグラフから構成される。その複雑な構成から、ナイーブな実装と最適化された実装の性能の違いが桁違いになることも珍しくない。効率的な実装は並列性と局所性の双方の最適化を必要とする。しかし、ステンシルの性質から、並...

GPUを支える技術読み始めた 第5章[後半]

GPUを支える技術読み始めた 第5章[後半] 最近、仕事の忙しさにかまけて全然ブログを更新できていなかったが、なんとかGPUを支える技術の5章までを投稿することができた。 時間がないわけではないのだけどだけど、普通の読書や実装などに時間を割くと、なかなか文章を書く暇がない。。 _| ̄|○ 効率を重視しながらも、重要なところを上手くまとめて復習に役立てられるブログにしていきたい。 第5章 GPUプログラミングの基本[前半] 5.4 GPU プログラムの最適化 GPUで最大限力を発揮するには、その資源を有効に使うプログラム作成する必要がある。 具体的には以下のような点が重要である。 スレッドブロックはSMの数の整数倍にする NVIDIAのGPUはスレッドブロック単位で各SMに割り当てられ計算される。1度の割当で計算しきれない分は2巡目以降にで割り当てられる。この場合、スレッドブロックの数が中途半端だと最後のターンでSMにあまりが出てしまう。ただし、複数カーネルを同時に実行する機能もあるので、他のカーネルがあれば空いたスペースは自動で埋められる。 演算機の計算パイプラインを意識する 演算器が前の計算を行ってからその結果を再度利用するには10サイクルほど要する。NVIDIA GPUはワープ(32スレッド)を同時に計算を行うが、ワープの結果を利用する予定の他のワープはその実行時間分を待つ必要がある。この隙間時間はワープスケジューラが別のワープを演算機に割り当てるが、全部で64ワープしかない、SM1つあたりのレジスタファイルは65,536個(1スレッドあたり32個)しかないということを考慮してプログラムを作成する必要がある。なお、ワープがDDRアクセスを必要とする場合、400〜800サイクルかかることもある。 条件分岐への配慮 以前の章でも説明したとおり、プレディケートによる条件分岐はif, elseの両方...