0

このようなループがある場合

int main (){
....

for (i=0; i< N; i++)
{
  /*Do some calculations*/
  for (j=0; j<M; j++)
  {
    /*Do more calculations*/
    compute_x( some pointers as args );
  }
  compute_y(some pointer as args);
}
...

return value;
}

and 

void compute_x( some pointers as args )
{
  /* some calculations*/
  for (h=0; h<COUNT; h++)
  {
   ...
  }
}
}

そしてcompute_y()は似ています。

私の質問は、OpenMPディレクティブを使用してメインの外部ループを並列化するかどうかです。

#pragma omp parallel for schedule (runtime) private ( ...)
for (i=0; i< N; i++)
{
 ...
}

関数の振る舞いはどうなるのでしょうcompute_x()compute_y()?私が理解している限り、これらは各スレッドによって実行されるため、forループインcompute_x()は各スレッドによって0からCOUNTまで実行されます。

そうだとすれば、forループの関数でも作業負荷を共有するために何ができるでしょうかcompute_x()(データの依存関係がないと仮定します)。私の最初の推測は、関数compute_x()とcompute_y()をインラインにすることですが、関数は非常に大きく、幸いにも並列で実行できる他の関数も呼び出します。

4

2 に答える 2

1

some pointers as argsスレッドごとに異なる ( ごとに異なる)場合i、またはconst修飾子を使用している場合、つまりポインターによって内容を変更できるスレッドがない場合、予期しないことは何も起こりません。

悪い点は、異なるスレッドが同じポインターを共有し、それらが指すデータを同時に読み書きすると、予期しない結果になる可能性があることです。

于 2012-04-12T16:16:36.377 に答える