私は、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) は役に立ちません。別の関数に入れてみます...