2016-12-19 10 views
0

/openmpを使用したVC++コンパイラの動作を知りたい。私はcmakefilelistに付属のサードパーティのライブラリ(OpenMVG)を使用しています。だから私はそれをコンパイルするためにVisual Studioソリューションを生成しました。 CMakeはコンパイラのopenmp機能を認識し、VSのeverithingコンパイルは問題ありません。 しかし、それは実行になると、私はプログラムを実行するたびに異なる結果を得る。同時に2つのインスタンスを同時に実行すると、結果はさらに悪化します。 だから私は、ソースコード内の少しを見て、私はウェブ上で検索し、Visual StudioだけのOpenMP 2.0をサポートしていることと思われるのOpenMPがVisual Studio C++ 2015およびopenMP

#pragma omp parallel 
for (Views::const_iterator iter = sfm_data.GetViews().begin(); iter != sfm_data.GetViews().end() && bContinue; ++iter) 
{ 
    pragma omp single nowait 
    { 
    ... process ... 
    } 
} 

リストとマップイテレータで使用されていることが分かりました。それでリストイテレータをサポートしていますか?これが問題になりますか? openMP 2.0はリストイテレータでどのように動作しますか?どんな答え

+0

このコードの基本的な概念は、ループ全体をすべてのスレッドで実行することですが、ループの内部コードは単一スレッドのみで実行することです。これは基本的には機能しますが、これが正しいかどうかは、表示されない多くのものによって決まります。役に立つ回答を得るには、[mcve]を提供する必要があります。 – Zulan

+0

とにかく何が起こると思いますか?パラレルプログラミングの基本的な前提は、並列化が機能するためにデータ構造が適切でなければならないということです。並行してリストアイテムを処理することはできますが、リストを歩くことは本質的にシングルスレッドです。 N番目の項目を見つけるのにO(N)_sequential_ステップが必要ですが、ショートカットはありません。 – MSalters

+0

ライブラリがリストイテレータ(2.0でサポートされていない)を使用しているので、Visual StudioがopenMPのバージョン2.0を実装しているという事実が問題であるかどうかを尋ねただけです。 openmpサポートなしでライブラリをコンパイルしようとしましたが、結果はすべての実行時に安定しています – user1839352

答えて

-1

コードFO事前に

おかげで、あなたは、おそらくそれがないと思う何をしません。これはスレッドのセットを作成し、それぞれのスレッドは同じループを実行します。

Visual StudioのOpenMPは実際にはC++をサポートしていないことに注意してください.Cの方言として扱います。特に、/openmpはイテレータをサポートしていません。これはC++のみです。 Cループのみをサポートしています。

また、OpenMPはC++ 98以前の古い標準でもあります。 C++ 11以降、C++にはネイティブのスレッド機能があります。

+0

OpenMPは引き続き「定期的に」更新されています。アトミックスサポートは2013年に追加され、その意味では「古い」ものではありません。 VSはOpenMP 2.0以上のバージョンをサポートすることを拒否しました。最後の行では、OpenMPとC++のスレッドが「同等」であることも示唆されていますが、OpenMPの設定とスレッドプールの自動作成との違いは大きく異なります。 –

+1

OpenMPは3.0以降(2008!)のC++ランダムアクセスイテレータをサポートしています。 OpenMPの最新バージョンは2015年11月から、2016年11月の新しいドラフトがあります。唯一の問題は16歳のバージョンを実装しているVisual Studioです。 – Zulan

+0

@ Zulan:公平な点は、私がVisual Studioで実装されたOpenMPについて話していたことを明確にしました。 「古い標準」については、それが好きなら、それを「初期の標準」と呼ぶこともできます。それは長い間、C++が2011年までに欠けていた機能を提供しました。 – MSalters

関連する問題