2017-09-23 17 views
0

nキューがあるとします。私もnスレッドを持っています。各スレッドは、いずれかのnキューにエンキューすることができます。各キューがいつでも最大1つのスレッドによってアクセスされていることを確認するにはどうすればよいですか?n個の異なるOpenMPクリティカルセクションをどのように扱いますか?

ただ1つのキューだった場合は、エンキュー操作をcriticalセクションに入れます。ただし、すべてのエンキュー操作をcriticalセクションに入れると、スレッド7はキュー9に書き込まれているため、スレッド4はキュー6に書き込むことができないため、パフォーマンスが低下します。

私はすべてのエンキュー操作を並列化できるかどうか、それぞれのキュー自体が最大で1つのスレッドに書き込まれるかどうかは疑問でした。 (。基本的に、各キューインデックスのロックを取得します。しかし、私は、OpenMPで慣用的にこれをしたい)

+0

「これはパフォーマンスが悪くなります」 - 競合が頻繁に発生する場合のみ。ポインタをキューに押し込むだけの場合は、そのような短時間のうちにロックが掛かっている可能性はどれくらいありますか? –

+0

@ MartinsJamesもちろん、競合があるときだけ。そして、あなたは正しいです、ポインタ(私の場合はint)を押すだけで大したことはありません。しかし、すべてのキューのグローバルロックが遅くなる可能性はまだあります。インデックスベースのロックは、少なくともオール・キュー・ロックと同じくらい速く、正しいでしょうか? –

+0

おそらく..インデックス作成にロックを必要としない場合。たぶんあなたは単純なブール型の 'inUse'配列を使うことができ、時折間違ったキューイングをすることもできます(lke pool/snookerと聞こえます:)。 –

答えて

0

をオブジェクトの静的なセットへのアクセスを保護するための簡単なケースでは、OpenMPのcriticalのセクションでは、名前を付けることができます。

#pragma omp critical(somename) 

クリティカルセクションsomenameにスレッドがあると、別のスレッドが同時にクリティカルセクションothernameに入るのを防ぐことはできません。無名クリティカルセクションは特殊なケースに過ぎず、不特定のシステム固有の名前でセクションを指定するのと同じです。

他のすべてについては、シンプルでネスト可能なロックがあります。詳細については、セクション3.3 のロックルーチンOpenMP specification)を参照してください。

関連する問題