0

私は多数の整数のセットを持っており、それらをポインターのベクトルに入れています。競合状態を引き起こすことなく、これらの整数のセットを並行して更新できる必要があります。すなわち。私はOpenMPの「parallelfor」構造を使用しています。

共有リソースを処理するために、OpenMPは便利な「アトミックディレクティブ」を提供します。これにより、ロックを使用せずに特定のメモリの競合状態を回避できます。「アトミックディレクティブ」を使用して整数セットが同時に更新されないようにすると便利ですが、これが可能かどうかはわかりません。

基本的に、次のコードが競合状態につながる可能性があるかどうかを知りたいです

vector< set<int>* > membershipDirectory(numSets, new set<int>);

#pragma omp for schedule(guided,expandChunksize)
for(int i=0; i<100; i++)
  {
    set<int>* sp = membershipDirectory[rand()];
    #pragma omp atomic
      sp->insert(45);
  }

私のアプリケーションでは、任意のスレッドが任意のインデックスにアクセスする可能性があるため、インデックスにランダムな整数を使用していることに注意してください(大きなアプリケーションにはランダムな要素がありますが、詳細に立ち入る必要はありません)。

整数をインクリメントするためのこれと同様の例を見てきましたが、私の場合のようにコンテナーへのポインターを操作するときに機能するかどうかはわかりません。

4

3 に答える 3

2

調べてみると、openmp.orgでOpenMPCおよびC++ APIのマニュアルを見つけました。セクション2.6.4で、アトミック構造の制限について説明しています。

基本的に、アトミックディレクティブは次の演算子でのみ使用できます。

単項:++、-(接頭辞と接尾辞)

バイナリ:+、-、*、/、^、&、|、<<、>>

だから私はただロックを使います!

(状況によってはクリティカルセクションが望ましい場合もありますが、私の場合、ロックは共有リソースへのきめ細かいアクセスを提供し、クリティカルセクションよりも優れたパフォーマンスをもたらします。)

于 2010-04-22T12:09:06.410 に答える
1

式が関数呼び出しである場合は、アトミックを使用しないでください。単純な式にのみ適用されます(組み込み:power、平方根の可能性があります)。

代わりに、クリティカルセクション(名前付きまたはデフォルト)を使用してください

于 2010-04-25T17:47:04.090 に答える
0

あなたのコードは明確ではありません。membershipDirectory[5]が実際にはmembershipDirectory[i]であると仮定すると、アトミックディレクティブは必要ありません。たとえば、2つのプロセッサの場合、OpenMPは2つのスレッドを生成します。1つはi = 0〜49を処理し、もう1つは50〜99の間隔を処理します。この場合、membershipDirectory[i]を保護する必要はありません。合計など、ループインデックスに依存しない一般的なリソースを保護するには、アトミックディレクティブが必要です。

于 2010-04-22T11:40:22.053 に答える