2016-08-27 5 views
1

内部に並列領域を持つようにしようとしていますが、次に並列のための並列呼び出しがあります。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つの既存のループの間のメインパラレル領域内に置くと、それは問題にならないかもしれません。問題は(少なくとも私にとっては)関数呼び出しを使用して並列実行する必要があることです。

答えて

2

これは問題のタイピングを助けました。 明白な答えは、forループの並列セクションを呼び出す既存から既存のスレッドを使用することになり#pragma parallel for #pragma forへの機能 にプラグマを変更することであり、それは完璧に動作します。

関連する問題