【関東GPGPU勉強会#2】OpenCVのOpenCL実装oclMat

10,977 views
10,522 views

Published on

【関東GPGPU勉強会#2】OpenCVのOpenCL実装oclMat

Published in: Technology
0 Comments
17 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
10,977
On SlideShare
0
From Embeds
0
Number of Embeds
241
Actions
Shares
0
Downloads
0
Comments
0
Likes
17
Embeds 0
No embeds

No notes for slide

【関東GPGPU勉強会#2】OpenCVのOpenCL実装oclMat

  1. 1. OpenCVのOpenCL実装oclMat関東GPGPU勉強会#22013/6/1@dandelion1124
  2. 2. 自己紹介(1/3)Twitter:@dandelion1124• 学生時代は画像処理の研究に従事。• 現在は都内勤務エンジニア。• 研究室向けOpenCVのTipsサイトを作っていたらOpenCV関連の書籍を書くことになり今に至る。blog: http://www.atinfinity.info/blog/wiki: http://www.atinfinity.info/wiki/
  3. 3. 自己紹介(2/3)• 書籍執筆– OpenCVプログラミングブック• 和訳本の原稿チェック– 詳解 OpenCV– 実践 コンピュータビジョン• 雑誌関連– 日経ソフトウェア(2011年3月号)特集記事担当
  4. 4. 自己紹介(3/3)• メインで活動している勉強会– 関東コンピュータビジョン勉強会 #cvsaisentanhttp://sites.google.com/site/cvsaisentan/
  5. 5. というわけでステマはここまで
  6. 6. 本日のアジェンダ• OpenCLとは?• OpenCVとは?• OpenCVのデータ構造• oclMatとは?• oclMatを使うには• oclMatの内部処理• oclMat性能評価本日のメイン本題に入る前の前準備
  7. 7. OpenCLとは?• Open Computing Languageの略称。• ヘテロジーニアスな環境でプロセッサ(GPU, DSP,Cell/B.E., CPU )の違いを吸収した共通API等を用いて並列処理を記述するためのフレームワーク。Apple社にて提案後、Khronos Groupが仕様策定。• C99ベースの「OpenCL C言語」でデバイス向けのプログラム開発を行うことができる。http://www.khronos.org/opencl/
  8. 8. OpenCVとは?Intelが開発・公開したOpen SourceのComputer Visionライブラリ。現在はWillow Garageが開発を行っている。• 公式サポートOS– Windows/Linux/Mac OS/Android/iOS• 公式サポート言語– C/C++/Python/Java※有志による非公式ラッパーは以下のサイトにまとめています。http://www.atinfinity.info/wiki/index.php?OpenCV%2FOpenCV%20wrapper%20list
  9. 9. OpenCVのデータ構造OpenCVで画像を格納するために使うデータ構造はおおまかに以下の3つ。• cv::Mat 画像データの入れ物(CPU版)• gpu::GpuMat 画像データの入れ物(CUDA版)• ocl::oclMat 画像データの入れ物(OpenCL版)今日のお話はこの部分がメイン
  10. 10. oclMatとは?• OpenCLデバイス上で画像処理を行うために用いるデータ構造• cv::Matとほぼ同じようにコーディングできる→学習コストが少なくて済む• CUDA版のgpu::GpuMatも基本的に使い方が同じ※GpuMatの方がoclMatより対応関数が多い
  11. 11. 本題に入る前にちょっと脱線します
  12. 12. oclMatをtwitterで検索すると・・・
  13. 13. oclMatをtwitterで検索すると・・・
  14. 14. oclMatをtwitterで検索すると・・・自分しかいない\(^o^)/布教しよう!(今回の主目的)
  15. 15. oclMatをtwitterで検索すると・・・1週間前は凄い悲壮感がというか色々ひどい・・・
  16. 16. というわけで本題に戻ります
  17. 17. oclMatを使うには■CMakeCMakeで以下の手順を行うことでソリューションファイルが生成される①「WITH_OPENCL」にチェックを入れる②「Configure」ボタンを押す③「Generate」ボタンを押す■OpenCL環境導入PCにOpenCLのSDKをインストールしておく必要がある詳細なAPIは以下を参照。http://docs.opencv.org/modules/ocl/doc/ocl.html
  18. 18. サンプルコード(グレースケール化)#include <opencv2/core/utility.hpp>#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui.hpp>#include <opencv2/ocl/ocl.hpp>using namespace cv;int main(int argc, char** argv){std::vector<ocl::Info> oclinfo;int devnums =ocl::getDevice(oclinfo, ocl::CVCL_DEVICE_TYPE_GPU);Mat src = imread("lena.jpg", IMREAD_UNCHANGED);Mat dst;ocl::oclMat oclsrc(src), ocldst;ocl::cvtColor(oclsrc, ocldst, COLOR_BGR2GRAY);ocldst.download(dst);imwrite(“output.jpg", dst);return 0;}グレースケール化①ヘッダ読み込み②oclMat初期化③画像読み込み④oclMat処理⑤画像書き込み
  19. 19. サンプルコード(グレースケール化)#include <opencv2/core/utility.hpp>#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui.hpp>#include <opencv2/ocl/ocl.hpp>using namespace cv;int main(int argc, char** argv){std::vector<ocl::Info> oclinfo;int devnums =ocl::getDevice(oclinfo, ocl::CVCL_DEVICE_TYPE_GPU);Mat src = imread("lena.jpg", IMREAD_UNCHANGED);Mat dst;ocl::oclMat oclsrc(src), ocldst;ocl::cvtColor(oclsrc, ocldst, COLOR_BGR2GRAY);ocldst.download(dst);imwrite(“output.jpg", dst);return 0;}②oclMat初期化③画像読み込み④oclMat処理⑤画像書き込みoclMatを使うにはocl.hppのインクルードが必要①ヘッダ読み込みOpenCVのヘッダをインクルード
  20. 20. サンプルコード(グレースケール化)#include <opencv2/core/utility.hpp>#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui.hpp>#include <opencv2/ocl/ocl.hpp>using namespace cv;int main(int argc, char** argv){std::vector<ocl::Info> oclinfo;int devnums =ocl::getDevice(oclinfo, ocl::CVCL_DEVICE_TYPE_GPU);Mat src = imread("lena.jpg", IMREAD_UNCHANGED);Mat dst;ocl::oclMat oclsrc(src), ocldst;ocl::cvtColor(oclsrc, ocldst, COLOR_BGR2GRAY);ocldst.download(dst);imwrite(“output.jpg", dst);return 0;}③画像読み込み④oclMat処理⑤画像書き込みOpenCLデバイスリストの取得(※ここではGPUのみを取得)以下のような指定も可能。CVCL_DEVICE_TYPE_ALLOpenCLデバイスを全て取得CVCL_DEVICE_TYPE_CPUCPUのみを取得etc...注意点oclMatを使う前にocl::getDeviceを必ず呼ばないといけない点に注意。②oclMat初期化
  21. 21. サンプルコード(グレースケール化)#include <opencv2/core/utility.hpp>#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui.hpp>#include <opencv2/ocl/ocl.hpp>using namespace cv;int main(int argc, char** argv){std::vector<ocl::Info> oclinfo;int devnums =ocl::getDevice(oclinfo, ocl::CVCL_DEVICE_TYPE_GPU);Mat src = imread("lena.jpg", IMREAD_UNCHANGED);Mat dst;ocl::oclMat oclsrc(src), ocldst;ocl::cvtColor(oclsrc, ocldst, COLOR_BGR2GRAY);ocldst.download(dst);imwrite(“output.jpg", dst);return 0;}④oclMat処理⑤画像書き込み画像ファイルを読みこんでcv::Mat形式で格納する。③画像読み込み
  22. 22. サンプルコード(グレースケール化)#include <opencv2/core/utility.hpp>#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui.hpp>#include <opencv2/ocl/ocl.hpp>using namespace cv;int main(int argc, char** argv){std::vector<ocl::Info> oclinfo;int devnums =ocl::getDevice(oclinfo, ocl::CVCL_DEVICE_TYPE_GPU);Mat src = imread("lena.jpg", IMREAD_UNCHANGED);Mat dst;ocl::oclMat oclsrc(src), ocldst;ocl::cvtColor(oclsrc, ocldst, COLOR_BGR2GRAY);ocldst.download(dst);imwrite(“output.jpg", dst);return 0;}⑤画像書き込みoclMatのコンストラクタを生成して、cv::Matの画像データをOpenCLデバイスに転送する④oclMat処理oclMatの画像データに対してグレースケール化を行うグレースケールにした結果をホスト側に転送する
  23. 23. サンプルコード(グレースケール化)#include <opencv2/core/utility.hpp>#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui.hpp>#include <opencv2/ocl/ocl.hpp>using namespace cv;int main(int argc, char** argv){std::vector<ocl::Info> oclinfo;int devnums =ocl::getDevice(oclinfo, ocl::CVCL_DEVICE_TYPE_GPU);Mat src = imread("lena.jpg", IMREAD_UNCHANGED);Mat dst;ocl::oclMat oclsrc(src), ocldst;ocl::cvtColor(oclsrc, ocldst, COLOR_BGR2GRAY);ocldst.download(dst);imwrite(“output.jpg", dst);return 0;}⑤画像書き込みグレースケール化した画像をファイルに書き込む
  24. 24. ねっ、簡単でしょう?
  25. 25. 使う分には簡単なのはわかったけど
  26. 26. 内部でどんな処理が動いてるんだろう?
  27. 27. oclMatの内部処理(初回実行)OpenCLデバイスカーネルバイナリ(Map形式でキャッシュ)OpenCLランタイムライブラリoclMatの画像処理関数カーネルソース①カーネル読み込み②カーネルコンパイル③キャッシュ④カーネル実行
  28. 28. oclMatの内部処理(2回目以降)OpenCLデバイスカーネルバイナリ(Map形式でキャッシュ)OpenCLランタイムライブラリoclMatの画像処理関数①キャッシュから必要なカーネルを探す③カーネル実行②カーネル読み込みカーネルコンパイルが不要!
  29. 29. oclMatの内部処理(補足)• OpenCL 1.1以上でないと使えない• 2.4.5時点では同一環境に複数OpenCLデバイスがあっても同時に使えない→Titan 2枚刺しフルに使えない\(^o^)/• oclMatはbuffer objectとして処理される( image objectではない)http://docs.opencv.org/modules/ocl/doc/introduction.html
  30. 30. oclMatの内部処理(まとめ)• 初回実行時はカーネルコンパイルが走る(のでその分時間がかかる)• 2回目以降はキャッシュから引っ張れるのでカーネルコンパイルは不要• 良く使うカーネルは事前に(主にプログラムのはじめ)にダミーとして呼んでおくと良い
  31. 31. oclMat性能評価■計測方法対応するMat、oclMatの関数を5回処理した処理時間を計測。 oclMatはダミー処理を事前に呼んでおいて計測。※ホスト、デバイスの転送時間は含まない。
  32. 32. oclMat性能評価■計測関数1. cvtColor2. threshold3. absdiff4. Laplacian5. matchTemplate6. bilateralFilter■入力画像1~4、6:512x512[pixel]5:探索画像:748x576[pixel]テンプレート画像: 52x93[pixel]
  33. 33. Intel OpenCL編
  34. 34. oclMat性能評価(Intel OpenCL編)■計測環境CPU:Intel Core i7-3930K@3.20GHz (6コア)メモリ:32.0GBGPU:NVIDIA GeForce GTX 680コンパイラ:Visual Studio 2010 Professional■OpenCLIntel OpenCL SDK 3.0
  35. 35. 00.511.522.53cvtColor threshold absdiff Laplacian処理時間[ms]計測結果(1)MatoclMatoclMat性能評価(Intel OpenCL編)OpenCL(CPU版)
  36. 36. oclMat性能評価(Intel OpenCL編)01000200030004000500060007000matchTemplate bilateralFilter処理時間[ms]計測結果(2)MatocMatOpenCL(CPU版)
  37. 37. oclMat性能評価(Intel OpenCL編)00.511.522.53cvtColor threshold absdiff Laplacian処理時間[ms]計測結果(1)MatoclMatOpenCL(GPU版)
  38. 38. oclMat性能評価(Intel OpenCL編)01000200030004000500060007000matchTemplate bilateralFilter処理時間[ms]計測結果(2)MatoclMatOpenCL(GPU版)
  39. 39. GpuMat編(おまけ)
  40. 40. GpuMat性能評価■計測環境CPU:Intel Core i7-3930K@3.20GHz (6コア)メモリ:32.0GBGPU:NVIDIA GeForce GTX 680コンパイラ:Visual Studio 2010 Professional■CUDANVIDIA CUDA5
  41. 41. GpuMat性能評価00.511.522.53cvtColor threshold absdiff Laplacian処理時間[ms]計測結果(1)MatGpuMat
  42. 42. GpuMat性能評価01000200030004000500060007000matchTemplate bilateralFilter処理時間[ms]計測結果(2)MatGpuMat
  43. 43. 性能比較
  44. 44. 性能比較00.511.522.53cvtColor threshold absdiff Laplacian処理時間[ms]計測結果(1)MatoclMat(CPU)oclMat(GPU)gpuMat
  45. 45. 性能比較01000200030004000500060007000matchTemplate bilateralFilter処理時間[ms]計測結果(2)MatoclMat(CPU)oclMat(GPU)gpuMat
  46. 46. Titan+NVIDIA OpenCL編(おまけ)
  47. 47. oclMat性能評価(Titan編)■計測環境CPU:Intel Xeon CPU E5-2630L@2GHz(/proc/cpuinfoによると24コア?)メモリ:32.0GBGPU:NVIDIA GeForce GTX Titanコンパイラ:gcc 4.4.7■OpenCLNVIDIA OpenCL(CUDA 5)
  48. 48. oclMat性能評価(Titan編)00.511.522.53cvtColor threshold absdiff Laplacian処理時間[ms]計測結果(1)MatoclMat
  49. 49. oclMat性能評価(Titan編)010002000300040005000600070008000900010000matchTemplate bilateralFilter処理時間[ms]計測結果(2)MatocMat
  50. 50. 性能比較(発表からの追加分)
  51. 51. oclMat性能評価(追加評価)■計測関数1. cvtColor2. threshold3. absdiff4. Laplacian5. matchTemplate6. bilateralFilter■入力画像1~4、6:2560x2560[pixel]5:探索画像:3840x2880[pixel]テンプレート画像: 260x465[pixel]最初の計測から画像サイズを5倍にしてみるとMatとの速度差に違いが出る?
  52. 52. oclMat性能評価(Intel OpenCL編)OpenCL(CPU版)051015202530354045cvtColor threshold absdiff Laplacian処理時間[ms]計測結果(1)MatoclMat
  53. 53. oclMat性能評価(Intel OpenCL編)OpenCL(CPU版)050000100000150000200000250000matchTemplate bilateralFilter処理時間[ms]計測結果(2)MatocMat
  54. 54. oclMat性能評価(Intel OpenCL編)OpenCL(GPU版)051015202530354045cvtColor threshold absdiff Laplacian処理時間[ms]計測結果(1)MatoclMat
  55. 55. oclMat性能評価(Intel OpenCL編)OpenCL(GPU版)050000100000150000200000250000matchTemplate bilateralFilter処理時間[ms]計測結果(2)MatocMat
  56. 56. まとめ• 自力でゴリゴリOpenCLカーネルを書かなくてもお手軽にメニーコアの恩恵が得られる• 既存のMatで書いていた処理をoclMatに置き換えるだけで簡単に高速化できる可能性がある(関数や画像サイズはMatより遅くなるものもあるので事前に確認した方が良い)• GPUで思ったより速くならないのはGPU向けに特化したチューニング実装が足りないせい?(ただし、最近oclMat関連のコミットが活発なので今後改善される可能性あり)
  57. 57. おわり

×