LoginSignup
1
3

More than 5 years have passed since last update.

画像処理・画像認識を並列計算で高速化させるための資料

Last updated at Posted at 2015-12-03

読んで理解して、活用しなくては

「マルチコアを用いた画像処理」SSII 2014 チュートリアル

「構造化並列プログラミング
-効率良い計算を行うためのパターン-」マイケル・マックール (著), 菅原 清文 (翻訳)

データ並列
map
「すべての要素を並列化し、要素ごとに計算する。各要素に依存性無し」
pixelごとの処理、色空間の変換、ガンマ特性の変換、閾値処理などが該当する。
大きさが同じ行列の加算
#pragma omp parallel for
上記スライドp.51

 SIMDが実行できる場合だとSIMDを実行すること。
 「画像を色変換して、画像間の差分をとって、閾値処理をする」という例はmapというカテゴリに属すようだ。
 このような処理の段数が深い場合には、メモリ転送を生じてもGPUによる並列化の効果は、SIMDを上回ることもありそう。
 

stencil
上記スライドp.40、p.55~p.59 4重ループの平滑化フィルタ
OpenMP による並列化
私見:FPGAを利用すると内側の2つのループが、回路として展開されてscanという動作になりそうだ。

reduction
p.53 ~ p.54
OpenMP による並列化
# pragma omp parallel for reduction(+:rec)

私見:機械学習の分野でMapReduceという枠組みがあるが、map処理とreduce処理とがある。これと対応してそうだ。

MapReduce の特徴は、MapとReduceの各ステップで並列処理が可能なことである。それぞれのMap処理は、他のMap処理と完全独立であり、理論的に全て並列実行することができる(実際には、データソースやCPUの数により制限がかかる)。続くReduceステップでは、Mapステップでの処理結果がキー毎にまとめられてReduce処理に送られることになるが、これも同様に並列処理が可能である。(ウィキペディアからの引用)
MapReduce

scan

プロセス並列
Fork-join
 マルチコアの階層での並列化であって、GPUのような並列化ではない。
 C++もC++11になってスレッドが強化されている。
pipe-line
という典型例に着目すべきであるようだ。

「アセンブラ画像処理プログラミング -SIMDによる処理の高速化」

追記:
 dandelion1124さんによる記事 cv::Mat::forEachを使った高速なピクセル操作

パフォーマンスのグラフ
上記のmapに相当する処理で高速化が期待できそうだ。マルチコアでのmap演算が速くなるようだ。

この内容がcv2.pydに反映できるのかどうかが気になります。

1
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3