QA@IT

c++でのマルチスレッドについて

3929 PV

OpenCVと仮想COMポートを使う上で複数のスレッドが必要となったのですが、マルチスレッドを使う上で様々なライブラリがあってどれを使うべきなのか悩んでます。
現在検討しているのはOpneMPとmsのデフォルトのマルチスレッドの3つです。
IDEはVS2010Professionalです。
別に自分が挙げてる3つ以外でも大丈夫です。よろしくお願いします。

回答

開発環境がVisual Studio 2010のC++であれば開発環境にMicrosoft製のPPL(Parallel Pattern Library)が標準搭載されていますから、これを使えばmsdnを情報源にそれほど困らずにマルチスレッドのソフトウェア開発を進められるでしょう。

http://msdn.microsoft.com/ja-jp/library/dd492418.aspx

また、検討対象に入っていませんが、intel TBB(Threading Build Block)もPPLと同様(というか高機能)な定番のライブラリーでCodeZineにεπιさんの日本語の解説記事などもあるので取っ付き易いかもしれません。

http://threadingbuildingblocks.org/
http://codezine.jp/article/detail/5186

他の選択肢としてBoostを用いれば移植性も向上しますし、boostjpの日本語の逆引き記事などを参考にすれば基本的な部分で弄せずに済みます。

https://sites.google.com/site/boostjp/tips/thread

また、今回は開発環境がVS2010という点が決定であれば検討の対象外かもしれませんが、VS2012(※これはまだRC段階です)、GCC 4.7、clang 3.1などC++最新規格であるC++11が使用可能な環境を選択できる場合はC++言語の標準ライブラリーに<thread>や<mutex>などマルチスレッド用のライブラリーが使用可能です。<thread>標準ライブラリー等についての概要はcpprefjpからも参考情報が得られます。

http://www.microsoft.com/visualstudio/11/ja-jp/downloads
https://sites.google.com/site/cpprefjp/reference/thread

OpenMPは多数のデータ群の計算処理を簡単に並列化する様なデータ並列の用途では検討しても良いかもしれませんが、単一の計算機でIO処理(仮想COMポートとの事から推測)と他のCVやAR等のCG処理(OpenCVとの事から推測)をOSのネイティブスレッドレベルで分離する用途には適さないかもしれません。

要求される移植性、要求に対して必要となるライブラリー側の比較的高度な機能の対応、連携が必要な処理系など考慮して選ぶと良いと思います。PPLでもTBBでもBoostでもC++11標準ライブラリーでも基本的なタスク並列やmutexによるロックなどで困る事はありません。

編集 履歴 (2)
  • 丁寧な解説ありがとうございます。
    OpenCVでの画像処理の演算部のマルチスレッド化と仮想COMポートのマルチスレッド化に別々のライブラリを使用することで高速化は計れるのでしょうか?
    環境に関しましてはVS2010でほぼ確定です。
    -
  • 一般論として1つのプログラムの内部であれば同じライブラリーを使った方がマシンコードのサイズも実行速度も最適化の恩恵が大きくなります。 -
  • また、OpenCV 2.1以降であればOpenCVの一部機能はintel TBBにも対応しているので、当初候補には無いもののintel TBBを有力な候補として検討してみるのも良いと思います。
    (参考: http://opencv.jp/opencv2-x-tips/opencv_performance_with_tbb
    -
  • いろんな本を見ているとOpenMPかintel TBBが多いようなのでintel TBBを使おうと思います。ありがとうございました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。