0

私は、OpenMP を使用してシングル プロデューサー マルチ コンシューマー モデルを実装しようとしています (より適切なブースト スレッドを使用することもできます)。

これはかなり単純で、スレッド対応のキュー タイプを使用する私のコードです。

bool producer_finished = false;

#pragma omp parallel default( none ) shared( producer_finished, buffer, datagen )
{
    #pragma omp sections
    {
        #pragma omp section
        { // single producer

            while( datagen ) {
                DType data = datagen.next()
                buffer.push( data );
            }

            producer_finished = true;
            #pragma omp flush( producer_finished )

        } // end omp section

        #pragma omp section
        {
            #pragma omp for schedule( static, 1 )
            for ( int i = 0; i < omp_get_max_threads() - 1; ++i ) {

                while ( ! producer_finished ) {

                    #pragma omp critical( buffer )
                    {
                        DType = buffer.pop();
                    }

                    processData( data );
                    outputData( data );

                    #pragma omp flush( producer_finished )
                }
            } // end omp for
        } // end omp section

    } //end omp sections
} // end omp parallel

ここでの問題は、プロデューサーが起動してバッファーがいっぱいになるまでデータをプッシュするのに、コンシューマーが起動しないことです。「for pragma」の周りのセクションを削除すると、同じことが起こります。私のアプローチのどこが悪いのか分かりますか?

コンパイル中に次の警告も表示されます。

warning: work-sharing region may not be closely nested inside of work-sharing, critical, ordered or master region

セクション内の for ループのネストを参照します。この場合、どのように行うのが正しいでしょうか?

ご意見をいただきありがとうございます。

編集:この関連する質問を見つけたところ、 set_omp_nested(1) は役に立ちません。別の関数に入れてみます...

4

4 に答える 4

0

OpenMPは並列計算用に設計されており、汎用のスレッドライブラリではありません。したがって、OpenMPでプロデューサー/コンシューマーループを実行しようとすると、間違ったツールであるIMHOが使用されます。

于 2011-11-30T08:33:25.810 に答える
0

あなたの OpenMP コードは構文的に間違っています。これは、コンパイラがあなたに言っていることです。並列セクションと並列ループはどちらもワークシェアリング構造であり、互いに直接入れ子にすることはできません。for コンストラクトの周りに内部並列ループを追加して、ネストされた並列処理を使用できます。これは、明示的に有効にする必要がある場合があります。

さらに、flush ディレクティブの使用は十分ではありません。また、作業中のデータを同期する必要があります。リストなしでフラッシュを使用することを強くお勧めします。

OpenMP 関連の質問を www.openmp.org のフォーラムに投稿して、OpenMP の専門家と話をすることもできます。

よろしく、ディーター

于 2012-02-07T09:02:24.577 に答える
0

OpenMP V3.0 仕様の付録 A.21flushの正しい使用例を参照してください。

于 2012-02-07T09:13:17.740 に答える