CPUかGPUか専用回路か

以下の記事は,[OpenVino](https://www.intel.co.jp/content/www/jp/ja/internet-of-things/solution-briefs/openvino-toolkit-product-brief.html)の登場などによって状況が変わりつつあるようです。最新の技術動向を自力で調査して、判断を行なってください。
NVIDIAのボードも、TensorRTを使う前提での評価を加えて比較して見てください。
特に、機械学習の入力をMIPIのCSIを使う前提で、CPUを介さずに検出結果を受け取る場合についての可能性も検討してみてください。
入力画像の処理からCPUが解放されることの意義は大きかったりします。

さらに、[Ultra96ボード](https://japan.xilinx.com/products/boards-and-kits/1-vad4rl.html)の登場によっても、FPGAボードでの開発がさらに加速されるでしょう。
FPGA実装について言えば、[NNgen](https://github.com/NNgen/nngen#nngen)の可能性も選択肢に加わってきました。
NNgen の概要がわかる記事（高前田さんによる）
- [NNgen と FPGA で作るニューラルネットワーク・アクセラレータ (1)](https://www.acri.c.titech.ac.jp/wordpress/archives/5576)
- [NNgen と FPGA で作るニューラルネットワーク・アクセラレータ (2)](https://www.acri.c.titech.ac.jp/wordpress/archives/6834)
- [NNgen と FPGA で作るニューラルネットワーク・アクセラレータ (3)](https://www.acri.c.titech.ac.jp/wordpress/archives/7369NN)
- [NNgenとFPGAで作るニューラルネットワーク・アクセラレータ (4)](https://www.acri.c.titech.ac.jp/wordpress/archives/8008)
- [NNgenとFPGAで作るニューラルネットワーク・アクセラレータ (5)](https://www.acri.c.titech.ac.jp/wordpress/archives/8086)
----

画像処理・画像認識を高速化しようとすると、どのようなアプローチをすべきなのか迷うことがあります。

そこで役に立つ資料を見つけたので、参考までにメモを残します。
並列化処理については、それを専門とする方々が多数いらっしゃるので
このメモを読むよりは、それらの方の作成された資料を直接読むことをお勧めします。

デスクトップで電源とファンの心配をしなくていい分野と
組み込みでバッテリーの心配がいる分野では、最適な選択が異なります。

また、そのシステムを何台作るのかによっても最適な選択は異なります。
FPGAとASICでは生産台数が相当な規模にならない限り、ASICを新たに起こす利点はありません。しかも、FPGAの側が有利な台数は、FPGA技術の進展により増加しています。
しかし、システムに必要なものを既存のASICを流用するときには、少ない台数でも追加コストは発生しません。
 ですから、画像処理を含むCPUは、どんどん少数のASICに集中している傾向があります。かつては、デジタルカメラメーカ自体が画像処理のASICを開発していることが多かったようですが、今では、専業の画像処理のASICメーカーのチップや、携帯電話用のチップを利用していることが増えているようです。

CPU, GPU, FPGA, ASICをめぐる争いは、使用するアルゴリズムの組み合わせとともに、状況が著しく変わります。
最新の状況を、検索して見てください。

slideshare [「マルチコアを用いた画像処理」](http://www.slideshare.net/FukushimaNorishige/ssii-33751285)
slideshare [２値化CNN on FPGAでGPUとガチンコバトル（公開版）](https://www.slideshare.net/HirokiNakahara1/cnn-on-fpgagpu)

私見：
・mapに分類されるパターンでは、[SIMD命令](https://ja.wikipedia.org/wiki/SIMD)が効果的らしい。演算とデータ転送では、データ転送のコストが大きいために、GPUで処理したときにCPUのSIMDや[OpenMP](https://ja.wikipedia.org/wiki/OpenMP)などに打ち勝つことができない。
　LSI設計でCPUに独自の演算を追加できるような場合は、SIMD演算を追加するようなものと見ることができるのだろう。
　
・画像認識でもフレーム間で独立な処理ならば、マルチコアで別スレッドで動作させることで並列性を向上させる方法がある。
（ただし、１つのフレームに対して既にマルチコアによる並列性を利用している場合には、効果は望めない）

・インテルのCPUの場合、[「インテル Parallel Studio」](https://www.xlsoft.com/jp/products/intel/studio_xe/index.html)を使ってみることを考慮すべきらしい。

・FPGAが利用できる[Zynqデバイス](https://japan.xilinx.com/products/silicon-devices/soc/zynq-7000.html)でも、ARMコアのNEON命令による高速化は考えるべきらしい。

・専用回路をFPGAで自作するのは、それによる高速化が10倍程度の場合にはFPGA化しないことも考えたほうがよいらしい。アルゴリズム自体の改善で、同程度の改善が数年で達成する場合があるからだそうだ。（どこかの記事でそういっていた。）
・汎用的な線形代数の高速化の場合だと、そのアーキテクチャ用の適切なライブラリを選ぶことだけを考えるべきであって、自分で改良をできる場合はそう多くないはずだ。

追記：
　ソフトウェアによる画像処理の記述には、改良の余地がかなりあることを次の記事から知りました。

- qiita [Halide入門とOpenCVとの比較](http://qiita.com/fukushima1981/items/193c4ae03b2ea3b4f98e)

>例えば入力画像を二乗して20を足すコードを書くとします．
計算の結果，
OpenCVは73 ms
Halideは9.8ms
と圧倒的な違いがありました．


ここに記載していたメモは、次の記事にいたしました。
[高速な画像処理用言語 Halideについて調査中](http://qiita.com/nonbiri15/items/ceea30829333a1e1cc13)


OpenCV のcv::Mat型に関して言えば、各画素に対するアクセスを含むコードを書いている場合、
次の記事を参考にしてはいかがでしょうか？
qiita [cv::Mat::forEachを使った高速なピクセル操作](http://qiita.com/dandelion1124/items/94542d8cd7b3455e82a0)

また、[画像処理で2重ループをなるべく書くな](http://qiita.com/nonbiri15/items/9d4296b3a79fad38bf76) も考量に入れておいてください。　2重ループを何も考えずに、書いているとOpenCVのライブラリ関数の方が格段に速い結果になっていることがあるのも視野においてください。


**参考資料**
qiita [「雨の中、Cを書かずにPythonで並列計算をする人間がいてもいい。自由とはそういうものだ。」](http://qiita.com/yubais/items/5a9d91fe03fe715b21d0)


コンパイラによる最適化

- [「自動並列化でマルチコアの性能を引き出す　並列処理に強い開発ツール「インテル コンパイラー」」](
http://www.atmarkit.co.jp/ad/intel/compiler1006/)

- [「NEONを使用してZynq-7000 AP SoCでのソフトウェア性能を向上」](
http://japan.xilinx.com/support/documentation/application_notes/j_xapp1206-boost-sw-performance-zynq7soc-w-neon.pdf)

- [「インテル謹製の数値演算ライブラリ「MKL」を使ってプログラムを高速化」](
http://osdn.jp/projects/hpc-parallel/wiki/%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AB%E8%AC%B9%E8%A3%BD%E3%81%AE%E6%95%B0%E5%80%A4%E6%BC%94%E7%AE%97%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%80%8CMKL%E3%80%8D%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E9%AB%98%E9%80%9F%E5%8C%96_all)


書籍 [「構造化並列プログラミング―効率良い計算を行うためのパターン 」](https://www.amazon.co.jp/%E6%A7%8B%E9%80%A0%E5%8C%96%E4%B8%A6%E5%88%97%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0_%E5%8A%B9%E7%8E%87%E8%89%AF%E3%81%84%E8%A8%88%E7%AE%97%E3%82%92%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%81%AE%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-%E3%83%9E%E3%82%A4%E3%82%B1%E3%83%AB%E3%83%BB%E3%83%9E%E3%83%83%E3%82%AF%E3%83%BC%E3%83%AB/dp/4877833056/ref=sr_1_1?ie=UTF8&qid=1478616133&sr=8-1&keywords=%E4%B8%A6%E5%88%97%E5%8C%96%E8%A8%88%E7%AE%97)



FPGAによる最適化

- qiita [SDAccel：FPGAを利用したFPGA経験不要なアクセラレーション](http://qiita.com/wstone/items/0f675b6547eed72fba92)


-  [マイクロソフトはどうやってBingをFPGAで実装したか](http://qiita.com/kazunori279/items/6f517648e8a408254a50)

- qiita [ニューラルネットワークをFPGA実機で動かした](http://qiita.com/kotauchisunsun/items/ab1804aeab7d9d222c72)

- [FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(ZYBOとDE0-Nano-SoCのデュアルブートに対応)](http://qiita.com/ikwzm/items/eee398f2f848dc5fe938)

- qiita [Stereo Matching をハードウェアで加速する](http://qiita.com/nonbiri15/items/6e9149ac237ec23bb657)

- qiita [OpenCL Mandelbrot Demo on Alteraを読む&試す](http://qiita.com/miyox/items/befa3c115088e8038a25)

- qiita [（ 調査 ）Deep Learning 計算を、FPGA 専用アクセレレータ 上で 高速 に 行う試み ～ Deep Learning 計算基盤 を、GPU から 自社製FPGA に 切り替える動き が 加速中。今後はさらに、Neuromorphic chip がやってくる？](http://qiita.com/HirofumiYashima/items/ad9c850511e1059b3c9f)

[インテル® FPGA マシーンラーニング (機械学習)](https://www.altera.co.jp/solutions/technology/machine-learning/overview.html)
[Intel® Distribution of Caffe](https://github.com/intel/caffe)
Alteraのロゴはもう使われていなく、Intelのロゴが使われています。

> インテルは、FPGA の専門家になる必要なく、推論 (スコアリング) 用 CNN トポロジーを超低消費電力で実装する FPGA アーキテクチャーの柔軟性を利用するために、Deep Learning Accelerator FPGA IP (Intellectual Property) を提供しています。FPGA にロードされたこの IP により、DAAL (Data Analytics Acceleration Library) に入っている Intel® Caffe、および Intel® MKL-DNN を利用して、FPGA を再コンパイルせずに ALexNet や GoogleNet のようなトポロジーを構築できます。

- qiita [FPGAでDeep Learningしてみる - きゅうりを選果する](http://qiita.com/ykshr/items/08147098516a45203761)

- qiita [マルチコア、GPGPU、FPGA](http://qiita.com/Vengineer/items/6e86eb0ce77d32126bd5)

- qiita [Xillybus and ROS on Ubuntu14.04 on Zybo Part 4 : Zybo上における設定~ROSのインストール](http://qiita.com/kazuyamashi/items/4489a84452821746f9a4)

- qiita [そろそろプログラマーもFPGAを触ってみよう！](http://qiita.com/kazunori279/items/a9e97a4463cab7dda8b9)

- qiita [FPGAでDeep Learningしてみる](http://qiita.com/ykshr/items/6c8cff881a200a781dc3)
>PYNQ
Xilinxのオープンソースプロジェクトで、XilinxのZynqに実装したFPGAロジックを、Pythonから簡単に使えるようにするためのもののようです。

[FPGA上のDeep Learning の一例](http://www.dsforum.jp/whatsnew/2017/07/03/dsfinterview_dmp/)

[AIやビッグデータの進化を加速させる半導体はGPUか? FPGAか? CPUか?](http://news.mynavi.jp/articles/2017/01/02/2017_ai/)


slideShare [Polyphony: Python ではじめる FPGA](https://www.slideshare.net/ryos36/polyphony-python-fpga)
slideShare [PythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう](https://www.slideshare.net/shtaxxx/2015-10-11-pycon-pycoram)

slideShare [研究者のための Python による FPGA 入門](https://www.slideshare.net/ryos36/python-fpga-74774921)

------------------
追記　以下の記事が参考になりそうだ。

- [Interface 2016年12月号目次
IoT＆スパコン！ラズパイ時代の自分用コンピュータ作り](http://www.kumikomi.net/interface/contents/201612.php)
- [2017年4月号 目次 から物理学実験用の小型スパコンの世界　今どき浮動小数点演算ワールド
中里 直人，台坂 博，石川 正](http://www.kumikomi.net/interface/contents/201704.php)

- [Interface2017年5月号 目次 から　FPU付きFPGAで広がる高性能コンピューティングの世界 小型津波スパコン大解剖 佐野 健太郎 ](http://www.kumikomi.net/interface/contents/201705.php)


[「FPGAマガジン No15
手のひらFPGAボードですぐに試せる!
車に農業！？AI時代のチャレンジ！リアルタイム動画認識」](http://www.kumikomi.net/fpga/contents/0015.php)

![FPGA_magazine](http://shop.cqpub.co.jp/hanbai/books/MIF/MIFZ201611l.jpg)

FPGAは、10年前に比べると格段に使いやすくなっている。

- 評価ボードの値段が画期的に安くなった
- ARMコアが標準的に入っていて、ARMコアとFPGA間のバスも標準化されている。
- OpenCVの代表的な関数について、既にFPGA用のデザインが用意されている。
- RTLを書かずに、C/C++のインタフェースからOpenCV互換のIPを利用できるようになっている。

[LSI/FPGAの回路アーキテクチャ設計法【オンデマンド版】](https://shop.cqpub.co.jp/detail/2611/)
画像処理（あるいは、画像認識とそれをふまえた画像処理）を設計するための作業について、実例を用いながら紹介している貴重な情報源である。
顔検出処理を色情報にもとづく単純なアルゴリズムでの例とすることで、書籍として共有できるものにしている。
回路設計において、並列性を重視する度合いによって、回路構成のしかたが変わってくる。


### FPGA関連の記事があるサイト
http://monoist.atmarkit.co.jp/mn/subtop/features/fpga/
http://fpga.cqpub.co.jp/


[PYNQについて調査中](http://qiita.com/nonbiri15/items/dcb228f564c5d4944ea6)



### OpenCL関連

OpenCLをＧＰＵで顔検出に使った動画
[OpenCL face detection](https://www.youtube.com/watch?v=aTErTqOIkss)


### 参考イベント
これらのイベントでは、発表資料のスライドを公開しているものがあります。それらをたどると参考になる記事を見つけることができます。
- [FPGAエクストリーム・コンピューティング](https://fpgax.connpass.com/)
- [高位合成友の会](https://hls.connpass.com/)

- CQ出版主催セミナー [実習・ARMコア内蔵FPGAのハードウェア開発入門～Xilinx社Zynq編](http://seminar.cqpub.co.jp/ccm/es14-0154)