/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はリストイテレータでどのように動作しますか?どんな答え
このコードの基本的な概念は、ループ全体をすべてのスレッドで実行することですが、ループの内部コードは単一スレッドのみで実行することです。これは基本的には機能しますが、これが正しいかどうかは、表示されない多くのものによって決まります。役に立つ回答を得るには、[mcve]を提供する必要があります。 – Zulan
とにかく何が起こると思いますか?パラレルプログラミングの基本的な前提は、並列化が機能するためにデータ構造が適切でなければならないということです。並行してリストアイテムを処理することはできますが、リストを歩くことは本質的にシングルスレッドです。 N番目の項目を見つけるのにO(N)_sequential_ステップが必要ですが、ショートカットはありません。 – MSalters
ライブラリがリストイテレータ(2.0でサポートされていない)を使用しているので、Visual StudioがopenMPのバージョン2.0を実装しているという事実が問題であるかどうかを尋ねただけです。 openmpサポートなしでライブラリをコンパイルしようとしましたが、結果はすべての実行時に安定しています – user1839352