n
キューがあるとします。私もn
スレッドを持っています。各スレッドは、いずれかのn
キューにエンキューすることができます。各キューがいつでも最大1つのスレッドによってアクセスされていることを確認するにはどうすればよいですか?n個の異なるOpenMPクリティカルセクションをどのように扱いますか?
ただ1つのキューだった場合は、エンキュー操作をcritical
セクションに入れます。ただし、すべてのエンキュー操作をcritical
セクションに入れると、スレッド7はキュー9に書き込まれているため、スレッド4はキュー6に書き込むことができないため、パフォーマンスが低下します。
私はすべてのエンキュー操作を並列化できるかどうか、それぞれのキュー自体が最大で1つのスレッドに書き込まれるかどうかは疑問でした。 (。基本的に、各キューインデックスのロックを取得します。しかし、私は、OpenMPで慣用的にこれをしたい)
「これはパフォーマンスが悪くなります」 - 競合が頻繁に発生する場合のみ。ポインタをキューに押し込むだけの場合は、そのような短時間のうちにロックが掛かっている可能性はどれくらいありますか? –
@ MartinsJamesもちろん、競合があるときだけ。そして、あなたは正しいです、ポインタ(私の場合はint)を押すだけで大したことはありません。しかし、すべてのキューのグローバルロックが遅くなる可能性はまだあります。インデックスベースのロックは、少なくともオール・キュー・ロックと同じくらい速く、正しいでしょうか? –
おそらく..インデックス作成にロックを必要としない場合。たぶんあなたは単純なブール型の 'inUse'配列を使うことができ、時折間違ったキューイングをすることもできます(lke pool/snookerと聞こえます:)。 –