2016-09-13 3 views
1

OpenMPの共有変数からの読み取りでは、すべてのスレッドにその変数のコピーがあるため、競合状態は発生しません。 しかし、共有変数が(例えばコンテナへの)ポインタである場合、すべてのスレッドはポインタのコピーを取得するだけです。ポインタからの読み取り中のOpenMP競合状態

ポインタが(自分のコンテナ)を指している場所から読み取った場合、競合条項が存在する可能性がありますか、またはOpenMPがどうにか処理しますか?

スレッド間のポインタではなく、コンテナ自体のコピーを共有する方がよいでしょうか?

+1

OpenMPスレッドに_shared_ではなく_private_変数のインスタンスがあります。共有変数を使用すると、正しく使用しないと競合が発生する可能性があります。 – ilotXXI

答えて

1

変数から読み込むだけで競合条件が生成されることはありません。変数が共有されているかどうかは関係ありません。競合状態を生成するには、同時に2つ以上のスレッドで変数の同じインスタンスを変更する必要があります。

次に、スレッドが特定の変数の読み取りと変更を行っていると仮定すると、この変数を共有すると、すべてのスレッドが同じインスタンスを共有するため、引き続き競合状態になります。最初の段落で@ilotXXIが指摘したように私的に言うと思っていたと思います。

ポインタの民営化に関する疑問について、そのポインタの2つ以上のインスタンスが同じデータを指し、それらを変更すると競合状態になります(各スレッドはポインタの非公開バージョンを持ちますがプライベートではありませんデータのバージョン)。

データ共有句を別のものに変更すると、アプリケーションの動作が変更されることに注意してください。したがって、一般に、アプリケーションを並列化する場合、最初に行う必要があるのは、アプリケーションが実行しているデータアクセスの種類を分析することです。そのことを知ったら、アプリケーションの元の動作を維持するために使用する必要がある場合、どのデータ共有句とどの同期構造を考える必要があります。

関連する問題