2017-10-12 12 views
1

プログラム実行がomp sectionsディレクティブに達すると、次のomp sectionディレクティブで定義されたプログラムセグメントが、使用可能なスレッド間で並列実行用に分散されます。元のスレッドは、 `omp section`ディレクティブによって定義されたプログラムセグメントの1つを実行しますか?

  • は元のスレッド、omp sectionsに到達する前に実行され、すなわち糸、omp sectionディレクティブによって定義されたプログラムセグメントの1つを実行するスレッドのいずれか?

  • omp sectionディレクティブで定義されたプログラムセグメントの実行がすべて終了した後、元のスレッドだけが存在して実行を継続しますか?

次の例では、どのスレッドが元のスレッドですか、1または2かほかのですか?

#pragma omp sections 
{ 

    # pragma omp section 
    { printf("thread 1 here\n"); } 
    # pragma omp section 
    { printf("thread 2 here\n"); } 

} 

ありがとうございます。

答えて

1

コード例は不完全です。純粋にそれを完成させましょう。

int main() 
{ 
    #pragma omp sections 
    { 
     #pragma omp section 
     { printf("thread 1 here\n"); } 
     # pragma omp section 
     {printf("thread 2 here\n"); } 
    } 
} 

ここには1つのスレッドしかありません。 #pragma omp sectionだけでは、追加のスレッドは作成されません。

あなたは、並列構文内sectionsを使用します。

#pragma omp parallel 
{ 
    #pragma omp sections 

parallel構築物は、スレッドのチームを作成し

#pragma omp parallel sections 

に相当します。全てのスレッドは、sections構成になるまで実行され、各ブロックはチーム内のスレッドの1つによって実行される。section

のスレッドが並列セクションを出/入力について話す:

  • はい、parallel構造物を検出したスレッドは、チームのランニングの一部となります。実際にはスレッド番号0のマスタースレッドになります。チームがsections構成になっている場合は、セクションの実行に参加します。ただし、すべてのセクションを実行することは保証されていません。すべてのスレッドに対して十分なセクションが存在しない場合もあります。チーム内のセクションからスレッドへのスケジューリング方法は実装定義です。

  • はい、parallel領域の終了後、元のスレッドは外側コードの実行を継続する(唯一の)スレッドです。

+0

ありがとうございました。現在のスレッドのスレッドID番号はどうやって取得できますか? – Ben

+0

'omp_get_thread_num()' – Zulan

+0

マスターがセクションの1つを実行するように "促す"ために、ある種のOpenMPノブがありますか?マスターが並列ブロックの最後で結合を実行するので、ワーカースレッドが各セクションを実行できるように、マスタースレッドは中断され(自発的にCPUスライスを放棄する)、 – igaz

関連する問題