2

次の構造を持つコードがあります。

#pragma omp parallel for
for( i = 0; i < N; i++ )
{
    .....
    index = get_index(...);
    array[index] = ...;
    .....
}

現在、 の値はindexスレッドごとに一意です (異なるスレッドで重複することはありません) が、もちろん OpenMP はこれを推測できず、同期オブジェクトを使用して にアクセスしていると思いますarray

同期オブジェクトを使用しないようにopenmpに依頼し、値が異なるスレッドで一意でarrayあることに頼るにはどうすればよいですか。indexプライベート リストに入れようとしましarrayたが、セグメンテーション エラーが発生しました。

4

1 に答える 1

5

Openmp は、バリアまたは暗黙のバリアで同期します。たとえばfor、nowait 句が指定されていない限り、コンストラクトの最後に暗黙のバリアがあります。

しかし、openmp はアクセスによってメモリを同期しません。代わりに、スレッドごとに共有メモリ ブロックとプライベート メモリ ブロックのメカニズムを提供します。

あなたの場合、index非公開にする必要があります。そうしないと、各スレッドが同じメモリ位置に書き込みを行うため、アクセス時に競合状態が発生しますarray[index]

デモンストレーションのために、動作を明示的に設定iしますが、デフォルトではプライベートであり、デフォルトでarrayは共有されています。

#pragma omp parallel for private(i, index) shared(array)
for( i = 0; i < N; i++ )
{
    .....
    index = get_index(...);
    array[index] = ...;
    .....
}
于 2012-05-16T08:45:07.670 に答える