読んで理解して、活用しなくては
[「マルチコアを用いた画像処理」SSII 2014 チュートリアル]
(http://www.slideshare.net/FukushimaNorishige/ssii-33751285?related=2)
[「構造化並列プログラミング
-効率良い計算を行うためのパターン-」マイケル・マックール (著), 菅原 清文 (翻訳)]
(http://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%E2%80%95%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)
データ並列
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に反映できるのかどうかが気になります。