コンパイラで OpenMP を有効にすると、 std ::fill、std::transformなどの STL アルゴリズム/コンテナ操作を並行して実行できますか? 現在、MSVC 2008 を使用しています。または、それを同時に行う他の方法がありますか?
ありがとう。
コンパイラで OpenMP を有効にすると、 std ::fill、std::transformなどの STL アルゴリズム/コンテナ操作を並行して実行できますか? 現在、MSVC 2008 を使用しています。または、それを同時に行う他の方法がありますか?
ありがとう。
並列STLタイプライブラリを使用することを目的としたプロジェクトは多数あります。
並列セーフであることを保証するstd::transform
にstd::fill
は、独自のバージョンを作成する必要があります。これらの関数の一般的な実装は、順次実行用です。
簡単な例を挙げてみましょうstd::fill
。並列に変換する際には、関数を相互依存関係なしに非同期で実行できる小さな関数に分割する必要があります。たとえば、1 つのサブ機能が前半を満たし、2 番目のサブ機能が後半を埋めることができます。親関数は、2 つのサブ関数を委任 (フォーク) し、それらが完了する (結合) まで待機する必要があります。
より大きな問題は、並列実行の実行時の準備に費やされたオーバーヘッドが、実際の並列実行時間を補えるかどうかです。大きな塗りつぶしは、小さな塗りつぶしより正当性が高くなります。
おそらく、関数を分割するのではなく、これらの関数のスレッド セーフ バージョンを作成し、スレッドを並列で実行することをお勧めします。
複数のスレッドに分割する前に、まずデータを参照して最適化を試みます。Web でData Oriented Designを検索します。記事では、実行を最適化してプロセッサのキャッシュ ミスを減らすことで、プログラムの実行速度が大幅に向上することが示されています。
Visual Studio 2010 は、並列で実行される STL スタイルのアルゴリズムを含む並列パターン ライブラリを提供します。もちろん、これは Microsoft 固有の VS2010 (およびそれ以上) です。
現在の C++ 標準では、スレッドについてまったく言及していないため、いいえ。これは、 STLスレッド セーフに関する多かれ少なかれ独自のステートメントです。
の 1 つの一般的な (GCC) 実装を見てくださいstd::fill
。
template<typename _ForwardIter, typename _Tp>
void
fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __value)
{
for ( ; __first != __last; ++__first)
*__first = __value;
}
並列実行が安全でないことは明らかです (特殊な実装が必要になります)。
そして、これがParallel Modeの GCC 拡張です。