このようなループがある場合
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()をインラインにすることですが、関数は非常に大きく、幸いにも並列で実行できる他の関数も呼び出します。