内部に並列領域を持つようにしようとしていますが、次に並列のための並列呼び出しがあります。OpenMPは並列のループから並列化された関数を呼び出す
簡略化した例では、私は既存のスレッドではなく3つの分離した並列領域を持つよりも、calculateAccelerationForAllに飛び越えると、そこにループのために実行したいということで、ここでこの
#pragma parallel
{
#pragma omp for
for(int i=0;i<1000;i++)
position[i]+=velocity[i];
calculateAccelerationForAll();
#pragma omp for
for(int i=0;i<1000;i++)
velocity[i]+=acceleration[i];
}
calculateAccelerationForAll()
{
#pragma parallel omp for
for(int i=0;i<1000;i++)
for(int j=0;j<1000;j++)
acceleration[i]=docalculation
}
問題である可能性があります。最初のスレッドだけが実際に関数を呼び出し、関数呼び出しの後にバリアを持つことを保証できますが、そのスレッドだけが関数内のforループを実行します。
最初のループと最後のループを自分自身のパラレル領域に置き、関数呼び出しを独自の領域にすることは、非効率的で、偽であるという私の前提が正しい場合、どのようにして、1つのリージョンスレッドをすべての方法で通過させることができますか。
私はちょうど関数の内容を取り出して、それを2つの既存のループの間のメインパラレル領域内に置くと、それは問題にならないかもしれません。問題は(少なくとも私にとっては)関数呼び出しを使用して並列実行する必要があることです。