OpenCVのmake時、OpenMPのpragma omp が -Wunknown となって並列処出来ない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
まーさ
記事: 20
登録日時: 10年前

OpenCVのmake時、OpenMPのpragma omp が -Wunknown となって並列処出来ない

#1

投稿記事 by まーさ » 10年前

OpenCV で OpenMPを使った並列処理がうまく出来ず、困っています。

OpenCVは以下の環境でビルドしています。

CentOS 6.4 x64
OpenCV 2.4.9

OpenCVは、以下のサイトから 2.4.9 for Linux/Mac をダウンロードして解凍したものを使っています。
http://opencv.org/

手順は以下です。

コード:

#cd <opencv2.4.9の展開ディレクトリ>

#mkdir release

#cd release

#cmake -DBUILD_DOCS=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=RELEASE -DWITH_TBB=ON -DTBB_LIB_DIR=`echo $TBBROOT`/lib -DTBB_INCLUDE_DIR=`echo $TBBROOT`/include -DWITH_GTK=ON -DWITH_OPENGL=ON -DWITH_QT=OFF -DINSTALL_C_EXAMPLES=ON -DWITH_OPENCL=OFF -DWITH_CUDA=OFF -DWITH_OPENNI=ON -DWITH_UNICAP=OFF -DWITH_V4L=OFF -DWITH_XINE=OFF -DHAVE_OPENMP=ON  ../

#make ← ★今回失敗するところ

#make install
OPENMPについては、 -DHAVE_OPENMP=ON を指定し、
CMakeの結果には Use OpenMP YES と表示されることを確認しました。

続いて make を実行すると、以下の警告が表示されます。
警告: ignoring #pragma omp parallel [-Wunknown-pragmas]
pragma omp を指定しているコード片を抜き出したものが以下です。
※変数宣言など十分に記載していませんが、ご容赦ください。

コード:

int count = 0;
#pragma omp parallel num_threads(params.cores)
{
    KNNUniqueResultSet<DistanceType> resultSet(knn);
    #pragma omp for schedule(static) reduction(+:count)
        for (int i = 0; i < (int)queries.rows; i++) {
            resultSet.clear();
            findNeighbors(resultSet, queries[i], params);
            size_t n = std::min(resultSet.size(), knn);
            resultSet.copy(indices[i], dists[i], n, params.sorted);
            indices_to_ids(indices[i], indices[i], n);
            count += n;
        }
}
どのようにすれば OpenMP が有効になるかわからず困っております。
ご教授いただけますと嬉しいです。よろしくお願いします。


まーさ
記事: 20
登録日時: 10年前

Re: OpenCVのmake時、OpenMPのpragma omp が -Wunknown となって並列処出来ない

#3

投稿記事 by まーさ » 10年前

h2so5 さん、ありがとうございます。

解決いたしました。

原因は、TBB と OpenMP を同時に有効にして OpenCV をビルドすることが出来ないことでした。
TBBをはずすため、cmakeのオプションを以下のように変更しました。

コード:


#cmake -DBUILD_DOCS=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=RELEASE -DWITH_GTK=ON -DWITH_OPENGL=ON -DWITH_QT=OFF -DINSTALL_C_EXAMPLES=ON -DWITH_OPENCL=OFF -DWITH_CUDA=OFF -DWITH_OPENNI=ON -DWITH_UNICAP=OFF -DWITH_V4L=OFF -DWITH_XINE=OFF -DHAVE_OPENMP=ON -DWITH_OPENMP=ON  ../
 
続いて make で無事に並列化実行用のモジュールをビルド出来ました。

TBB と OpenMPを同時に使用出来ないことは、以下のファイルを見てわかりました。
<opencv展開ディレクトリ>/cmake/OpenCVFindLibsPerf.cmake
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る